]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: acl: replace acl_expr with args in acl fetch_* functions
authorWilly Tarreau <w@1wt.eu>
Mon, 23 Apr 2012 21:55:44 +0000 (23:55 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 8 May 2012 18:57:16 +0000 (20:57 +0200)
Having the args everywhere will make it easier to share fetch functions
between patterns and ACLs. The only place where we could have needed
the expr was in the http_prefetch function which can do well without.

include/proto/acl.h
include/types/acl.h
src/acl.c
src/backend.c
src/frontend.c
src/proto_http.c
src/proto_tcp.c
src/protocols.c
src/session.c

index 131d79985846d57ab21d9b2c86806798a0644184..493b56e5a0f909a4c8713c46ca4b77111a02922e 100644 (file)
@@ -172,7 +172,7 @@ int acl_parse_ip(const char **text, struct acl_pattern *pattern, int *opaque);
 
 /* always fake a data retrieval */
 int acl_fetch_nothing(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp);
+                      const struct arg *args, struct sample *smp);
 
 /* always return false */
 int acl_match_nothing(struct sample *smp, struct acl_pattern *pattern);
index db63dfe4528961a1b5336440a4423d08ce8d314d..564c4bbe7a3ce033c8a90853d9167f5b24abf7d6 100644 (file)
@@ -239,7 +239,7 @@ struct acl_keyword {
        const char *kw;
        int (*parse)(const char **text, struct acl_pattern *pattern, int *opaque);
        int (*fetch)(struct proxy *px, struct session *l4, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp);
+                    const struct arg *args, struct sample *smp);
        int (*match)(struct sample *smp, struct acl_pattern *pattern);
        unsigned int requires;   /* bit mask of all ACL_USE_* required to evaluate this keyword */
        int arg_mask; /* mask describing up to 7 arg types */
index 36b53070c317f20f8879477f5262f496abc2a371..1eda948dac236a2c8dac930d296247289f7a7fab 100644 (file)
--- a/src/acl.c
+++ b/src/acl.c
@@ -66,7 +66,7 @@ static struct acl_kw_list acl_keywords = {
 /* force TRUE to be returned at the fetch level */
 static int
 acl_fetch_true(struct proxy *px, struct session *l4, void *l7, int dir,
-               struct acl_expr *expr, struct sample *smp)
+               const struct arg *args, struct sample *smp)
 {
        smp->type = SMP_T_BOOL;
        smp->data.uint = 1;
@@ -78,7 +78,7 @@ acl_fetch_true(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_wait_end(struct proxy *px, struct session *l4, void *l7, int dir,
-                   struct acl_expr *expr, struct sample *smp)
+                   const struct arg *args, struct sample *smp)
 {
        if (dir & ACL_PARTIAL) {
                smp->flags |= SMP_F_MAY_CHANGE;
@@ -92,7 +92,7 @@ acl_fetch_wait_end(struct proxy *px, struct session *l4, void *l7, int dir,
 /* force FALSE to be returned at the fetch level */
 static int
 acl_fetch_false(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->type = SMP_T_BOOL;
        smp->data.uint = 0;
@@ -102,7 +102,7 @@ acl_fetch_false(struct proxy *px, struct session *l4, void *l7, int dir,
 /* return the number of bytes in the request buffer */
 static int
 acl_fetch_req_len(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp)
 {
        if (!l4 || !l4->req)
                return 0;
@@ -116,7 +116,7 @@ acl_fetch_req_len(struct proxy *px, struct session *l4, void *l7, int dir,
 
 static int
 acl_fetch_ssl_hello_type(struct proxy *px, struct session *l4, void *l7, int dir,
-                         struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        int hs_len;
        int hs_type, bleft;
@@ -185,7 +185,7 @@ acl_fetch_ssl_hello_type(struct proxy *px, struct session *l4, void *l7, int dir
  */
 static int
 acl_fetch_req_ssl_ver(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                      const struct arg *args, struct sample *smp)
 {
        int version, bleft, msg_len;
        const unsigned char *data;
@@ -321,7 +321,7 @@ acl_fetch_req_ssl_ver(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_ssl_hello_sni(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        int hs_len, ext_len, bleft;
        struct buffer *b;
@@ -465,7 +465,7 @@ int acl_parse_nothing(const char **text, struct acl_pattern *pattern, int *opaqu
 
 /* always fake a data retrieval */
 int acl_fetch_nothing(struct proxy *px, struct session *l4, void *l7, int dir,
-                     struct acl_expr *expr, struct sample *smp)
+                      const struct arg *args, struct sample *smp)
 {
        return 1;
 }
@@ -1733,7 +1733,7 @@ int acl_exec_cond(struct acl_cond *cond, struct proxy *px, struct session *l4, v
                                /* we need to reset context and flags */
                                memset(&smp, 0, sizeof(smp));
                        fetch_next:
-                               if (!expr->kw->fetch(px, l4, l7, dir, expr, &smp)) {
+                               if (!expr->kw->fetch(px, l4, l7, dir, expr->args, &smp)) {
                                        /* maybe we could not fetch because of missing data */
                                        if (smp.flags & SMP_F_MAY_CHANGE && dir & ACL_PARTIAL)
                                                acl_res |= ACL_PAT_MISS;
index c0c2412679f1714407f2348b9f4d5d7c21ede3b6..a9567070ff498f5b834a66dfb20ce75fcd93d36d 100644 (file)
@@ -1375,11 +1375,11 @@ int backend_parse_balance(const char **args, char *err, int errlen, struct proxy
  */
 static int
 acl_fetch_nbsrv(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       px = expr->args->data.prx;
+       px = args->data.prx;
 
        if (px->srv_act)
                smp->data.uint = px->srv_act;
@@ -1398,9 +1398,9 @@ acl_fetch_nbsrv(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_srv_is_up(struct proxy *px, struct session *l4, void *l7, int dir,
-                   struct acl_expr *expr, struct sample *smp)
+                    const struct arg *args, struct sample *smp)
 {
-       struct server *srv = expr->args->data.srv;
+       struct server *srv = args->data.srv;
 
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_BOOL;
@@ -1418,7 +1418,7 @@ acl_fetch_srv_is_up(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
-                   struct acl_expr *expr, struct sample *smp)
+                    const struct arg *args, struct sample *smp)
 {
        struct server *iterator;
 
@@ -1426,7 +1426,7 @@ acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
        smp->type = SMP_T_UINT;
        smp->data.uint = 0;
 
-       for (iterator = expr->args->data.prx->srv; iterator; iterator = iterator->next) {
+       for (iterator = args->data.prx->srv; iterator; iterator = iterator->next) {
                if ((iterator->state & SRV_RUNNING) == 0)
                        continue;
 
@@ -1446,7 +1446,7 @@ acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the id of the backend */
 static int
 acl_fetch_be_id(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TXN;
        smp->type = SMP_T_UINT;
@@ -1457,7 +1457,7 @@ acl_fetch_be_id(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the id of the server */
 static int
 acl_fetch_srv_id(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                 const struct arg *args, struct sample *smp)
 {
        if (!target_srv(&l4->target))
                return 0;
@@ -1474,11 +1474,11 @@ acl_fetch_srv_id(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_be_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = read_freq_ctr(&expr->args->data.prx->be_sess_per_sec);
+       smp->data.uint = read_freq_ctr(&args->data.prx->be_sess_per_sec);
        return 1;
 }
 
@@ -1488,11 +1488,11 @@ acl_fetch_be_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_be_conn(struct proxy *px, struct session *l4, void *l7, int dir,
-                 struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = expr->args->data.prx->beconn;
+       smp->data.uint = args->data.prx->beconn;
        return 1;
 }
 
@@ -1502,11 +1502,11 @@ acl_fetch_be_conn(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_queue_size(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                     const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = expr->args->data.prx->totpend;
+       smp->data.uint = args->data.prx->totpend;
        return 1;
 }
 
@@ -1520,13 +1520,13 @@ acl_fetch_queue_size(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_avg_queue_size(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        int nbsrv;
 
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       px = expr->args->data.prx;
+       px = args->data.prx;
 
        if (px->srv_act)
                nbsrv = px->srv_act;
@@ -1549,11 +1549,11 @@ acl_fetch_avg_queue_size(struct proxy *px, struct session *l4, void *l7, int dir
  */
 static int
 acl_fetch_srv_conn(struct proxy *px, struct session *l4, void *l7, int dir,
-                 struct acl_expr *expr, struct sample *smp)
+                   const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = expr->args->data.srv->cur_sess;
+       smp->data.uint = args->data.srv->cur_sess;
        return 1;
 }
 
index c44cd920b8ba1ef6acffb38e4b3e0dba2088bbb7..8cd9de7a96ece294fbd9be4c954bcdec29971413 100644 (file)
@@ -500,7 +500,7 @@ int make_proxy_line(char *buf, int buf_len, struct sockaddr_storage *src, struct
 /* set temp integer to the id of the frontend */
 static int
 acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_SESS;
        smp->type = SMP_T_UINT;
@@ -514,11 +514,11 @@ acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_fe_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = read_freq_ctr(&expr->args->data.prx->fe_sess_per_sec);
+       smp->data.uint = read_freq_ctr(&args->data.prx->fe_sess_per_sec);
        return 1;
 }
 
@@ -528,11 +528,11 @@ acl_fetch_fe_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_fe_conn(struct proxy *px, struct session *l4, void *l7, int dir,
-                 struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = expr->args->data.prx->feconn;
+       smp->data.uint = args->data.prx->feconn;
        return 1;
 }
 
index 933351ac85e042b3c6bc5f172c23a02531fa230f..7421688d18b31b99387e5638c70066148a05f33f 100644 (file)
@@ -7532,7 +7532,8 @@ req_error_parsing:
 /* This function ensures that the prerequisites for an L7 fetch are ready,
  * which means that a request or response is ready. If some data is missing,
  * a parsing attempt is made. This is useful in TCP-based ACLs which are able
- * to extract data from L7.
+ * to extract data from L7. If <req_vol> is non-null during a request prefetch,
+ * another test is made to ensure the required information is not gone.
  *
  * The function returns :
  *   0 if some data is missing or if the requested data cannot be fetched
@@ -7541,7 +7542,7 @@ req_error_parsing:
  */
 static int
 acl_prefetch_http(struct proxy *px, struct session *s, void *l7, int dir,
-                 struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp, int req_vol)
 {
        struct http_txn *txn = l7;
        struct http_msg *msg = &txn->req;
@@ -7556,7 +7557,7 @@ acl_prefetch_http(struct proxy *px, struct session *s, void *l7, int dir,
        /* Check for a dependency on a request */
        smp->type = SMP_T_BOOL;
 
-       if (expr->kw->requires & ACL_USE_L7REQ_ANY) {
+       if ((dir & ACL_DIR_MASK) == ACL_DIR_REQ) {
                if (unlikely(!s->req))
                        return 0;
 
@@ -7595,15 +7596,13 @@ acl_prefetch_http(struct proxy *px, struct session *s, void *l7, int dir,
                        }
                }
 
-               if ((expr->kw->requires & ACL_USE_L7REQ_VOLATILE) &&
-                   txn->rsp.msg_state != HTTP_MSG_RPBEFORE)
+               if (req_vol && txn->rsp.msg_state != HTTP_MSG_RPBEFORE)
                        return 0;  /* data might have moved and indexes changed */
 
                /* otherwise everything's ready for the request */
        }
-
-       /* Check for a dependency on a response */
-       if (expr->kw->requires & ACL_USE_L7RTR_ANY) {
+       else {
+               /* Check for a dependency on a response */
                if (txn->rsp.msg_state < HTTP_MSG_BODY)
                        return 0;
        }
@@ -7613,7 +7612,10 @@ acl_prefetch_http(struct proxy *px, struct session *s, void *l7, int dir,
 }
 
 #define CHECK_HTTP_MESSAGE_FIRST() \
-       do { int r = acl_prefetch_http(px, l4, l7, dir, expr, smp); if (r <= 0) return r; } while (0)
+       do { int r = acl_prefetch_http(px, l4, l7, dir, args, smp, 1); if (r <= 0) return r; } while (0)
+
+#define CHECK_HTTP_MESSAGE_FIRST_PERM() \
+       do { int r = acl_prefetch_http(px, l4, l7, dir, args, smp, 0); if (r <= 0) return r; } while (0)
 
 
 /* 1. Check on METHOD
@@ -7647,12 +7649,12 @@ static int acl_parse_meth(const char **text, struct acl_pattern *pattern, int *o
  */
 static int
 acl_fetch_meth(struct proxy *px, struct session *l4, void *l7, int dir,
-               struct acl_expr *expr, struct sample *smp)
+               const struct arg *args, struct sample *smp)
 {
        int meth;
        struct http_txn *txn = l7;
 
-       CHECK_HTTP_MESSAGE_FIRST();
+       CHECK_HTTP_MESSAGE_FIRST_PERM();
 
        meth = txn->meth;
        smp->type = SMP_T_UINT;
@@ -7711,7 +7713,7 @@ static int acl_parse_ver(const char **text, struct acl_pattern *pattern, int *op
 
 static int
 acl_fetch_rqver(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        char *ptr;
@@ -7736,7 +7738,7 @@ acl_fetch_rqver(struct proxy *px, struct session *l4, void *l7, int dir,
 
 static int
 acl_fetch_stver(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        char *ptr;
@@ -7762,7 +7764,7 @@ acl_fetch_stver(struct proxy *px, struct session *l4, void *l7, int dir,
 /* 3. Check on Status Code. We manipulate integers here. */
 static int
 acl_fetch_stcode(struct proxy *px, struct session *l4, void *l7, int dir,
-                 struct acl_expr *expr, struct sample *smp)
+                 const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        char *ptr;
@@ -7782,7 +7784,7 @@ acl_fetch_stcode(struct proxy *px, struct session *l4, void *l7, int dir,
 /* 4. Check on URL/URI. A pointer to the URI is stored. */
 static int
 acl_fetch_url(struct proxy *px, struct session *l4, void *l7, int dir,
-              struct acl_expr *expr, struct sample *smp)
+              const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
 
@@ -7797,7 +7799,7 @@ acl_fetch_url(struct proxy *px, struct session *l4, void *l7, int dir,
 
 static int
 acl_fetch_url_ip(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                 const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
 
@@ -7823,7 +7825,7 @@ acl_fetch_url_ip(struct proxy *px, struct session *l4, void *l7, int dir,
 
 static int
 acl_fetch_url_port(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                   const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
 
@@ -7846,14 +7848,14 @@ acl_fetch_url_port(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_hdr(struct proxy *px, struct session *l4, void *l7, int dir,
-              struct acl_expr *expr, struct sample *smp)
+              const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        struct hdr_idx *idx = &txn->hdr_idx;
        struct hdr_ctx *ctx = (struct hdr_ctx *)smp->ctx.a;
        const struct http_msg *msg = ((dir & ACL_DIR_MASK) == ACL_DIR_REQ) ? &txn->req : &txn->rsp;
 
-       if (!expr->args || expr->args->type != ARGT_STR)
+       if (!args || args->type != ARGT_STR)
                return 0;
 
        CHECK_HTTP_MESSAGE_FIRST();
@@ -7862,7 +7864,7 @@ acl_fetch_hdr(struct proxy *px, struct session *l4, void *l7, int dir,
                /* search for header from the beginning */
                ctx->idx = 0;
 
-       if (http_find_header2(expr->args->data.str.str, expr->args->data.str.len, msg->buf->p + msg->sol, idx, ctx)) {
+       if (http_find_header2(args->data.str.str, args->data.str.len, msg->buf->p + msg->sol, idx, ctx)) {
                smp->flags |= SMP_F_NOT_LAST;
                smp->flags |= SMP_F_VOL_HDR;
                smp->type = SMP_T_CSTR;
@@ -7882,7 +7884,7 @@ acl_fetch_hdr(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_hdr_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        struct hdr_idx *idx = &txn->hdr_idx;
@@ -7890,14 +7892,14 @@ acl_fetch_hdr_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
        const struct http_msg *msg = ((dir & ACL_DIR_MASK) == ACL_DIR_REQ) ? &txn->req : &txn->rsp;
        int cnt;
 
-       if (!expr->args || expr->args->type != ARGT_STR)
+       if (!args || args->type != ARGT_STR)
                return 0;
 
        CHECK_HTTP_MESSAGE_FIRST();
 
        ctx.idx = 0;
        cnt = 0;
-       while (http_find_header2(expr->args->data.str.str, expr->args->data.str.len, msg->buf->p + msg->sol, idx, &ctx))
+       while (http_find_header2(args->data.str.str, args->data.str.len, msg->buf->p + msg->sol, idx, &ctx))
                cnt++;
 
        smp->type = SMP_T_UINT;
@@ -7911,9 +7913,9 @@ acl_fetch_hdr_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_hdr_val(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                  const struct arg *args, struct sample *smp)
 {
-       int ret = acl_fetch_hdr(px, l4, l7, dir, expr, smp);
+       int ret = acl_fetch_hdr(px, l4, l7, dir, args, smp);
 
        if (ret > 0) {
                smp->type = SMP_T_UINT;
@@ -7927,11 +7929,11 @@ acl_fetch_hdr_val(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_hdr_ip(struct proxy *px, struct session *l4, void *l7, int dir,
-                  struct acl_expr *expr, struct sample *smp)
+                 const struct arg *args, struct sample *smp)
 {
        int ret;
 
-       while ((ret = acl_fetch_hdr(px, l4, l7, dir, expr, smp)) > 0) {
+       while ((ret = acl_fetch_hdr(px, l4, l7, dir, args, smp)) > 0) {
                smp->type = SMP_T_IPV4;
                if (url2ipv4((char *)smp->data.str.str, &smp->data.ipv4))
                        break;
@@ -7945,7 +7947,7 @@ acl_fetch_hdr_ip(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_path(struct proxy *px, struct session *l4, void *l7, int dir,
-               struct acl_expr *expr, struct sample *smp)
+               const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        char *ptr, *end;
@@ -7971,13 +7973,13 @@ acl_fetch_path(struct proxy *px, struct session *l4, void *l7, int dir,
 
 static int
 acl_fetch_proto_http(struct proxy *px, struct session *l4, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp)
+                     const struct arg *args, struct sample *smp)
 {
        /* 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.
         */
 
-       CHECK_HTTP_MESSAGE_FIRST();
+       CHECK_HTTP_MESSAGE_FIRST_PERM();
 
        smp->type = SMP_T_BOOL;
        smp->data.uint = 1;
@@ -7987,7 +7989,7 @@ acl_fetch_proto_http(struct proxy *px, struct session *l4, void *l7, int dir,
 /* return a valid test if the current request is the first one on the connection */
 static int
 acl_fetch_http_first_req(struct proxy *px, struct session *s, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        if (!s)
                return 0;
@@ -8000,10 +8002,10 @@ acl_fetch_http_first_req(struct proxy *px, struct session *s, void *l7, int dir,
 /* Accepts exactly 1 argument of type userlist */
 static int
 acl_fetch_http_auth(struct proxy *px, struct session *l4, void *l7, int dir,
-                   struct acl_expr *expr, struct sample *smp)
+                    const struct arg *args, struct sample *smp)
 {
 
-       if (!expr->args || expr->args->type != ARGT_USR)
+       if (!args || args->type != ARGT_USR)
                return 0;
 
        CHECK_HTTP_MESSAGE_FIRST();
@@ -8012,7 +8014,7 @@ acl_fetch_http_auth(struct proxy *px, struct session *l4, void *l7, int dir,
                return 0;
 
        smp->type = SMP_T_BOOL;
-       smp->data.uint = check_user(expr->args->data.usr, 0, l4->txn.auth.user, l4->txn.auth.pass);
+       smp->data.uint = check_user(args->data.usr, 0, l4->txn.auth.user, l4->txn.auth.pass);
        return 1;
 }
 
@@ -8115,12 +8117,12 @@ extract_cookie_value(char *hdr, const char *hdr_end,
  * smp->ctx.a[0] for the in-header position, smp->ctx.a[1] for the
  * end-of-header-value, and smp->ctx.a[2] for the hdr_idx. Depending on
  * the direction, multiple cookies may be parsed on the same line or not.
- * The cookie name is in expr->arg and the name length in expr->args->data.str.len.
+ * The cookie name is in args and the name length in args->data.str.len.
  * Accepts exactly 1 argument of type string.
  */
 static int
 acl_fetch_cookie_value(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        struct hdr_idx *idx = &txn->hdr_idx;
@@ -8130,7 +8132,7 @@ acl_fetch_cookie_value(struct proxy *px, struct session *l4, void *l7, int dir,
        int hdr_name_len;
        char *sol;
 
-       if (!expr->args || expr->args->type != ARGT_STR)
+       if (!args || args->type != ARGT_STR)
                return 0;
 
        CHECK_HTTP_MESSAGE_FIRST();
@@ -8160,7 +8162,7 @@ acl_fetch_cookie_value(struct proxy *px, struct session *l4, void *l7, int dir,
                        if (!http_find_header2(hdr_name, hdr_name_len, sol, idx, ctx))
                                goto out;
 
-                       if (ctx->vlen < expr->args->data.str.len + 1)
+                       if (ctx->vlen < args->data.str.len + 1)
                                continue;
 
                        smp->ctx.a[0] = ctx->line + ctx->val;
@@ -8169,7 +8171,7 @@ acl_fetch_cookie_value(struct proxy *px, struct session *l4, void *l7, int dir,
 
                smp->type = SMP_T_CSTR;
                smp->ctx.a[0] = extract_cookie_value(smp->ctx.a[0], smp->ctx.a[1],
-                                                expr->args->data.str.str, expr->args->data.str.len,
+                                                args->data.str.str, args->data.str.len,
                                                 (dir & ACL_DIR_MASK) == ACL_DIR_REQ,
                                                 &smp->data.str.str,
                                                 &smp->data.str.len);
@@ -8188,13 +8190,13 @@ acl_fetch_cookie_value(struct proxy *px, struct session *l4, void *l7, int dir,
 }
 
 /* Iterate over all cookies present in a request to count how many occurrences
- * match the name in expr->arg and expr->args->data.str.len. If <multi> is non-null, then
+ * match the name in args and args->data.str.len. If <multi> is non-null, then
  * multiple cookies may be parsed on the same line.
  * Accepts exactly 1 argument of type string.
  */
 static int
 acl_fetch_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp)
+                     const struct arg *args, struct sample *smp)
 {
        struct http_txn *txn = l7;
        struct hdr_idx *idx = &txn->hdr_idx;
@@ -8206,7 +8208,7 @@ acl_fetch_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
        char *val_beg, *val_end;
        char *sol;
 
-       if (!expr->args || expr->args->type != ARGT_STR)
+       if (!args || args->type != ARGT_STR)
                return 0;
 
        CHECK_HTTP_MESSAGE_FIRST();
@@ -8232,7 +8234,7 @@ acl_fetch_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
                        if (!http_find_header2(hdr_name, hdr_name_len, sol, idx, &ctx))
                                break;
 
-                       if (ctx.vlen < expr->args->data.str.len + 1)
+                       if (ctx.vlen < args->data.str.len + 1)
                                continue;
 
                        val_beg = ctx.line + ctx.val;
@@ -8241,7 +8243,7 @@ acl_fetch_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
 
                smp->type = SMP_T_CSTR;
                while ((val_beg = extract_cookie_value(val_beg, val_end,
-                                                      expr->args->data.str.str, expr->args->data.str.len,
+                                                      args->data.str.str, args->data.str.len,
                                                       (dir & ACL_DIR_MASK) == ACL_DIR_REQ,
                                                       &smp->data.str.str,
                                                       &smp->data.str.len))) {
index 317a5f37a151475a123dfc2ce33eb068413d2753..7cb45e6791fbe792ea77c160f317da3bf698c87b 100644 (file)
@@ -1363,19 +1363,19 @@ pattern_fetch_rdp_cookie(struct proxy *px, struct session *l4, void *l7, int dir
 
 static int
 acl_fetch_rdp_cookie(struct proxy *px, struct session *l4, void *l7, int dir,
-                     struct acl_expr *expr, struct sample *smp)
+                     const struct arg *args, struct sample *smp)
 {
-       return smp_fetch_rdp_cookie(px, l4, l7, dir, expr->args, smp);
+       return smp_fetch_rdp_cookie(px, l4, l7, dir, args, smp);
 }
 
 /* returns either 1 or 0 depending on whether an RDP cookie is found or not */
 static int
 acl_fetch_rdp_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                         struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        int ret;
 
-       ret = smp_fetch_rdp_cookie(px, l4, l7, dir, expr->args, smp);
+       ret = smp_fetch_rdp_cookie(px, l4, l7, dir, args, smp);
 
        if (smp->flags & SMP_F_MAY_CHANGE)
                return 0;
@@ -1390,7 +1390,7 @@ acl_fetch_rdp_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir
 /* copy the source IPv4/v6 address into temp_pattern */
 static int
 acl_fetch_src(struct proxy *px, struct session *l4, void *l7, int dir,
-              struct acl_expr *expr, struct sample *smp)
+              const struct arg *args, struct sample *smp)
 {
        switch (l4->si[0].addr.from.ss_family) {
        case AF_INET:
@@ -1438,7 +1438,7 @@ pattern_fetch_src6(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the connection's source port */
 static int
 acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->type = SMP_T_UINT;
        if (!(smp->data.uint = get_host_port(&l4->si[0].addr.from)))
@@ -1452,7 +1452,7 @@ acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set test->ptr to point to the frontend's IPv4/IPv6 address and test->i to the family */
 static int
 acl_fetch_dst(struct proxy *px, struct session *l4, void *l7, int dir,
-              struct acl_expr *expr, struct sample *smp)
+              const struct arg *args, struct sample *smp)
 {
        stream_sock_get_to_addr(&l4->si[0]);
 
@@ -1507,7 +1507,7 @@ pattern_fetch_dst6(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the frontend connexion's destination port */
 static int
 acl_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        stream_sock_get_to_addr(&l4->si[0]);
 
index 52ddbcc93dcfdf38d4346cee7ad9e938de53e419..8a95c2db22439cd50291b4dfa5ff36646c8acf24 100644 (file)
@@ -326,7 +326,7 @@ int protocol_disable_all(void)
 /* set temp integer to the number of connexions to the same listening socket */
 static int
 acl_fetch_dconn(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->type = SMP_T_UINT;
        smp->data.uint = l4->listener->nbconn;
@@ -336,7 +336,7 @@ acl_fetch_dconn(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the id of the socket (listener) */
 static int
 acl_fetch_so_id(struct proxy *px, struct session *l4, void *l7, int dir,
-                struct acl_expr *expr, struct sample *smp)
+                const struct arg *args, struct sample *smp)
 {
        smp->type = SMP_T_UINT;
        smp->data.uint = l4->listener->luid;
index b4c0a82b847cd9ad275eef16178974011109a504..f381f9efc6c78fa0b793ea664fb1315f5e7aba5f 100644 (file)
@@ -2327,7 +2327,7 @@ acl_fetch_get_gpc0(struct stktable *table, struct sample *smp, struct stksess *t
  */
 static int
 acl_fetch_sc1_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2339,7 +2339,7 @@ acl_fetch_sc1_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2352,7 +2352,7 @@ acl_fetch_sc2_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2360,7 +2360,7 @@ acl_fetch_src_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_get_gpc0(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2387,7 +2387,7 @@ acl_fetch_inc_gpc0(struct stktable *table, struct sample *smp, struct stksess *t
  */
 static int
 acl_fetch_sc1_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2399,7 +2399,7 @@ acl_fetch_sc1_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2412,7 +2412,7 @@ acl_fetch_sc2_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2420,7 +2420,7 @@ acl_fetch_src_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_inc_gpc0(&px->table, smp, stktable_update_key(&px->table, key));
 }
 
@@ -2448,7 +2448,7 @@ acl_fetch_clr_gpc0(struct stktable *table, struct sample *smp, struct stksess *t
  */
 static int
 acl_fetch_sc1_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2460,7 +2460,7 @@ acl_fetch_sc1_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2473,7 +2473,7 @@ acl_fetch_sc2_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2481,7 +2481,7 @@ acl_fetch_src_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_clr_gpc0(&px->table, smp, stktable_update_key(&px->table, key));
 }
 
@@ -2504,7 +2504,7 @@ acl_fetch_conn_cnt(struct stktable *table, struct sample *smp, struct stksess *t
 /* set temp integer to the cumulated number of connections from the session's tracked FE counters */
 static int
 acl_fetch_sc1_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2515,7 +2515,7 @@ acl_fetch_sc1_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the cumulated number of connections from the session's tracked BE counters */
 static int
 acl_fetch_sc2_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2529,7 +2529,7 @@ acl_fetch_sc2_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2537,7 +2537,7 @@ acl_fetch_src_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_conn_cnt(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2563,7 +2563,7 @@ acl_fetch_conn_rate(struct stktable *table, struct sample *smp, struct stksess *
  */
 static int
 acl_fetch_sc1_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2576,7 +2576,7 @@ acl_fetch_sc1_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2590,7 +2590,7 @@ acl_fetch_sc2_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2598,7 +2598,7 @@ acl_fetch_src_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_conn_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2608,7 +2608,7 @@ acl_fetch_src_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_updt_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        struct stksess *ts;
        struct stktable_key *key;
@@ -2618,7 +2618,7 @@ acl_fetch_src_updt_conn_cnt(struct proxy *px, struct session *l4, void *l7, int
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
 
        if ((ts = stktable_update_key(&px->table, key)) == NULL)
                /* entry does not exist and could not be created */
@@ -2654,7 +2654,7 @@ acl_fetch_conn_cur(struct stktable *table, struct sample *smp, struct stksess *t
 /* set temp integer to the number of concurrent connections from the session's tracked FE counters */
 static int
 acl_fetch_sc1_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2665,7 +2665,7 @@ acl_fetch_sc1_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the number of concurrent connections from the session's tracked BE counters */
 static int
 acl_fetch_sc2_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2679,7 +2679,7 @@ acl_fetch_sc2_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2687,7 +2687,7 @@ acl_fetch_src_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_conn_cur(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2710,7 +2710,7 @@ acl_fetch_sess_cnt(struct stktable *table, struct sample *smp, struct stksess *t
 /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
 static int
 acl_fetch_sc1_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2721,7 +2721,7 @@ acl_fetch_sc1_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
 /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
 static int
 acl_fetch_sc2_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2735,7 +2735,7 @@ acl_fetch_sc2_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                      struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2743,7 +2743,7 @@ acl_fetch_src_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_sess_cnt(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2769,7 +2769,7 @@ acl_fetch_sess_rate(struct stktable *table, struct sample *smp, struct stksess *
  */
 static int
 acl_fetch_sc1_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2782,7 +2782,7 @@ acl_fetch_sc1_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2796,7 +2796,7 @@ acl_fetch_sc2_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2804,7 +2804,7 @@ acl_fetch_src_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_sess_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2827,7 +2827,7 @@ acl_fetch_http_req_cnt(struct stktable *table, struct sample *smp, struct stkses
 /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
 static int
 acl_fetch_sc1_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2838,7 +2838,7 @@ acl_fetch_sc1_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
 /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
 static int
 acl_fetch_sc2_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2852,7 +2852,7 @@ acl_fetch_sc2_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
  */
 static int
 acl_fetch_src_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2860,7 +2860,7 @@ acl_fetch_src_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_http_req_cnt(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2886,7 +2886,7 @@ acl_fetch_http_req_rate(struct stktable *table, struct sample *smp, struct stkse
  */
 static int
 acl_fetch_sc1_http_req_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2899,7 +2899,7 @@ acl_fetch_sc1_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_sc2_http_req_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2913,7 +2913,7 @@ acl_fetch_sc2_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_src_http_req_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2921,7 +2921,7 @@ acl_fetch_src_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_http_req_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -2944,7 +2944,7 @@ acl_fetch_http_err_cnt(struct stktable *table, struct sample *smp, struct stkses
 /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
 static int
 acl_fetch_sc1_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -2955,7 +2955,7 @@ acl_fetch_sc1_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
 /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
 static int
 acl_fetch_sc2_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -2969,7 +2969,7 @@ acl_fetch_sc2_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
  */
 static int
 acl_fetch_src_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                           struct acl_expr *expr, struct sample *smp)
+                           const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -2977,7 +2977,7 @@ acl_fetch_src_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_http_err_cnt(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3003,7 +3003,7 @@ acl_fetch_http_err_rate(struct stktable *table, struct sample *smp, struct stkse
  */
 static int
 acl_fetch_sc1_http_err_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -3016,7 +3016,7 @@ acl_fetch_sc1_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_sc2_http_err_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -3030,7 +3030,7 @@ acl_fetch_sc2_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_src_http_err_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -3038,7 +3038,7 @@ acl_fetch_src_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_http_err_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3064,7 +3064,7 @@ acl_fetch_kbytes_in(struct stktable *table, struct sample *smp, struct stksess *
  */
 static int
 acl_fetch_sc1_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -3077,7 +3077,7 @@ acl_fetch_sc1_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_sc2_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                        const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -3091,7 +3091,7 @@ acl_fetch_sc2_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_src_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
-                       struct acl_expr *expr, struct sample *smp)
+                       const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -3099,7 +3099,7 @@ acl_fetch_src_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_kbytes_in(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3127,7 +3127,7 @@ acl_fetch_bytes_in_rate(struct stktable *table, struct sample *smp, struct stkse
  */
 static int
 acl_fetch_sc1_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -3140,7 +3140,7 @@ acl_fetch_sc1_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_sc2_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -3154,7 +3154,7 @@ acl_fetch_sc2_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_src_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                            struct acl_expr *expr, struct sample *smp)
+                            const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -3162,7 +3162,7 @@ acl_fetch_src_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_bytes_in_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3188,7 +3188,7 @@ acl_fetch_kbytes_out(struct stktable *table, struct sample *smp, struct stksess
  */
 static int
 acl_fetch_sc1_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir,
-                         struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -3201,7 +3201,7 @@ acl_fetch_sc1_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
  */
 static int
 acl_fetch_sc2_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir,
-                         struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -3215,7 +3215,7 @@ acl_fetch_sc2_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
  */
 static int
 acl_fetch_src_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir,
-                        struct acl_expr *expr, struct sample *smp)
+                         const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -3223,7 +3223,7 @@ acl_fetch_src_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_kbytes_out(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3251,7 +3251,7 @@ acl_fetch_bytes_out_rate(struct stktable *table, struct sample *smp, struct stks
  */
 static int
 acl_fetch_sc1_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                             struct acl_expr *expr, struct sample *smp)
+                             const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr1_entry)
                return 0;
@@ -3264,7 +3264,7 @@ acl_fetch_sc1_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_sc2_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                             struct acl_expr *expr, struct sample *smp)
+                             const struct arg *args, struct sample *smp)
 {
        if (!l4->stkctr2_entry)
                return 0;
@@ -3278,7 +3278,7 @@ acl_fetch_sc2_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_src_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int dir,
-                             struct acl_expr *expr, struct sample *smp)
+                             const struct arg *args, struct sample *smp)
 {
        struct stktable_key *key;
 
@@ -3286,7 +3286,7 @@ acl_fetch_src_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
        if (!key)
                return 0;
 
-       px = expr->args->data.prx;
+       px = args->data.prx;
        return acl_fetch_bytes_out_rate(&px->table, smp, stktable_lookup_key(&px->table, key));
 }
 
@@ -3295,11 +3295,11 @@ acl_fetch_src_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
  */
 static int
 acl_fetch_table_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp)
+                    const struct arg *args, struct sample *smp)
 {
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
-       smp->data.uint = expr->args->data.prx->table.current;
+       smp->data.uint = args->data.prx->table.current;
        return 1;
 }
 
@@ -3308,9 +3308,9 @@ acl_fetch_table_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
  */
 static int
 acl_fetch_table_avl(struct proxy *px, struct session *l4, void *l7, int dir,
-                    struct acl_expr *expr, struct sample *smp)
+                    const struct arg *args, struct sample *smp)
 {
-       px = expr->args->data.prx;
+       px = args->data.prx;
        smp->flags = SMP_F_VOL_TEST;
        smp->type = SMP_T_UINT;
        smp->data.uint = px->table.size - px->table.current;