[master] a963289 Shave a layer of indirection of the points for session attributes

Poul-Henning Kamp phk at FreeBSD.org
Fri Feb 12 11:33:13 CET 2016


commit a9632894a87bedb7b5fff051d9ca23dfb26b8c0f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Feb 11 11:02:38 2016 +0000

    Shave a layer of indirection of the points for session attributes

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index f8722e6..cffc68d 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -967,11 +967,13 @@ void SES_RxReInit(struct http_conn *htc);
 enum htc_status_e SES_RxStuff(struct http_conn *, htc_complete_f *,
     double *t1, double *t2, double ti, double tn);
 
-#define SESS_ATTR(UP, low, typ, len)				\
-	int SES_Get_##low(const struct sess *sp, typ *dst);	\
-	void SES_Reserve_##low(struct sess *sp, typ *dst);
+#define SESS_ATTR(UP, low, typ, len)					\
+	int SES_Set_##low(const struct sess *sp, const typ *src);	\
+	int SES_Get_##low(const struct sess *sp, typ **dst);		\
+	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);
 
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 2363b25..5f960b4 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -443,8 +443,8 @@ static void
 pan_sess(struct vsb *vsb, const struct sess *sp)
 {
 	const char *stp;
-	char *ci;
-	char *cp;
+	const char *ci;
+	const char *cp;
 
 	VSB_printf(vsb, "sp = %p {\n", sp);
 	if (pan_already(vsb, sp))
@@ -452,8 +452,8 @@ pan_sess(struct vsb *vsb, const struct sess *sp)
 	VSB_indent(vsb, 2);
 	VSB_printf(vsb, "fd = %d, vxid = %u\n",
 	    sp->fd, VXID(sp->vxid));
-	AZ(SES_Get_client_ip(sp, &ci));
-	AZ(SES_Get_client_port(sp, &cp));
+	ci = SES_Get_String_Attr(sp, SA_CLIENT_IP);
+	cp = SES_Get_String_Attr(sp, SA_CLIENT_PORT);
 	VSB_printf(vsb, "client = %s %s,\n", ci, cp);
 	switch (sp->sess_step) {
 #define SESS_STEP(l, u) case S_STP_##u: stp = "S_STP_" #u; break;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 92404b9..a0c0efd 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -643,7 +643,7 @@ cnt_recv(struct worker *wrk, struct req *req)
 	unsigned recv_handling;
 	struct SHA256Context sha256ctx;
 	const char *xff;
-	char *ci, *cp;
+	const char *ci, *cp;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -655,8 +655,8 @@ cnt_recv(struct worker *wrk, struct req *req)
 	AZ(isnan(req->t_prev));
 	AZ(isnan(req->t_req));
 
-	AZ(SES_Get_client_ip(req->sp, &ci));
-	AZ(SES_Get_client_port(req->sp, &cp));
+	ci = SES_Get_String_Attr(req->sp, SA_CLIENT_IP);
+	cp = SES_Get_String_Attr(req->sp, SA_CLIENT_PORT);
 	VSLb(req->vsl, SLT_ReqStart, "%s %s", ci, cp);
 
 	http_VSL_log(req->http);
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 92ddc07..7999e06 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -66,6 +66,23 @@ ses_get_attr(const struct sess *sp, enum sess_attr a, void **dst)
 	}
 }
 
+static int
+ses_set_attr(const struct sess *sp, enum sess_attr a, const void *src, int sz)
+{
+	void *dst;
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	assert(a < SA_LAST);
+	AN(src);
+	assert(sz > 0);
+
+	if (sp->sattr[a] == 0xffff)
+		return (-1);
+	dst = sp->ws->s + sp->sattr[a];
+	AN(dst);
+	memcpy(dst, src, sz);
+	return (0);
+}
+
 static void
 ses_reserve_attr(struct sess *sp, enum sess_attr a, void **dst, int sz)
 {
@@ -86,16 +103,22 @@ ses_reserve_attr(struct sess *sp, enum sess_attr a, void **dst, int sz)
 
 #define SESS_ATTR(UP, low, typ, len)					\
 	int								\
-	SES_Get_##low(const struct sess *sp, typ *dst)			\
+	SES_Set_##low(const struct sess *sp, const typ *src)		\
+	{								\
+		return (ses_set_attr(sp, SA_##UP, src, len));		\
+	}								\
+									\
+	int								\
+	SES_Get_##low(const struct sess *sp, typ **dst)			\
 	{								\
 		return (ses_get_attr(sp, SA_##UP, (void**)dst));	\
 	}								\
 									\
 	void								\
-	SES_Reserve_##low(struct sess *sp, typ *dst)			\
+	SES_Reserve_##low(struct sess *sp, typ **dst)			\
 	{								\
 		assert(len >= 0);					\
-		ses_reserve_attr(sp, SA_##UP, (void*)dst, len);		\
+		ses_reserve_attr(sp, SA_##UP, (void**)dst, len);	\
 	}
 
 #include "tbl/sess_attr.h"
diff --git a/include/tbl/sess_attr.h b/include/tbl/sess_attr.h
index 69b5890..7355b28 100644
--- a/include/tbl/sess_attr.h
+++ b/include/tbl/sess_attr.h
@@ -32,14 +32,14 @@
 
 /*lint -save -e525 -e539 */
 
-//        upper           lower         type		   len
-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)
-SESS_ATTR(XPORT_PRIV1,	  xport_priv1,	void *,		   -1)
-SESS_ATTR(XPORT_PRIV2,	  xport_priv2,	uintptr_t,	   -1)
+//        upper           lower         type			len
+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)
+SESS_ATTR(XPORT_PRIV1,	  xport_priv1,	void *,			sizeof(void*))
+SESS_ATTR(XPORT_PRIV2,	  xport_priv2,	uintptr_t,		sizeof(uintptr_t))
 
 /*lint -restore */



More information about the varnish-commit mailing list