MEDIUM: sample change the prototype of sample-fetches and converters functions

This patch removes the structs "session", "stream" and "proxy" from
the sample-fetches and converters function prototypes.

This permits to remove some weight in the prototype call.
diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h
index 4b64aca..817c98f 100644
--- a/include/proto/proto_http.h
+++ b/include/proto/proto_http.h
@@ -126,11 +126,10 @@
 struct chunk *http_error_message(struct stream *s, int msgnum);
 struct redirect_rule *http_parse_redirect_rule(const char *file, int linenum, struct proxy *curproxy,
                                                const char **args, char **errmsg, int use_fmt);
-int smp_fetch_cookie(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private);
-int
-smp_fetch_base32(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private);
+int smp_fetch_cookie(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private);
+int smp_fetch_base32(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private);
 
 enum http_meth_t find_http_meth(const char *str, const int len);
 
diff --git a/include/types/sample.h b/include/types/sample.h
index 4d932c6..07b12f3 100644
--- a/include/types/sample.h
+++ b/include/types/sample.h
@@ -270,8 +270,7 @@
 /* Descriptor for a sample conversion */
 struct sample_conv {
 	const char *kw;                           /* configuration keyword  */
-	int (*process)(struct stream *stream,
-	               const struct arg *arg_p,
+	int (*process)(const struct arg *arg_p,
 	               struct sample *smp,
 	               void *private);            /* process function */
 	unsigned int arg_mask;                    /* arguments (ARG*()) */
@@ -294,11 +293,8 @@
 /* Descriptor for a sample fetch method */
 struct sample_fetch {
 	const char *kw;                           /* configuration keyword */
-	int (*process)(struct proxy *px,
-	               struct session *sess,
-	               struct stream *strm,
-		       unsigned int opt,          /* fetch options (SMP_OPT_*) */
-		       const struct arg *arg_p,
+	int (*process)(unsigned int opt,          /* fetch options (SMP_OPT_*) */
+	               const struct arg *arg_p,
 	               struct sample *smp,
 	               const char *kw,            /* fetch processing function */
 	               void *private);            /* private value. */
diff --git a/src/backend.c b/src/backend.c
index 17a55d6..08389df 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1486,9 +1486,11 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_nbsrv(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_nbsrv(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
+	struct proxy *px;
+
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
 	px = args->data.prx;
@@ -1509,8 +1511,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_srv_is_up(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_srv_is_up(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	struct server *srv = args->data.srv;
 
@@ -1529,8 +1531,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_connslots(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_connslots(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	struct server *iterator;
 
@@ -1557,25 +1559,25 @@
 
 /* set temp integer to the id of the backend */
 static int
-smp_fetch_be_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_be_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TXN;
 	smp->type = SMP_T_UINT;
-	smp->data.uint = strm->be->uuid;
+	smp->data.uint = smp->strm->be->uuid;
 	return 1;
 }
 
 /* set temp integer to the id of the server */
 static int
-smp_fetch_srv_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_srv_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
-	if (!objt_server(strm->target))
+	if (!objt_server(smp->strm->target))
 		return 0;
 
 	smp->type = SMP_T_UINT;
-	smp->data.uint = objt_server(strm->target)->puid;
+	smp->data.uint = objt_server(smp->strm->target)->puid;
 
 	return 1;
 }
@@ -1585,8 +1587,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_be_sess_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_be_sess_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -1599,8 +1601,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_be_conn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                  const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_be_conn(unsigned int opt, const struct arg *args, struct sample *smp,
+                  const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -1613,8 +1615,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_queue_size(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_queue_size(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -1631,10 +1633,11 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_avg_queue_size(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_avg_queue_size(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	int nbsrv;
+	struct proxy *px;
 
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -1660,8 +1663,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_srv_conn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_srv_conn(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -1674,8 +1677,8 @@
  * undefined behaviour.
  */
 static int
-smp_fetch_srv_sess_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_srv_sess_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
diff --git a/src/compression.c b/src/compression.c
index dc5ad5a..1012148 100644
--- a/src/compression.c
+++ b/src/compression.c
@@ -838,26 +838,26 @@
 
 /* boolean, returns true if compression is used (either gzip or deflate) in the response */
 static int
-smp_fetch_res_comp(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_res_comp(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	smp->type = SMP_T_BOOL;
-	smp->data.uint = (strm->comp_algo != NULL);
+	smp->data.uint = (smp->strm->comp_algo != NULL);
 	return 1;
 }
 
 /* string, returns algo */
 static int
-smp_fetch_res_comp_algo(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_res_comp_algo(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
-	if (!strm->comp_algo)
+	if (!smp->strm->comp_algo)
 		return 0;
 
 	smp->type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.str = strm->comp_algo->cfg_name;
-	smp->data.str.len = strm->comp_algo->cfg_name_len;
+	smp->data.str.str = smp->strm->comp_algo->cfg_name;
+	smp->data.str.len = smp->strm->comp_algo->cfg_name_len;
 	return 1;
 }
 
diff --git a/src/frontend.c b/src/frontend.c
index e8531e9..001b74d 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -159,12 +159,12 @@
 
 /* set temp integer to the id of the frontend */
 static int
-smp_fetch_fe_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_fe_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_SESS;
 	smp->type = SMP_T_UINT;
-	smp->data.uint = sess->fe->uuid;
+	smp->data.uint = smp->sess->fe->uuid;
 	return 1;
 }
 
@@ -173,8 +173,8 @@
  * an undefined behaviour.
  */
 static int
-smp_fetch_fe_sess_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_fe_sess_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -187,8 +187,8 @@
  * an undefined behaviour.
  */
 static int
-smp_fetch_fe_conn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                  const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_fe_conn(unsigned int opt, const struct arg *args, struct sample *smp,
+                  const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
diff --git a/src/hlua.c b/src/hlua.c
index d0eb7f5..d45cac9 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -2773,7 +2773,7 @@
 	smp.px = hsmp->p;
 	smp.sess = hsmp->s->sess;
 	smp.strm = hsmp->s;
-	if (!f->process(hsmp->p, hsmp->s->sess, hsmp->s, 0, args, &smp, f->kw, f->private)) {
+	if (!f->process(0, args, &smp, f->kw, f->private)) {
 		if (hsmp->stringsafe)
 			lua_pushstring(L, "");
 		else
@@ -2894,7 +2894,7 @@
 	smp.px = hsmp->p;
 	smp.sess = hsmp->s->sess;
 	smp.strm = hsmp->s;
-	if (!conv->process(hsmp->s, args, &smp, conv->private)) {
+	if (!conv->process(args, &smp, conv->private)) {
 		if (hsmp->stringsafe)
 			lua_pushstring(L, "");
 		else
@@ -3854,10 +3854,10 @@
  * doesn't allow "yield" functions because the HAProxy engine cannot
  * resume converters.
  */
-static int hlua_sample_conv_wrapper(struct stream *stream, const struct arg *arg_p,
-                                    struct sample *smp, void *private)
+static int hlua_sample_conv_wrapper(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct hlua_function *fcn = (struct hlua_function *)private;
+	struct stream *stream = smp->strm;
 
 	/* In the execution wrappers linked with a stream, the
 	 * Lua context can be not initialized. This behavior
@@ -3955,80 +3955,79 @@
  * doesn't allow "yield" functions because the HAProxy engine cannot
  * resume sample-fetches.
  */
-static int hlua_sample_fetch_wrapper(struct proxy *px, struct session *sess,
-                                     struct stream *s, unsigned int opt,
-                                     const struct arg *arg_p,
+static int hlua_sample_fetch_wrapper(unsigned int opt, const struct arg *arg_p,
                                      struct sample *smp, const char *kw, void *private)
 {
 	struct hlua_function *fcn = (struct hlua_function *)private;
+	struct stream *stream = smp->strm;
 
 	/* In the execution wrappers linked with a stream, the
 	 * Lua context can be not initialized. This behavior
 	 * permits to save performances because a systematic
 	 * Lua initialization cause 5% performances loss.
 	 */
-	if (!s->hlua.T && !hlua_ctx_init(&s->hlua, s->task)) {
-		send_log(s->be, LOG_ERR, "Lua sample-fetch '%s': can't initialize Lua context.", fcn->name);
+	if (!stream->hlua.T && !hlua_ctx_init(&stream->hlua, stream->task)) {
+		send_log(stream->be, LOG_ERR, "Lua sample-fetch '%s': can't initialize Lua context.", fcn->name);
 		if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 			Alert("Lua sample-fetch '%s': can't initialize Lua context.\n", fcn->name);
 		return 0;
 	}
 
 	/* If it is the first run, initialize the data for the call. */
-	if (!HLUA_IS_RUNNING(&s->hlua)) {
+	if (!HLUA_IS_RUNNING(&stream->hlua)) {
 		/* Check stack available size. */
-		if (!lua_checkstack(s->hlua.T, 2)) {
-			send_log(px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
+		if (!lua_checkstack(stream->hlua.T, 2)) {
+			send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
 			if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 				Alert("Lua sample-fetch '%s': full stack.\n", fcn->name);
 			return 0;
 		}
 
 		/* Restore the function in the stack. */
-		lua_rawgeti(s->hlua.T, LUA_REGISTRYINDEX, fcn->function_ref);
+		lua_rawgeti(stream->hlua.T, LUA_REGISTRYINDEX, fcn->function_ref);
 
 		/* push arguments in the stack. */
-		if (!hlua_txn_new(s->hlua.T, s, px)) {
-			send_log(px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
+		if (!hlua_txn_new(stream->hlua.T, stream, smp->px)) {
+			send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
 			if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 				Alert("Lua sample-fetch '%s': full stack.\n", fcn->name);
 			return 0;
 		}
-		s->hlua.nargs = 1;
+		stream->hlua.nargs = 1;
 
 		/* push keywords in the stack. */
 		for (; arg_p && arg_p->type != ARGT_STOP; arg_p++) {
 			/* Check stack available size. */
-			if (!lua_checkstack(s->hlua.T, 1)) {
-				send_log(px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
+			if (!lua_checkstack(stream->hlua.T, 1)) {
+				send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
 				if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 					Alert("Lua sample-fetch '%s': full stack.\n", fcn->name);
 				return 0;
 			}
-			if (!lua_checkstack(s->hlua.T, 1)) {
-				send_log(px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
+			if (!lua_checkstack(stream->hlua.T, 1)) {
+				send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': full stack.", fcn->name);
 				if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 					Alert("Lua sample-fetch '%s': full stack.\n", fcn->name);
 				return 0;
 			}
-			hlua_arg2lua(s->hlua.T, arg_p);
-			s->hlua.nargs++;
+			hlua_arg2lua(stream->hlua.T, arg_p);
+			stream->hlua.nargs++;
 		}
 
 		/* We must initialize the execution timeouts. */
-		s->hlua.expire = tick_add(now_ms, hlua_timeout_session);
+		stream->hlua.expire = tick_add(now_ms, hlua_timeout_session);
 
 		/* Set the currently running flag. */
-		HLUA_SET_RUN(&s->hlua);
+		HLUA_SET_RUN(&stream->hlua);
 	}
 
 	/* Execute the function. */
-	switch (hlua_ctx_resume(&s->hlua, 0)) {
+	switch (hlua_ctx_resume(&stream->hlua, 0)) {
 	/* finished. */
 	case HLUA_E_OK:
 		/* Convert the returned value in sample. */
-		hlua_lua2smp(s->hlua.T, -1, smp);
-		lua_pop(s->hlua.T, 1);
+		hlua_lua2smp(stream->hlua.T, -1, smp);
+		lua_pop(stream->hlua.T, 1);
 
 		/* Set the end of execution flag. */
 		smp->flags &= ~SMP_F_MAY_CHANGE;
@@ -4036,7 +4035,7 @@
 
 	/* yield. */
 	case HLUA_E_AGAIN:
-		send_log(px, LOG_ERR, "Lua sample-fetch '%s': cannot use yielded functions.", fcn->name);
+		send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': cannot use yielded functions.", fcn->name);
 		if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 			Alert("Lua sample-fetch '%s': cannot use yielded functions.\n", fcn->name);
 		return 0;
@@ -4044,15 +4043,15 @@
 	/* finished with error. */
 	case HLUA_E_ERRMSG:
 		/* Display log. */
-		send_log(px, LOG_ERR, "Lua sample-fetch '%s': %s.", fcn->name, lua_tostring(s->hlua.T, -1));
+		send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s': %s.", fcn->name, lua_tostring(stream->hlua.T, -1));
 		if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
-			Alert("Lua sample-fetch '%s': %s.\n", fcn->name, lua_tostring(s->hlua.T, -1));
-		lua_pop(s->hlua.T, 1);
+			Alert("Lua sample-fetch '%s': %s.\n", fcn->name, lua_tostring(stream->hlua.T, -1));
+		lua_pop(stream->hlua.T, 1);
 		return 0;
 
 	case HLUA_E_ERR:
 		/* Display log. */
-		send_log(px, LOG_ERR, "Lua sample-fetch '%s' returns an unknown error.", fcn->name);
+		send_log(smp->px, LOG_ERR, "Lua sample-fetch '%s' returns an unknown error.", fcn->name);
 		if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))
 			Alert("Lua sample-fetch '%s': returns an unknown error.\n", fcn->name);
 
diff --git a/src/listener.c b/src/listener.c
index 017dcff..f4bdcc6 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -591,21 +591,21 @@
 
 /* set temp integer to the number of connexions to the same listening socket */
 static int
-smp_fetch_dconn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_dconn(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	smp->type = SMP_T_UINT;
-	smp->data.uint = sess->listener->nbconn;
+	smp->data.uint = smp->sess->listener->nbconn;
 	return 1;
 }
 
 /* set temp integer to the id of the socket (listener) */
 static int
-smp_fetch_so_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_so_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	smp->type = SMP_T_UINT;
-	smp->data.uint = sess->listener->luid;
+	smp->data.uint = smp->sess->listener->luid;
 	return 1;
 }
 
diff --git a/src/map.c b/src/map.c
index eea3f4f..a75605c 100644
--- a/src/map.c
+++ b/src/map.c
@@ -164,8 +164,7 @@
 	return 1;
 }
 
-static int sample_conv_map(struct stream *stream, const struct arg *arg_p,
-                           struct sample *smp, void *private)
+static int sample_conv_map(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct map_descriptor *desc;
 	struct pattern *pat;
diff --git a/src/payload.c b/src/payload.c
index 7e254bc..a80ac10 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -29,8 +29,8 @@
  * used with content inspection.
  */
 static int
-smp_fetch_wait_end(struct proxy *px, struct session *sess, struct stream *s, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_wait_end(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	if (!(opt & SMP_OPT_FINAL)) {
 		smp->flags |= SMP_F_MAY_CHANGE;
@@ -43,12 +43,12 @@
 
 /* return the number of bytes in the request buffer */
 static int
-smp_fetch_len(struct proxy *px, struct session *sess, struct stream *s, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_len(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
 	struct channel *chn;
 
-	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &s->res : &s->req;
+	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
 	if (!chn->buf)
 		return 0;
 
@@ -60,15 +60,15 @@
 
 /* returns the type of SSL hello message (mainly used to detect an SSL hello) */
 static int
-smp_fetch_ssl_hello_type(struct proxy *px, struct session *sess, struct stream *s, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_hello_type(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	int hs_len;
 	int hs_type, bleft;
 	struct channel *chn;
 	const unsigned char *data;
 
-	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &s->res : &s->req;
+	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
 	if (!chn->buf)
 		goto not_ssl_hello;
 
@@ -128,21 +128,22 @@
  * Note: this decoder only works with non-wrapping data.
  */
 static int
-smp_fetch_req_ssl_ver(struct proxy *px, struct session *sess, struct stream *s, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_req_ssl_ver(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
 	int version, bleft, msg_len;
 	const unsigned char *data;
+	struct channel *req = &smp->strm->req;
 
-	if (!s->req.buf)
+	if (!req->buf)
 		return 0;
 
 	msg_len = 0;
-	bleft = s->req.buf->i;
+	bleft = req->buf->i;
 	if (!bleft)
 		goto too_short;
 
-	data = (const unsigned char *)s->req.buf->p;
+	data = (const unsigned char *)req->buf->p;
 	if ((*data >= 0x14 && *data <= 0x17) || (*data == 0xFF)) {
 		/* SSLv3 header format */
 		if (bleft < 5)
@@ -210,8 +211,8 @@
 	 * all the part of the request which fits in a buffer is already
 	 * there.
 	 */
-	if (msg_len > channel_recv_limit(&s->req) + s->req.buf->data - s->req.buf->p)
-		msg_len = channel_recv_limit(&s->req) + s->req.buf->data - s->req.buf->p;
+	if (msg_len > channel_recv_limit(req) + req->buf->data - req->buf->p)
+		msg_len = channel_recv_limit(req) + req->buf->data - req->buf->p;
 
 	if (bleft < msg_len)
 		goto too_short;
@@ -264,14 +265,14 @@
  *             - opaque hostname[name_len bytes]
  */
 static int
-smp_fetch_ssl_hello_sni(struct proxy *px, struct session *sess, struct stream *s, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_hello_sni(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	int hs_len, ext_len, bleft;
 	struct channel *chn;
 	unsigned char *data;
 
-	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &s->res : &s->req;
+	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
 	if (!chn->buf)
 		goto not_ssl_hello;
 
@@ -493,20 +494,20 @@
  * returned sample has type SMP_T_CSTR.
  */
 int
-smp_fetch_rdp_cookie(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_rdp_cookie(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
-	return fetch_rdp_cookie_name(strm, smp, args ? args->data.str.str : NULL, args ? args->data.str.len : 0);
+	return fetch_rdp_cookie_name(smp->strm, smp, args ? args->data.str.str : NULL, args ? args->data.str.len : 0);
 }
 
 /* returns either 1 or 0 depending on whether an RDP cookie is found or not */
 static int
-smp_fetch_rdp_cookie_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_rdp_cookie_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	int ret;
 
-	ret = smp_fetch_rdp_cookie(px, sess, strm, opt, args, smp, kw, private);
+	ret = smp_fetch_rdp_cookie(opt, args, smp, kw, private);
 
 	if (smp->flags & SMP_F_MAY_CHANGE)
 		return 0;
@@ -519,8 +520,8 @@
 
 /* extracts part of a payload with offset and length at a given position */
 static int
-smp_fetch_payload_lv(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *arg_p, struct sample *smp, const char *kw, void *private)
+smp_fetch_payload_lv(unsigned int opt, const struct arg *arg_p, struct sample *smp,
+                     const char *kw, void *private)
 {
 	unsigned int len_offset = arg_p[0].data.uint;
 	unsigned int len_size = arg_p[1].data.uint;
@@ -533,7 +534,7 @@
 	/* by default buf offset == len offset + len size */
 	/* buf offset could be absolute or relative to len offset + len size if prefixed by + or - */
 
-	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &strm->res : &strm->req;
+	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
 	if (!chn->buf)
 		return 0;
 
@@ -573,14 +574,14 @@
 
 /* extracts some payload at a fixed position and length */
 static int
-smp_fetch_payload(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                  const struct arg *arg_p, struct sample *smp, const char *kw, void *private)
+smp_fetch_payload(unsigned int opt, const struct arg *arg_p, struct sample *smp,
+                  const char *kw, void *private)
 {
 	unsigned int buf_offset = arg_p[0].data.uint;
 	unsigned int buf_size = arg_p[1].data.uint;
 	struct channel *chn;
 
-	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &strm->res : &strm->req;
+	chn = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
 	if (!chn->buf)
 		return 0;
 
diff --git a/src/proto_http.c b/src/proto_http.c
index 810248b..70e3ab7 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -10176,10 +10176,10 @@
  * least the type and uint value are modified.
  */
 #define CHECK_HTTP_MESSAGE_FIRST() \
-	do { int r = smp_prefetch_http(px, strm, opt, args, smp, 1); if (r <= 0) return r; } while (0)
+	do { int r = smp_prefetch_http(smp->px, smp->strm, opt, args, smp, 1); if (r <= 0) return r; } while (0)
 
 #define CHECK_HTTP_MESSAGE_FIRST_PERM() \
-	do { int r = smp_prefetch_http(px, strm, opt, args, smp, 0); if (r <= 0) return r; } while (0)
+	do { int r = smp_prefetch_http(smp->px, smp->strm, opt, args, smp, 0); if (r <= 0) return r; } while (0)
 
 
 /* 1. Check on METHOD
@@ -10214,11 +10214,11 @@
  * This is intended to be used with pat_match_meth() only.
  */
 static int
-smp_fetch_meth(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_meth(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	int meth;
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 
 	CHECK_HTTP_MESSAGE_FIRST_PERM();
 
@@ -10268,10 +10268,10 @@
 }
 
 static int
-smp_fetch_rqver(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_rqver(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	char *ptr;
 	int len;
 
@@ -10293,8 +10293,8 @@
 }
 
 static int
-smp_fetch_stver(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_stver(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	struct http_txn *txn;
 	char *ptr;
@@ -10302,7 +10302,7 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	if (txn->rsp.msg_state < HTTP_MSG_BODY)
 		return 0;
 
@@ -10323,8 +10323,8 @@
 
 /* 3. Check on Status Code. We manipulate integers here. */
 static int
-smp_fetch_stcode(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_stcode(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	struct http_txn *txn;
 	char *ptr;
@@ -10332,7 +10332,7 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	if (txn->rsp.msg_state < HTTP_MSG_BODY)
 		return 0;
 
@@ -10349,10 +10349,10 @@
  * has been waited for using http-buffer-request.
  */
 static int
-smp_fetch_body(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_body(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	struct http_msg *msg;
 	unsigned long len;
 	unsigned long block1;
@@ -10398,10 +10398,10 @@
  * has been waited for using http-buffer-request.
  */
 static int
-smp_fetch_body_len(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_body_len(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	struct http_msg *msg;
 
 	CHECK_HTTP_MESSAGE_FIRST();
@@ -10424,10 +10424,10 @@
  * for using http-buffer-request.
  */
 static int
-smp_fetch_body_size(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_body_size(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	struct http_msg *msg;
 
 	CHECK_HTTP_MESSAGE_FIRST();
@@ -10447,14 +10447,14 @@
 
 /* 4. Check on URL/URI. A pointer to the URI is stored. */
 static int
-smp_fetch_url(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
 	struct http_txn *txn;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	smp->type = SMP_T_STR;
 	smp->data.str.len = txn->req.sl.rq.u_l;
 	smp->data.str.str = txn->req.chn->buf->p + txn->req.sl.rq.u;
@@ -10463,15 +10463,15 @@
 }
 
 static int
-smp_fetch_url_ip(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url_ip(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct sockaddr_storage addr;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	url2sa(txn->req.chn->buf->p + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &addr, NULL);
 	if (((struct sockaddr_in *)&addr)->sin_family != AF_INET)
 		return 0;
@@ -10483,15 +10483,15 @@
 }
 
 static int
-smp_fetch_url_port(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url_port(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct sockaddr_storage addr;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	url2sa(txn->req.chn->buf->p + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &addr, NULL);
 	if (((struct sockaddr_in *)&addr)->sin_family != AF_INET)
 		return 0;
@@ -10510,8 +10510,8 @@
  * returns full lines instead (useful for User-Agent or Date for example).
  */
 static int
-smp_fetch_fhdr(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_fhdr(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	struct hdr_idx *idx;
 	struct hdr_ctx *ctx = smp->ctx.a[0];
@@ -10539,8 +10539,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	idx = &strm->txn->hdr_idx;
-	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &strm->txn->req : &strm->txn->rsp;
+	idx = &smp->strm->txn->hdr_idx;
+	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &smp->strm->txn->req : &smp->strm->txn->rsp;
 
 	if (ctx && !(smp->flags & SMP_F_NOT_LAST))
 		/* search for header from the beginning */
@@ -10568,8 +10568,8 @@
  * returns full lines instead (useful for User-Agent or Date for example).
  */
 static int
-smp_fetch_fhdr_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_fhdr_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	struct hdr_idx *idx;
 	struct hdr_ctx ctx;
@@ -10585,8 +10585,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	idx = &strm->txn->hdr_idx;
-	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &strm->txn->req : &strm->txn->rsp;
+	idx = &smp->strm->txn->hdr_idx;
+	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &smp->strm->txn->req : &smp->strm->txn->rsp;
 
 	ctx.idx = 0;
 	cnt = 0;
@@ -10600,8 +10600,8 @@
 }
 
 static int
-smp_fetch_hdr_names(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_hdr_names(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	struct hdr_idx *idx;
 	struct hdr_ctx ctx;
@@ -10614,8 +10614,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	idx = &strm->txn->hdr_idx;
-	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &strm->txn->req : &strm->txn->rsp;
+	idx = &smp->strm->txn->hdr_idx;
+	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &smp->strm->txn->req : &smp->strm->txn->rsp;
 
 	temp = get_trash_chunk();
 
@@ -10641,8 +10641,8 @@
  * headers are considered from the first one.
  */
 static int
-smp_fetch_hdr(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_hdr(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
 	struct hdr_idx *idx;
 	struct hdr_ctx *ctx = smp->ctx.a[0];
@@ -10670,8 +10670,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	idx = &strm->txn->hdr_idx;
-	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &strm->txn->req : &strm->txn->rsp;
+	idx = &smp->strm->txn->hdr_idx;
+	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &smp->strm->txn->req : &smp->strm->txn->rsp;
 
 	if (ctx && !(smp->flags & SMP_F_NOT_LAST))
 		/* search for header from the beginning */
@@ -10698,8 +10698,8 @@
  * Accepts exactly 1 argument of type string.
  */
 static int
-smp_fetch_hdr_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                  const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_hdr_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                  const char *kw, void *private)
 {
 	struct hdr_idx *idx;
 	struct hdr_ctx ctx;
@@ -10715,8 +10715,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	idx = &strm->txn->hdr_idx;
-	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &strm->txn->req : &strm->txn->rsp;
+	idx = &smp->strm->txn->hdr_idx;
+	msg = ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) ? &smp->strm->txn->req : &smp->strm->txn->rsp;
 
 	ctx.idx = 0;
 	cnt = 0;
@@ -10735,10 +10735,10 @@
  * may or may not be appropriate for everything.
  */
 static int
-smp_fetch_hdr_val(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                  const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_hdr_val(unsigned int opt, const struct arg *args, struct sample *smp,
+                  const char *kw, void *private)
 {
-	int ret = smp_fetch_hdr(px, sess, strm, opt, args, smp, kw, private);
+	int ret = smp_fetch_hdr(opt, args, smp, kw, private);
 
 	if (ret > 0) {
 		smp->type = SMP_T_UINT;
@@ -10753,12 +10753,12 @@
  * It returns an IPv4 or IPv6 address.
  */
 static int
-smp_fetch_hdr_ip(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_hdr_ip(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	int ret;
 
-	while ((ret = smp_fetch_hdr(px, sess, strm, opt, args, smp, kw, private)) > 0) {
+	while ((ret = smp_fetch_hdr(opt, args, smp, kw, private)) > 0) {
 		if (url2ipv4((char *)smp->data.str.str, &smp->data.ipv4)) {
 			smp->type = SMP_T_IPV4;
 			break;
@@ -10785,15 +10785,15 @@
  * the first '/' after the possible hostname, and ends before the possible '?'.
  */
 static int
-smp_fetch_path(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_path(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	struct http_txn *txn;
 	char *ptr, *end;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	end = txn->req.chn->buf->p + txn->req.sl.rq.u + txn->req.sl.rq.u_l;
 	ptr = http_get_path(txn);
 	if (!ptr)
@@ -10819,8 +10819,8 @@
  * The returned sample is of type string.
  */
 static int
-smp_fetch_base(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_base(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	struct http_txn *txn;
 	char *ptr, *end, *beg;
@@ -10829,10 +10829,10 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	ctx.idx = 0;
 	if (!http_find_header2("Host", 4, txn->req.chn->buf->p, &txn->hdr_idx, &ctx) || !ctx.vlen)
-		return smp_fetch_path(px, sess, strm, opt, args, smp, kw, private);
+		return smp_fetch_path(opt, args, smp, kw, private);
 
 	/* OK we have the header value in ctx.line+ctx.val for ctx.vlen bytes */
 	temp = get_trash_chunk();
@@ -10867,8 +10867,8 @@
  * high-traffic sites without having to store whole paths.
  */
 int
-smp_fetch_base32(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_base32(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct hdr_ctx ctx;
@@ -10878,7 +10878,7 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	ctx.idx = 0;
 	if (http_find_header2("Host", 4, txn->req.chn->buf->p, &txn->hdr_idx, &ctx)) {
 		/* OK we have the header value in ctx.line+ctx.val for ctx.vlen bytes */
@@ -10916,16 +10916,16 @@
  * 8 bytes would still work.
  */
 static int
-smp_fetch_base32_src(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_base32_src(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	struct chunk *temp;
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
 	if (!cli_conn)
 		return 0;
 
-	if (!smp_fetch_base32(px, sess, strm, opt, args, smp, kw, private))
+	if (!smp_fetch_base32(opt, args, smp, kw, private))
 		return 0;
 
 	temp = get_trash_chunk();
@@ -10955,15 +10955,15 @@
  * of type string carrying the whole query string.
  */
 static int
-smp_fetch_query(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_query(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	struct http_txn *txn;
 	char *ptr, *end;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	ptr = txn->req.chn->buf->p + txn->req.sl.rq.u;
 	end = ptr + txn->req.sl.rq.u_l;
 
@@ -10981,8 +10981,8 @@
 }
 
 static int
-smp_fetch_proto_http(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_proto_http(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	/* Note: hdr_idx.v cannot be NULL in this ACL because the ACL is tagged
 	 * as a layer7 ACL, which involves automatic allocation of hdr_idx.
@@ -10997,18 +10997,18 @@
 
 /* return a valid test if the current request is the first one on the connection */
 static int
-smp_fetch_http_first_req(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_http_first_req(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	smp->type = SMP_T_BOOL;
-	smp->data.uint = !(strm->txn->flags & TX_NOT_FIRST);
+	smp->data.uint = !(smp->strm->txn->flags & TX_NOT_FIRST);
 	return 1;
 }
 
 /* Accepts exactly 1 argument of type userlist */
 static int
-smp_fetch_http_auth(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_http_auth(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 
 	if (!args || args->type != ARGT_USR)
@@ -11016,32 +11016,34 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	if (!get_http_auth(strm))
+	if (!get_http_auth(smp->strm))
 		return 0;
 
 	smp->type = SMP_T_BOOL;
-	smp->data.uint = check_user(args->data.usr, strm->txn->auth.user, strm->txn->auth.pass);
+	smp->data.uint = check_user(args->data.usr, smp->strm->txn->auth.user,
+	                            smp->strm->txn->auth.pass);
 	return 1;
 }
 
 /* Accepts exactly 1 argument of type userlist */
 static int
-smp_fetch_http_auth_grp(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_http_auth_grp(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	if (!args || args->type != ARGT_USR)
 		return 0;
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	if (!get_http_auth(strm))
+	if (!get_http_auth(smp->strm))
 		return 0;
 
 	/* if the user does not belong to the userlist or has a wrong password,
 	 * report that it unconditionally does not match. Otherwise we return
 	 * a string containing the username.
 	 */
-	if (!check_user(args->data.usr, strm->txn->auth.user, strm->txn->auth.pass))
+	if (!check_user(args->data.usr, smp->strm->txn->auth.user,
+	                smp->strm->txn->auth.pass))
 		return 0;
 
 	/* pat_match_auth() will need the user list */
@@ -11049,8 +11051,8 @@
 
 	smp->type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.str = strm->txn->auth.user;
-	smp->data.str.len = strlen(strm->txn->auth.user);
+	smp->data.str.str = smp->strm->txn->auth.user;
+	smp->data.str.len = strlen(smp->strm->txn->auth.user);
 
 	return 1;
 }
@@ -11154,10 +11156,10 @@
  * the "capture" option in the configuration file
  */
 static int
-smp_fetch_capture_header_req(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_header_req(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
-	struct proxy *fe = strm_fe(strm);
+	struct proxy *fe = strm_fe(smp->strm);
 	int idx;
 
 	if (!args || args->type != ARGT_UINT)
@@ -11165,13 +11167,13 @@
 
 	idx = args->data.uint;
 
-	if (idx > (fe->nb_req_cap - 1) || strm->req_cap == NULL || strm->req_cap[idx] == NULL)
+	if (idx > (fe->nb_req_cap - 1) || smp->strm->req_cap == NULL || smp->strm->req_cap[idx] == NULL)
 		return 0;
 
 	smp->type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.str = strm->req_cap[idx];
-	smp->data.str.len = strlen(strm->req_cap[idx]);
+	smp->data.str.str = smp->strm->req_cap[idx];
+	smp->data.str.len = strlen(smp->strm->req_cap[idx]);
 
 	return 1;
 }
@@ -11180,10 +11182,10 @@
  * the "capture" option in the configuration file
  */
 static int
-smp_fetch_capture_header_res(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_header_res(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
-	struct proxy *fe = strm_fe(strm);
+	struct proxy *fe = strm_fe(smp->strm);
 	int idx;
 
 	if (!args || args->type != ARGT_UINT)
@@ -11191,24 +11193,24 @@
 
 	idx = args->data.uint;
 
-	if (idx > (fe->nb_rsp_cap - 1) || strm->res_cap == NULL || strm->res_cap[idx] == NULL)
+	if (idx > (fe->nb_rsp_cap - 1) || smp->strm->res_cap == NULL || smp->strm->res_cap[idx] == NULL)
 		return 0;
 
 	smp->type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.str = strm->res_cap[idx];
-	smp->data.str.len = strlen(strm->res_cap[idx]);
+	smp->data.str.str = smp->strm->res_cap[idx];
+	smp->data.str.len = strlen(smp->strm->res_cap[idx]);
 
 	return 1;
 }
 
 /* Extracts the METHOD in the HTTP request, the txn->uri should be filled before the call */
 static int
-smp_fetch_capture_req_method(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_req_method(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
 	struct chunk *temp;
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	char *ptr;
 
 	if (!txn || !txn->uri)
@@ -11232,11 +11234,11 @@
 
 /* Extracts the path in the HTTP request, the txn->uri should be filled before the call  */
 static int
-smp_fetch_capture_req_uri(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_req_uri(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
 	struct chunk *temp;
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 	char *ptr;
 
 	if (!txn || !txn->uri)
@@ -11271,10 +11273,10 @@
  * as a string (either "HTTP/1.0" or "HTTP/1.1").
  */
 static int
-smp_fetch_capture_req_ver(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_req_ver(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 
 	if (!txn || txn->req.msg_state < HTTP_MSG_HDR_FIRST)
 		return 0;
@@ -11295,10 +11297,10 @@
  * as a string (either "HTTP/1.0" or "HTTP/1.1").
  */
 static int
-smp_fetch_capture_res_ver(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_capture_res_ver(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
-	struct http_txn *txn = strm->txn;
+	struct http_txn *txn = smp->strm->txn;
 
 	if (!txn || txn->rsp.msg_state < HTTP_MSG_HDR_FIRST)
 		return 0;
@@ -11326,8 +11328,8 @@
  * The returned sample is of type CSTR. Can be used to parse cookies in other
  * files.
  */
-int smp_fetch_cookie(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+int smp_fetch_cookie(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct hdr_idx *idx;
@@ -11351,8 +11353,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
-	idx = &strm->txn->hdr_idx;
+	txn = smp->strm->txn;
+	idx = &smp->strm->txn->hdr_idx;
 
 	if ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) {
 		msg = &txn->req;
@@ -11428,8 +11430,8 @@
  * type UINT. Accepts exactly 1 argument of type string.
  */
 static int
-smp_fetch_cookie_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_cookie_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct hdr_idx *idx;
@@ -11446,8 +11448,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
-	idx = &strm->txn->hdr_idx;
+	txn = smp->strm->txn;
+	idx = &smp->strm->txn->hdr_idx;
 
 	if ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) {
 		msg = &txn->req;
@@ -11498,10 +11500,10 @@
  * takes a mandatory argument of type string. It relies on smp_fetch_cookie().
  */
 static int
-smp_fetch_cookie_val(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_cookie_val(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
-	int ret = smp_fetch_cookie(px, sess, strm, opt, args, smp, kw, private);
+	int ret = smp_fetch_cookie(opt, args, smp, kw, private);
 
 	if (ret > 0) {
 		smp->type = SMP_T_UINT;
@@ -11603,8 +11605,8 @@
 }
 
 static int
-smp_fetch_url_param(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url_param(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	char delim = '?';
 	struct http_msg *msg;
@@ -11615,7 +11617,7 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	msg = &strm->txn->req;
+	msg = &smp->strm->txn->req;
 
 	if (args[1].type)
 		delim = *args[1].data.str.str;
@@ -11635,10 +11637,10 @@
  * above).
  */
 static int
-smp_fetch_url_param_val(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url_param_val(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
-	int ret = smp_fetch_url_param(px, sess, strm, opt, args, smp, kw, private);
+	int ret = smp_fetch_url_param(opt, args, smp, kw, private);
 
 	if (ret > 0) {
 		smp->type = SMP_T_UINT;
@@ -11659,8 +11661,8 @@
  * as well as the path
  */
 static int
-smp_fetch_url32(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url32(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	struct http_txn *txn;
 	struct hdr_ctx ctx;
@@ -11670,7 +11672,7 @@
 
 	CHECK_HTTP_MESSAGE_FIRST();
 
-	txn = strm->txn;
+	txn = smp->strm->txn;
 	ctx.idx = 0;
 	if (http_find_header2("Host", 4, txn->req.chn->buf->p, &txn->hdr_idx, &ctx)) {
 		/* OK we have the header value in ctx.line+ctx.val for ctx.vlen bytes */
@@ -11708,13 +11710,13 @@
  * 8 bytes would still work.
  */
 static int
-smp_fetch_url32_src(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_url32_src(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	struct chunk *temp;
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
-	if (!smp_fetch_url32(px, sess, strm, opt, args, smp, kw, private))
+	if (!smp_fetch_url32(opt, args, smp, kw, private))
 		return 0;
 
 	temp = get_trash_chunk();
@@ -11760,8 +11762,7 @@
  * adds an optional offset found in args[0] and emits a string representing
  * the date in RFC-1123/5322 format.
  */
-static int sample_conv_http_date(struct stream *stream, const struct arg *args,
-                                 struct sample *smp, void *private)
+static int sample_conv_http_date(const struct arg *args, struct sample *smp, void *private)
 {
 	const char day[7][4] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
 	const char mon[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
@@ -11812,8 +11813,7 @@
 }
 
 /* Arguments: The list of expected value, the number of parts returned and the separator */
-static int sample_conv_q_prefered(struct stream *stream, const struct arg *args,
-                                  struct sample *smp, void *private)
+static int sample_conv_q_prefered(const struct arg *args, struct sample *smp, void *private)
 {
 	const char *al = smp->data.str.str;
 	const char *end = al + smp->data.str.len;
@@ -11960,8 +11960,7 @@
 }
 
 /* This fetch url-decode any input string. */
-static int sample_conv_url_dec(struct stream *stream, const struct arg *args,
-                               struct sample *smp, void *private)
+static int sample_conv_url_dec(const struct arg *args, struct sample *smp, void *private)
 {
 	/* If the constant flag is set or if not size is avalaible at
 	 * the end of the buffer, copy the string in other buffer
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index cf0aaa8..19f878e 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -1963,10 +1963,10 @@
 
 /* fetch the connection's source IPv4/IPv6 address */
 static int
-smp_fetch_src(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_src(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
 	if (!cli_conn)
 		return 0;
@@ -1990,10 +1990,10 @@
 
 /* set temp integer to the connection's source port */
 static int
-smp_fetch_sport(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *k, void *private)
+smp_fetch_sport(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *k, void *private)
 {
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
 	if (!cli_conn)
 		return 0;
@@ -2008,10 +2008,10 @@
 
 /* fetch the connection's destination IPv4/IPv6 address */
 static int
-smp_fetch_dst(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_dst(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
 	if (!cli_conn)
 		return 0;
@@ -2037,10 +2037,10 @@
 
 /* set temp integer to the frontend connexion's destination port */
 static int
-smp_fetch_dport(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_dport(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
-	struct connection *cli_conn = objt_conn(sess->origin);
+	struct connection *cli_conn = objt_conn(smp->sess->origin);
 
 	if (!cli_conn)
 		return 0;
diff --git a/src/sample.c b/src/sample.c
index 53c9d0d..8cc2234 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -1036,7 +1036,7 @@
 	p->px   = px;
 	p->sess = sess;
 	p->strm = strm;
-	if (!expr->fetch->process(px, sess, strm, opt, expr->arg_p, p, expr->fetch->kw, expr->fetch->private))
+	if (!expr->fetch->process(opt, expr->arg_p, p, expr->fetch->kw, expr->fetch->private))
 		return NULL;
 
 	list_for_each_entry(conv_expr, &expr->conv_exprs, list) {
@@ -1055,7 +1055,7 @@
 
 		/* OK cast succeeded */
 
-		if (!conv_expr->conv->process(strm, conv_expr->arg_p, p, conv_expr->conv->private))
+		if (!conv_expr->conv->process(conv_expr->arg_p, p, conv_expr->conv->private))
 			return NULL;
 	}
 	return p;
@@ -1364,8 +1364,7 @@
 /*    These functions set the data type on return.               */
 /*****************************************************************/
 
-static int sample_conv_bin2base64(struct stream *stream, const struct arg *arg_p,
-                                  struct sample *smp, void *private)
+static int sample_conv_bin2base64(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct chunk *trash = get_trash_chunk();
 	int b64_len;
@@ -1382,8 +1381,7 @@
 	return 1;
 }
 
-static int sample_conv_bin2hex(struct stream *stream, const struct arg *arg_p,
-                               struct sample *smp, void *private)
+static int sample_conv_bin2hex(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct chunk *trash = get_trash_chunk();
 	unsigned char c;
@@ -1402,8 +1400,7 @@
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
-static int sample_conv_djb2(struct stream *stream, const struct arg *arg_p,
-                            struct sample *smp, void *private)
+static int sample_conv_djb2(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint = hash_djb2(smp->data.str.str, smp->data.str.len);
 	if (arg_p && arg_p->data.uint)
@@ -1412,8 +1409,7 @@
 	return 1;
 }
 
-static int sample_conv_str2lower(struct stream *stream, const struct arg *arg_p,
-                                 struct sample *smp, void *private)
+static int sample_conv_str2lower(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	int i;
 
@@ -1430,8 +1426,7 @@
 	return 1;
 }
 
-static int sample_conv_str2upper(struct stream *stream, const struct arg *arg_p,
-                                 struct sample *smp, void *private)
+static int sample_conv_str2upper(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	int i;
 
@@ -1449,8 +1444,7 @@
 }
 
 /* takes the netmask in arg_p */
-static int sample_conv_ipmask(struct stream *stream, const struct arg *arg_p,
-                              struct sample *smp, void *private)
+static int sample_conv_ipmask(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.ipv4.s_addr &= arg_p->data.ipv4.s_addr;
 	smp->type = SMP_T_IPV4;
@@ -1461,8 +1455,7 @@
  * adds an optional offset found in args[1] and emits a string representing
  * the local time in the format specified in args[1] using strftime().
  */
-static int sample_conv_ltime(struct stream *stream, const struct arg *args,
-                             struct sample *smp, void *private)
+static int sample_conv_ltime(const struct arg *args, struct sample *smp, void *private)
 {
 	struct chunk *temp;
 	time_t curr_date = smp->data.uint;
@@ -1479,8 +1472,7 @@
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
-static int sample_conv_sdbm(struct stream *stream, const struct arg *arg_p,
-                            struct sample *smp, void *private)
+static int sample_conv_sdbm(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint = hash_sdbm(smp->data.str.str, smp->data.str.len);
 	if (arg_p && arg_p->data.uint)
@@ -1493,8 +1485,7 @@
  * adds an optional offset found in args[1] and emits a string representing
  * the UTC date in the format specified in args[1] using strftime().
  */
-static int sample_conv_utime(struct stream *stream, const struct arg *args,
-                             struct sample *smp, void *private)
+static int sample_conv_utime(const struct arg *args, struct sample *smp, void *private)
 {
 	struct chunk *temp;
 	time_t curr_date = smp->data.uint;
@@ -1511,8 +1502,7 @@
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
-static int sample_conv_wt6(struct stream *stream, const struct arg *arg_p,
-                           struct sample *smp, void *private)
+static int sample_conv_wt6(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint = hash_wt6(smp->data.str.str, smp->data.str.len);
 	if (arg_p && arg_p->data.uint)
@@ -1522,8 +1512,7 @@
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
-static int sample_conv_crc32(struct stream *stream, const struct arg *arg_p,
-                             struct sample *smp, void *private)
+static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint = hash_crc32(smp->data.str.str, smp->data.str.len);
 	if (arg_p && arg_p->data.uint)
@@ -1603,8 +1592,7 @@
 	return 0;
 }
 
-static int sample_conv_json(struct stream *stream, const struct arg *arg_p,
-                            struct sample *smp, void *private)
+static int sample_conv_json(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct chunk *temp;
 	char _str[7]; /* \u + 4 hex digit + null char for sprintf. */
@@ -1718,8 +1706,7 @@
 /* This sample function is designed to extract some bytes from an input buffer.
  * First arg is the offset.
  * Optional second arg is the length to truncate */
-static int sample_conv_bytes(struct stream *stream, const struct arg *arg_p,
-                             struct sample *smp, void *private)
+static int sample_conv_bytes(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	if (smp->data.str.len <= arg_p[0].data.uint) {
 		smp->data.str.len = 0;
@@ -1776,8 +1763,7 @@
  * First arg is the index of the field (start at 1)
  * Second arg is a char list of separators (type string)
  */
-static int sample_conv_field(struct stream *stream, const struct arg *arg_p,
-                             struct sample *smp, void *private)
+static int sample_conv_field(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	unsigned int field;
 	char *start, *end;
@@ -1828,8 +1814,7 @@
  * First arg is the index of the word (start at 1)
  * Second arg is a char list of words separators (type string)
  */
-static int sample_conv_word(struct stream *stream, const struct arg *arg_p,
-                            struct sample *smp, void *private)
+static int sample_conv_word(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	unsigned int word;
 	char *start, *end;
@@ -1923,8 +1908,7 @@
  * location until nothing matches anymore. First arg is the regex to apply to
  * the input string, second arg is the replacement expression.
  */
-static int sample_conv_regsub(struct stream *stream, const struct arg *arg_p,
-                              struct sample *smp, void *private)
+static int sample_conv_regsub(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	char *start, *end;
 	struct my_regex *reg = arg_p[0].data.reg;
@@ -1996,8 +1980,7 @@
 /* Takes a UINT on input, applies a binary twos complement and returns the UINT
  * result.
  */
-static int sample_conv_binary_cpl(struct stream *stream, const struct arg *arg_p,
-                                  struct sample *smp, void *private)
+static int sample_conv_binary_cpl(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint = ~smp->data.uint;
 	return 1;
@@ -2006,8 +1989,7 @@
 /* Takes a UINT on input, applies a binary "and" with the UINT in arg_p, and
  * returns the UINT result.
  */
-static int sample_conv_binary_and(struct stream *stream, const struct arg *arg_p,
-                                  struct sample *smp, void *private)
+static int sample_conv_binary_and(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint &= arg_p->data.uint;
 	return 1;
@@ -2016,8 +1998,7 @@
 /* Takes a UINT on input, applies a binary "or" with the UINT in arg_p, and
  * returns the UINT result.
  */
-static int sample_conv_binary_or(struct stream *stream, const struct arg *arg_p,
-                                 struct sample *smp, void *private)
+static int sample_conv_binary_or(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint |= arg_p->data.uint;
 	return 1;
@@ -2026,8 +2007,7 @@
 /* Takes a UINT on input, applies a binary "xor" with the UINT in arg_p, and
  * returns the UINT result.
  */
-static int sample_conv_binary_xor(struct stream *stream, const struct arg *arg_p,
-                                  struct sample *smp, void *private)
+static int sample_conv_binary_xor(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint ^= arg_p->data.uint;
 	return 1;
@@ -2036,8 +2016,7 @@
 /* Takes a UINT on input, applies an arithmetic "add" with the UINT in arg_p,
  * and returns the UINT result.
  */
-static int sample_conv_arith_add(struct stream *stream, const struct arg *arg_p,
-                                 struct sample *smp, void *private)
+static int sample_conv_arith_add(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	smp->data.uint += arg_p->data.uint;
 	return 1;
@@ -2046,7 +2025,7 @@
 /* Takes a UINT on input, applies an arithmetic "sub" with the UINT in arg_p,
  * and returns the UINT result.
  */
-static int sample_conv_arith_sub(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_sub(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	smp->data.uint -= arg_p->data.uint;
@@ -2056,7 +2035,7 @@
 /* Takes a UINT on input, applies an arithmetic "mul" with the UINT in arg_p,
  * and returns the UINT result.
  */
-static int sample_conv_arith_mul(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_mul(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	smp->data.uint *= arg_p->data.uint;
@@ -2067,7 +2046,7 @@
  * and returns the UINT result. If arg_p makes the result overflow, then the
  * largest possible quantity is returned.
  */
-static int sample_conv_arith_div(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_div(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	if (arg_p->data.uint)
@@ -2081,7 +2060,7 @@
  * and returns the UINT result. If arg_p makes the result overflow, then zero
  * is returned.
  */
-static int sample_conv_arith_mod(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_mod(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	if (arg_p->data.uint)
@@ -2094,7 +2073,7 @@
 /* Takes an UINT on input, applies an arithmetic "neg" and returns the UINT
  * result.
  */
-static int sample_conv_arith_neg(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_neg(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	smp->data.uint = -smp->data.uint;
@@ -2104,7 +2083,7 @@
 /* Takes a UINT on input, returns true is the value is non-null, otherwise
  * false. The output is a BOOL.
  */
-static int sample_conv_arith_bool(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_bool(const struct arg *arg_p,
                                   struct sample *smp, void *private)
 {
 	smp->data.uint = !!smp->data.uint;
@@ -2115,7 +2094,7 @@
 /* Takes a UINT on input, returns false is the value is non-null, otherwise
  * truee. The output is a BOOL.
  */
-static int sample_conv_arith_not(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_not(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	smp->data.uint = !smp->data.uint;
@@ -2126,7 +2105,7 @@
 /* Takes a UINT on input, returns true is the value is odd, otherwise false.
  * The output is a BOOL.
  */
-static int sample_conv_arith_odd(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_odd(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
 	smp->data.uint = smp->data.uint & 1;
@@ -2137,7 +2116,7 @@
 /* Takes a UINT on input, returns true is the value is even, otherwise false.
  * The output is a BOOL.
  */
-static int sample_conv_arith_even(struct stream *stream, const struct arg *arg_p,
+static int sample_conv_arith_even(const struct arg *arg_p,
                                   struct sample *smp, void *private)
 {
 	smp->data.uint = !(smp->data.uint & 1);
@@ -2151,8 +2130,8 @@
 
 /* force TRUE to be returned at the fetch level */
 static int
-smp_fetch_true(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_true(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	smp->type = SMP_T_BOOL;
 	smp->data.uint = 1;
@@ -2161,8 +2140,8 @@
 
 /* force FALSE to be returned at the fetch level */
 static int
-smp_fetch_false(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_false(unsigned int opt, const struct arg *args, struct sample *smp,
+                const char *kw, void *private)
 {
 	smp->type = SMP_T_BOOL;
 	smp->data.uint = 0;
@@ -2171,8 +2150,8 @@
 
 /* retrieve environment variable $1 as a string */
 static int
-smp_fetch_env(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-              const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_env(unsigned int opt, const struct arg *args, struct sample *smp,
+              const char *kw, void *private)
 {
 	char *env;
 
@@ -2194,8 +2173,8 @@
  * of args[0] seconds.
  */
 static int
-smp_fetch_date(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_date(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	smp->data.uint = date.tv_sec;
 
@@ -2210,8 +2189,8 @@
 
 /* returns the number of processes */
 static int
-smp_fetch_nbproc(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_nbproc(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	smp->type = SMP_T_UINT;
 	smp->data.uint = global.nbproc;
@@ -2220,8 +2199,8 @@
 
 /* returns the number of the current process (between 1 and nbproc */
 static int
-smp_fetch_proc(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_proc(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	smp->type = SMP_T_UINT;
 	smp->data.uint = relative_pid;
@@ -2232,8 +2211,8 @@
  * range specified in argument.
  */
 static int
-smp_fetch_rand(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-               const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_rand(unsigned int opt, const struct arg *args, struct sample *smp,
+               const char *kw, void *private)
 {
 	smp->data.uint = random();
 
@@ -2248,8 +2227,8 @@
 
 /* returns true if the current process is stopping */
 static int
-smp_fetch_stopping(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                   const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_stopping(unsigned int opt, const struct arg *args, struct sample *smp,
+                   const char *kw, void *private)
 {
 	smp->type = SMP_T_BOOL;
 	smp->data.uint = stopping;
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index eb1d88c..d490955 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -3084,12 +3084,12 @@
 
 /* boolean, returns true if client cert was present */
 static int
-smp_fetch_ssl_fc_has_crt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_has_crt(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3110,8 +3110,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_der(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_der(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3119,7 +3119,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3155,8 +3155,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_serial(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_serial(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3164,7 +3164,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3200,8 +3200,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_sha1(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_sha1(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3210,7 +3210,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3245,8 +3245,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_notafter(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_notafter(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3254,7 +3254,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3289,8 +3289,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_i_dn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_i_dn(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3299,7 +3299,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3349,8 +3349,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_notbefore(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_notbefore(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3358,7 +3358,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3393,8 +3393,8 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_s_dn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_s_dn(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt = NULL;
@@ -3403,7 +3403,7 @@
 	struct chunk *smp_trash;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3450,13 +3450,13 @@
 
 /* integer, returns true if current session use a client certificate */
 static int
-smp_fetch_ssl_c_used(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_c_used(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	X509 *crt;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3481,14 +3481,14 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_version(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_version(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3518,15 +3518,15 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_sig_alg(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_sig_alg(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	int nid;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3567,15 +3567,15 @@
  * should be use.
  */
 static int
-smp_fetch_ssl_x_key_alg(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_x_key_alg(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	int cert_peer = (kw[4] == 'c') ? 1 : 0;
 	X509 *crt;
 	int nid;
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3615,11 +3615,11 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                 const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc(unsigned int opt, const struct arg *args, struct sample *smp,
+                 const char *kw, void *private)
 {
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
-	struct connection *conn = objt_conn(strm->si[back_conn].end);
+	struct connection *conn = objt_conn(smp->strm->si[back_conn].end);
 
 	smp->type = SMP_T_BOOL;
 	smp->data.uint = (conn && conn->xprt == &ssl_sock);
@@ -3628,11 +3628,11 @@
 
 /* boolean, returns true if client present a SNI */
 static int
-smp_fetch_ssl_fc_has_sni(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                         const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_has_sni(unsigned int opt, const struct arg *args, struct sample *smp,
+                         const char *kw, void *private)
 {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
-	struct connection *conn = objt_conn(sess->origin);
+	struct connection *conn = objt_conn(smp->sess->origin);
 
 	smp->type = SMP_T_BOOL;
 	smp->data.uint = (conn && conn->xprt == &ssl_sock) &&
@@ -3649,15 +3649,15 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc_cipher(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_cipher(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
 	struct connection *conn;
 
 	smp->flags = 0;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3678,15 +3678,15 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc_alg_keysize(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_alg_keysize(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
 	struct connection *conn;
 
 	smp->flags = 0;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3703,15 +3703,15 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc_use_keysize(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_use_keysize(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
 	struct connection *conn;
 
 	smp->flags = 0;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3726,15 +3726,15 @@
 
 #ifdef OPENSSL_NPN_NEGOTIATED
 static int
-smp_fetch_ssl_fc_npn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_npn(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	struct connection *conn;
 
 	smp->flags = SMP_F_CONST;
 	smp->type = SMP_T_STR;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3751,8 +3751,8 @@
 
 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
 static int
-smp_fetch_ssl_fc_alpn(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_alpn(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
 	struct connection *conn;
 
@@ -3779,15 +3779,15 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc_protocol(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_protocol(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
 	struct connection *conn;
 
 	smp->flags = 0;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3807,8 +3807,8 @@
  * char is 'b'.
  */
 static int
-smp_fetch_ssl_fc_session_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                            const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_session_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                            const char *kw, void *private)
 {
 #if OPENSSL_VERSION_NUMBER > 0x0090800fL
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
@@ -3818,7 +3818,7 @@
 	smp->flags = SMP_F_CONST;
 	smp->type = SMP_T_BIN;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3837,8 +3837,8 @@
 }
 
 static int
-smp_fetch_ssl_fc_sni(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_sni(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
 	struct connection *conn;
@@ -3846,7 +3846,7 @@
 	smp->flags = SMP_F_CONST;
 	smp->type = SMP_T_STR;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3862,8 +3862,8 @@
 }
 
 static int
-smp_fetch_ssl_fc_unique_id(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                           const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_fc_unique_id(unsigned int opt, const struct arg *args, struct sample *smp,
+                           const char *kw, void *private)
 {
 #if OPENSSL_VERSION_NUMBER > 0x0090800fL
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
@@ -3873,7 +3873,7 @@
 
 	smp->flags = 0;
 
-	conn = objt_conn(strm->si[back_conn].end);
+	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3903,12 +3903,12 @@
 
 /* integer, returns the first verify error in CA chain of client certificate chain. */
 static int
-smp_fetch_ssl_c_ca_err(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_c_ca_err(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3926,12 +3926,12 @@
 
 /* integer, returns the depth of the first verify error in CA chain of client certificate chain. */
 static int
-smp_fetch_ssl_c_ca_err_depth(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                             const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_c_ca_err_depth(unsigned int opt, const struct arg *args, struct sample *smp,
+                             const char *kw, void *private)
 {
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3949,12 +3949,12 @@
 
 /* integer, returns the first verify error on client certificate */
 static int
-smp_fetch_ssl_c_err(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_c_err(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
@@ -3972,12 +3972,12 @@
 
 /* integer, returns the verify result on client cert */
 static int
-smp_fetch_ssl_c_verify(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_ssl_c_verify(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
 	struct connection *conn;
 
-	conn = objt_conn(sess->origin);
+	conn = objt_conn(smp->sess->origin);
 	if (!conn || conn->xprt != &ssl_sock)
 		return 0;
 
diff --git a/src/stick_table.c b/src/stick_table.c
index 8ebaa66..19d6af1 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -809,8 +809,7 @@
  * the table's type. This is a double conversion, but in the future we might
  * support automatic input types to perform the cast on the fly.
  */
-static int sample_conv_in_table(struct stream *stream, const struct arg *arg_p,
-                                struct sample *smp, void *private)
+static int sample_conv_in_table(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -836,8 +835,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_bytes_in_rate(struct stream *stream, const struct arg *arg_p,
-                                           struct sample *smp, void *private)
+static int sample_conv_table_bytes_in_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -873,8 +871,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_conn_cnt(struct stream *stream, const struct arg *arg_p,
-                                      struct sample *smp, void *private)
+static int sample_conv_table_conn_cnt(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -909,8 +906,7 @@
  * can be easily performed. If the inspected parameter is not stored in the
  * table, <not found> is returned.
  */
-static int sample_conv_table_conn_cur(struct stream *stream, const struct arg *arg_p,
-                                      struct sample *smp, void *private)
+static int sample_conv_table_conn_cur(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -945,8 +941,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_conn_rate(struct stream *stream, const struct arg *arg_p,
-                                       struct sample *smp, void *private)
+static int sample_conv_table_conn_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -982,8 +977,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_bytes_out_rate(struct stream *stream, const struct arg *arg_p,
-                                            struct sample *smp, void *private)
+static int sample_conv_table_bytes_out_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1019,8 +1013,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_gpc0(struct stream *stream, const struct arg *arg_p,
-                                  struct sample *smp, void *private)
+static int sample_conv_table_gpc0(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1055,8 +1048,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_gpc0_rate(struct stream *stream, const struct arg *arg_p,
-                                       struct sample *smp, void *private)
+static int sample_conv_table_gpc0_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1092,8 +1084,7 @@
  * comparisons can be easily performed. If the inspected parameter is not stored
  * in the table, <not found> is returned.
  */
-static int sample_conv_table_http_err_cnt(struct stream *stream, const struct arg *arg_p,
-                                          struct sample *smp, void *private)
+static int sample_conv_table_http_err_cnt(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1128,8 +1119,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_http_err_rate(struct stream *stream, const struct arg *arg_p,
-                                           struct sample *smp, void *private)
+static int sample_conv_table_http_err_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1165,8 +1155,7 @@
  * can be easily performed. If the inspected parameter is not stored in the
  * table, <not found> is returned.
  */
-static int sample_conv_table_http_req_cnt(struct stream *stream, const struct arg *arg_p,
-                                          struct sample *smp, void *private)
+static int sample_conv_table_http_req_cnt(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1201,8 +1190,7 @@
  * performed. If the inspected parameter is not stored in the table, <not found>
  * is returned.
  */
-static int sample_conv_table_http_req_rate(struct stream *stream, const struct arg *arg_p,
-                                           struct sample *smp, void *private)
+static int sample_conv_table_http_req_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1238,8 +1226,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_kbytes_in(struct stream *stream, const struct arg *arg_p,
-                                       struct sample *smp, void *private)
+static int sample_conv_table_kbytes_in(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1274,8 +1261,7 @@
  * be easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_kbytes_out(struct stream *stream, const struct arg *arg_p,
-                                        struct sample *smp, void *private)
+static int sample_conv_table_kbytes_out(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1310,8 +1296,7 @@
  * easily performed. If the inspected parameter is not stored in the table,
  * <not found> is returned.
  */
-static int sample_conv_table_server_id(struct stream *stream, const struct arg *arg_p,
-                                       struct sample *smp, void *private)
+static int sample_conv_table_server_id(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1346,8 +1331,7 @@
  * can be easily performed. If the inspected parameter is not stored in the
  * table, <not found> is returned.
  */
-static int sample_conv_table_sess_cnt(struct stream *stream, const struct arg *arg_p,
-                                      struct sample *smp, void *private)
+static int sample_conv_table_sess_cnt(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1382,8 +1366,7 @@
  * performed. If the inspected parameter is not stored in the table, <not found>
  * is returned.
  */
-static int sample_conv_table_sess_rate(struct stream *stream, const struct arg *arg_p,
-                                       struct sample *smp, void *private)
+static int sample_conv_table_sess_rate(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
@@ -1419,8 +1402,7 @@
  * comparisons can be easily performed. If the inspected parameter is not
  * stored in the table, <not found> is returned.
  */
-static int sample_conv_table_trackers(struct stream *stream, const struct arg *arg_p,
-                                      struct sample *smp, void *private)
+static int sample_conv_table_trackers(const struct arg *arg_p, struct sample *smp, void *private)
 {
 	struct stktable *t;
 	struct stktable_key *key;
diff --git a/src/stream.c b/src/stream.c
index 5b5494b..133a93f 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -2585,12 +2585,12 @@
  * Supports being called as "sc[0-9]_tracked" only.
  */
 static int
-smp_fetch_sc_tracked(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                     const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_tracked(unsigned int opt, const struct arg *args, struct sample *smp,
+                     const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_BOOL;
-	smp->data.uint = !!smp_fetch_sc_stkctr(sess, strm, args, kw);
+	smp->data.uint = !!smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 	return 1;
 }
 
@@ -2600,10 +2600,10 @@
  * zero is returned if the key is new.
  */
 static int
-smp_fetch_sc_get_gpc0(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_get_gpc0(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2627,10 +2627,10 @@
  * Value zero is returned if the key is new.
  */
 static int
-smp_fetch_sc_gpc0_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_gpc0_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2643,7 +2643,7 @@
 		if (!ptr)
 			return 0; /* parameter not stored */
 		smp->data.uint = read_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
-		                                      stkctr->table->data_arg[STKTABLE_DT_GPC0_RATE].u);
+		                  stkctr->table->data_arg[STKTABLE_DT_GPC0_RATE].u);
 	}
 	return 1;
 }
@@ -2653,10 +2653,10 @@
  * Supports being called as "sc[0-9]_inc_gpc0" or "src_inc_gpc0" only.
  */
 static int
-smp_fetch_sc_inc_gpc0(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_inc_gpc0(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2690,10 +2690,10 @@
  * Supports being called as "sc[0-9]_clr_gpc0" or "src_clr_gpc0" only.
  */
 static int
-smp_fetch_sc_clr_gpc0(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_clr_gpc0(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2716,10 +2716,10 @@
  * "src_conn_cnt" only.
  */
 static int
-smp_fetch_sc_conn_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_conn_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2741,10 +2741,10 @@
  * only.
  */
 static int
-smp_fetch_sc_conn_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_conn_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2767,18 +2767,19 @@
  * Accepts exactly 1 argument of type table.
  */
 static int
-smp_fetch_src_updt_conn_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                            const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_src_updt_conn_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                            const char *kw, void *private)
 {
-	struct connection *conn = objt_conn(sess->origin);
+	struct connection *conn = objt_conn(smp->sess->origin);
 	struct stksess *ts;
 	struct stktable_key *key;
 	void *ptr;
+	struct proxy *px;
 
 	if (!conn)
 		return 0;
 
-	key = addr_to_stktable_key(&conn->addr.from, px->table.type);
+	key = addr_to_stktable_key(&conn->addr.from, smp->px->table.type);
 	if (!key)
 		return 0;
 
@@ -2803,10 +2804,10 @@
  * "src_conn_cur" only.
  */
 static int
-smp_fetch_sc_conn_cur(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_conn_cur(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2828,10 +2829,10 @@
  * "src_sess_cnt" only.
  */
 static int
-smp_fetch_sc_sess_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                      const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_sess_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2852,10 +2853,10 @@
  * Supports being called as "sc[0-9]_sess_rate" or "src_sess_rate" only.
  */
 static int
-smp_fetch_sc_sess_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_sess_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2878,10 +2879,10 @@
  * "src_http_req_cnt" only.
  */
 static int
-smp_fetch_sc_http_req_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_http_req_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2903,10 +2904,10 @@
  * "src_http_req_rate" only.
  */
 static int
-smp_fetch_sc_http_req_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                           const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_http_req_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                           const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2929,10 +2930,10 @@
  * "src_http_err_cnt" only.
  */
 static int
-smp_fetch_sc_http_err_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                          const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_http_err_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                          const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2954,10 +2955,10 @@
  * "src_http_err_rate" only.
  */
 static int
-smp_fetch_sc_http_err_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                           const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_http_err_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                           const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -2980,10 +2981,10 @@
  * "sc[0-9]_kbytes_in" or "src_kbytes_in" only.
  */
 static int
-smp_fetch_sc_kbytes_in(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_kbytes_in(unsigned int opt, const struct arg *args, struct sample *smp,
+                       const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -3005,10 +3006,10 @@
  * "sc[0-9]_bytes_in_rate" or "src_bytes_in_rate" only.
  */
 static int
-smp_fetch_sc_bytes_in_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                           const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_bytes_in_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                           const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -3031,10 +3032,10 @@
  * "sc[0-9]_kbytes_out" or "src_kbytes_out" only.
  */
 static int
-smp_fetch_sc_kbytes_out(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                        const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_kbytes_out(unsigned int opt, const struct arg *args, struct sample *smp,
+                        const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -3056,10 +3057,10 @@
  * "sc[0-9]_bytes_out_rate" or "src_bytes_out_rate" only.
  */
 static int
-smp_fetch_sc_bytes_out_rate(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                            const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_bytes_out_rate(unsigned int opt, const struct arg *args, struct sample *smp,
+                            const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -3081,10 +3082,10 @@
  * tracked frontend counters. Supports being called as "sc[0-9]_trackers" only.
  */
 static int
-smp_fetch_sc_trackers(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                       const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_sc_trackers(unsigned int opt, const struct arg *args, struct sample *smp,
+                      const char *kw, void *private)
 {
-	struct stkctr *stkctr = smp_fetch_sc_stkctr(sess, strm, args, kw);
+	struct stkctr *stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 
 	if (!stkctr)
 		return 0;
@@ -3099,8 +3100,8 @@
  * Accepts exactly 1 argument of type table.
  */
 static int
-smp_fetch_table_cnt(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_table_cnt(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;
@@ -3112,9 +3113,11 @@
  * Accepts exactly 1 argument of type table.
  */
 static int
-smp_fetch_table_avl(struct proxy *px, struct session *sess, struct stream *strm, unsigned int opt,
-                    const struct arg *args, struct sample *smp, const char *kw, void *private)
+smp_fetch_table_avl(unsigned int opt, const struct arg *args, struct sample *smp,
+                    const char *kw, void *private)
 {
+	struct proxy *px;
+
 	px = args->data.prx;
 	smp->flags = SMP_F_VOL_TEST;
 	smp->type = SMP_T_UINT;