[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