Commit d75ca3b4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Sequeze struct sess storage harder. When we add the extra

{local|remote}.ip for PROXY support, we do not want to waste 16 bytes
extra on pointers, so put all the {client|server|local|remote}.ip into
a single array -- which is unfortunately complicated by the opaqueness
of struct vsa.
parent d9a7f69a
......@@ -775,8 +775,15 @@ struct sess {
struct ws ws[1];
struct suckaddr *remote_addr;
struct suckaddr *local_addr;
/*
* This gets quite involved, but we don't want to waste space
* on up to 4 pointers of 8 bytes in struct sess.
*/
char *addrs;
#define sess_remote_addr(sp) \
((struct suckaddr *)(void*)((sp)->addrs))
#define sess_local_addr(sp) \
((struct suckaddr *)(void*)((sp)->addrs + vsa_suckaddr_len))
/* formatted ascii client address */
char *client_addr_str;
......
......@@ -352,7 +352,7 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
wa->acceptsock = -1;
retval = wa->acceptlsock->name;
assert(wa->acceptaddrlen <= vsa_suckaddr_len);
AN(VSA_Build(sp->remote_addr, &wa->acceptaddr, wa->acceptaddrlen));
AN(VSA_Build(sess_remote_addr(sp), &wa->acceptaddr, wa->acceptaddrlen));
vca_pace_good();
wrk->stats.sess_conn++;
WS_Release(wrk->aws, 0);
......
......@@ -112,8 +112,7 @@ ses_new(struct sesspool *pp)
p = (void*)PRNDUP(p);
assert(p < e);
WS_Init(sp->ws, "ses", p, e - p);
sp->local_addr = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len);
sp->remote_addr = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len);
sp->addrs = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len * 2);
sp->t_open = NAN;
sp->t_idle = NAN;
......@@ -186,16 +185,18 @@ ses_vsl_socket(struct sess *sp, const char *lsockname)
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
AN(lsockname);
AN(sp->local_addr);
AN(sp->addrs);
sl = sizeof ss;
AZ(getsockname(sp->fd, (void*)&ss, &sl));
AN(VSA_Build(sp->local_addr, &ss, sl));
assert(VSA_Sane(sp->local_addr));
AN(VSA_Build(sess_local_addr(sp), &ss, sl));
assert(VSA_Sane(sess_local_addr(sp)));
VTCP_name(sp->remote_addr, laddr, sizeof laddr, lport, sizeof lport);
VTCP_name(sess_remote_addr(sp), laddr, sizeof laddr,
lport, sizeof lport);
sp->client_addr_str = WS_Copy(sp->ws, laddr, -1);
sp->client_port_str = WS_Copy(sp->ws, lport, -1);
VTCP_name(sp->local_addr, laddr, sizeof laddr, lport, sizeof lport);
VTCP_name(sess_local_addr(sp), laddr, sizeof laddr,
lport, sizeof lport);
VSL(SLT_Begin, sp->vxid, "sess");
VSL(SLT_SessOpen, sp->vxid, "%s %s %s %s %s %.6f %d",
sp->client_addr_str, sp->client_port_str, lsockname, laddr, lport,
......
......@@ -40,6 +40,7 @@
#include "cache_backend.h"
#include "vrt.h"
#include "vrt_obj.h"
#include "vsa.h"
static char vrt_hostname[255] = "";
......@@ -501,7 +502,8 @@ VRT_r_client_ip(const struct vrt_ctx *ctx)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
return (ctx->req->sp->remote_addr);
CHECK_OBJ_NOTNULL(ctx->req->sp, SESS_MAGIC);
return (sess_remote_addr(ctx->req->sp));
}
VCL_IP
......@@ -510,8 +512,8 @@ VRT_r_server_ip(const struct vrt_ctx *ctx)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
AN(ctx->req->sp->local_addr);
return (ctx->req->sp->local_addr);
CHECK_OBJ_NOTNULL(ctx->req->sp, SESS_MAGIC);
return (sess_local_addr(ctx->req->sp));
}
const char*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment