[master] e2da0a8 Move the string formattet client (really: remote) addresses to the new sess_attr facility
Poul-Henning Kamp
phk at FreeBSD.org
Wed Mar 18 11:54:08 CET 2015
commit e2da0a8ca1a3324e585fb38f88db4bcb4875ae2e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Mar 18 10:50:59 2015 +0000
Move the string formattet client (really: remote) addresses to the
new sess_attr facility
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index e68a117..1da6f63 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -674,10 +674,6 @@ struct sess {
uint16_t sattr[SA_LAST];
- /* formatted ascii client address */
- char *client_addr_str;
- char *client_port_str;
-
/* Timestamps, all on TIM_real() timescale */
double t_open; /* fd accepted */
double t_idle; /* fd accepted or resp sent */
@@ -1008,6 +1004,8 @@ void SES_sess_pool_task(struct worker *wrk, void *arg);
void SES_Reserve_##low(struct sess *sp, typ *dst);
#include "tbl/sess_attr.h"
#undef SESS_ATTR
+void SES_Set_String_Attr(struct sess *sp, enum sess_attr a, const char *src);
+const char *SES_Get_String_Attr(const struct sess *sp, enum sess_attr a);
/* cache_shmlog.c */
extern struct VSC_C_main *VSC_C_main;
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 1408d1f..62d8ad1 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -297,6 +297,8 @@ vca_make_session(struct worker *wrk, void *arg)
socklen_t sl;
char laddr[VTCP_ADDRBUFSIZE];
char lport[VTCP_PORTBUFSIZE];
+ char raddr[VTCP_ADDRBUFSIZE];
+ char rport[VTCP_PORTBUFSIZE];
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(wa, arg, WRK_ACCEPT_MAGIC);
@@ -333,11 +335,9 @@ vca_make_session(struct worker *wrk, void *arg)
SES_Reserve_client_addr(sp, &sa);
AN(VSA_Build(sa, &wa->acceptaddr, wa->acceptaddrlen));
- VTCP_name(sa, laddr, sizeof laddr, lport, sizeof lport);
- sp->client_addr_str = WS_Copy(sp->ws, laddr, -1);
- AN(sp->client_addr_str);
- sp->client_port_str = WS_Copy(sp->ws, lport, -1);
- AN(sp->client_port_str);
+ VTCP_name(sa, raddr, sizeof raddr, rport, sizeof rport);
+ SES_Set_String_Attr(sp, SA_CLIENT_IP, raddr);
+ SES_Set_String_Attr(sp, SA_CLIENT_PORT, rport);
sl = sizeof ss;
AZ(getsockname(sp->fd, (void*)&ss, &sl));
@@ -350,8 +350,7 @@ vca_make_session(struct worker *wrk, void *arg)
VSL(SLT_Begin, sp->vxid, "sess 0 HTTP/1");
VSL(SLT_SessOpen, sp->vxid, "%s %s %s %s %s %.6f %d",
- sp->client_addr_str, sp->client_port_str,
- wa->acceptlsock->name, laddr, lport,
+ raddr, rport, wa->acceptlsock->name, laddr, lport,
sp->t_open, sp->fd);
WS_Release(wrk->aws, 0);
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 461bbb9..bdc3ad4 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -430,12 +430,15 @@ static void
pan_sess(const struct sess *sp)
{
const char *stp;
+ char *ci;
+ char *cp;
VSB_printf(pan_vsp, " sp = %p {\n", sp);
VSB_printf(pan_vsp, " fd = %d, vxid = %u,\n",
sp->fd, VXID(sp->vxid));
- VSB_printf(pan_vsp, " client = %s %s,\n", sp->client_addr_str,
- sp->client_port_str);
+ AZ(SES_Get_client_ip(sp, &ci));
+ AZ(SES_Get_client_port(sp, &cp));
+ VSB_printf(pan_vsp, " client = %s %s,\n", ci, cp);
switch (sp->sess_step) {
#define SESS_STEP(l, u) case S_STP_##u: stp = "S_STP_" #u; break;
#include "tbl/steps.h"
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 3ad045f..54c2b5c 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -559,6 +559,7 @@ cnt_recv(struct worker *wrk, struct req *req)
unsigned recv_handling;
struct SHA256Context sha256ctx;
const char *xff;
+ char *ci, *cp;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -570,8 +571,9 @@ cnt_recv(struct worker *wrk, struct req *req)
AZ(isnan(req->t_prev));
AZ(isnan(req->t_req));
- VSLb(req->vsl, SLT_ReqStart, "%s %s",
- req->sp->client_addr_str, req->sp->client_port_str);
+ AZ(SES_Get_client_ip(req->sp, &ci));
+ AZ(SES_Get_client_port(req->sp, &cp));
+ VSLb(req->vsl, SLT_ReqStart, "%s %s", ci, cp);
http_VSL_log(req->http);
@@ -584,10 +586,9 @@ cnt_recv(struct worker *wrk, struct req *req)
if (http_GetHdr(req->http, H_X_Forwarded_For, &xff)) {
http_Unset(req->http, H_X_Forwarded_For);
http_PrintfHeader(req->http, "X-Forwarded-For: %s, %s",
- xff, req->sp->client_addr_str);
+ xff, ci);
} else {
- http_PrintfHeader(req->http, "X-Forwarded-For: %s",
- req->sp->client_addr_str);
+ http_PrintfHeader(req->http, "X-Forwarded-For: %s", ci);
}
}
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 9139c72..6464b02 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -107,12 +107,51 @@ ses_reserve_attr(struct sess *sp, enum sess_attr a, void **dst, int sz)
void \
SES_Reserve_##low(struct sess *sp, typ *dst) \
{ \
+ assert(len >= 0); \
ses_reserve_attr(sp, SA_##UP, (void*)dst, len); \
}
#include "tbl/sess_attr.h"
#undef SESS_ATTR
+void
+SES_Set_String_Attr(struct sess *sp, enum sess_attr a, const char *src)
+{
+ void *q;
+
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ AN(src);
+
+ switch (a) {
+#define SESS_ATTR(UP, low, typ, len) case SA_##UP: assert(len < 0); break;
+#include "tbl/sess_attr.h"
+#undef SESS_ATTR
+ default: WRONG("wrong sess_attr");
+ }
+
+ ses_reserve_attr(sp, a, &q, strlen(src) + 1);
+ strcpy(q, src);
+}
+
+const char *
+SES_Get_String_Attr(const struct sess *sp, enum sess_attr a)
+{
+ void *q;
+
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+
+ switch (a) {
+#define SESS_ATTR(UP, low, typ, len) case SA_##UP: assert(len < 0); break;
+#include "tbl/sess_attr.h"
+#undef SESS_ATTR
+ default: WRONG("wrong sess_attr");
+ }
+
+ if (ses_get_attr(sp, a, &q) < 0)
+ return (NULL);
+ return (q);
+}
+
/*--------------------------------------------------------------------
* Get a new session, preferably by recycling an already ready one
*
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index a9c30ee..f896438 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -238,8 +238,7 @@ VRT_r_client_identity(VRT_CTX)
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
if (ctx->req->client_identity != NULL)
return (ctx->req->client_identity);
- else
- return (ctx->req->sp->client_addr_str);
+ return(SES_Get_String_Attr(ctx->req->sp, SA_CLIENT_IP));
}
void
diff --git a/include/tbl/sess_attr.h b/include/tbl/sess_attr.h
index db68fb6..fcdfec0 100644
--- a/include/tbl/sess_attr.h
+++ b/include/tbl/sess_attr.h
@@ -37,5 +37,7 @@ SESS_ATTR(REMOTE_ADDR, remote_addr, struct suckaddr *, vsa_suckaddr_len)
SESS_ATTR(LOCAL_ADDR, local_addr, struct suckaddr *, vsa_suckaddr_len)
SESS_ATTR(CLIENT_ADDR, client_addr, struct suckaddr *, vsa_suckaddr_len)
SESS_ATTR(SERVER_ADDR, server_addr, struct suckaddr *, vsa_suckaddr_len)
+SESS_ATTR(CLIENT_IP, client_ip, char *, -1)
+SESS_ATTR(CLIENT_PORT, client_port, char *, -1)
/*lint -restore */
More information about the varnish-commit
mailing list