MEDIUM: acl: use temp_pattern to store any integer-type information

All ACL fetches which return integer value now store the result into
the temporary pattern struct. All ACL matches which rely on integer
also get their value there.

Note: the pattern data types are not set right now.
This commit is contained in:
Willy Tarreau 2011-12-16 17:06:15 +01:00
parent b666bc7d51
commit a5e375646c
7 changed files with 151 additions and 156 deletions

View File

@ -102,7 +102,7 @@ acl_fetch_req_len(struct proxy *px, struct session *l4, void *l7, int dir,
if (!l4 || !l4->req) if (!l4 || !l4->req)
return 0; return 0;
test->i = l4->req->l; temp_pattern.data.integer = l4->req->l;
test->flags = ACL_TEST_F_VOLATILE | ACL_TEST_F_MAY_CHANGE; test->flags = ACL_TEST_F_VOLATILE | ACL_TEST_F_MAY_CHANGE;
return 1; return 1;
} }
@ -155,7 +155,7 @@ acl_fetch_ssl_hello_type(struct proxy *px, struct session *l4, void *l7, int dir
goto not_ssl_hello; goto not_ssl_hello;
} }
test->i = hs_type; temp_pattern.data.integer = hs_type;
test->flags = ACL_TEST_F_VOLATILE; test->flags = ACL_TEST_F_VOLATILE;
return 1; return 1;
@ -268,7 +268,7 @@ acl_fetch_req_ssl_ver(struct proxy *px, struct session *l4, void *l7, int dir,
/* OK that's enough. We have at least the whole message, and we have /* OK that's enough. We have at least the whole message, and we have
* the protocol version. * the protocol version.
*/ */
test->i = version; temp_pattern.data.integer = version;
test->flags = ACL_TEST_F_VOLATILE; test->flags = ACL_TEST_F_VOLATILE;
return 1; return 1;
@ -552,7 +552,7 @@ acl_fetch_rdp_cookie_cnt(struct proxy *px, struct session *l4, void *l7, int dir
return 0; return 0;
test->flags = ACL_TEST_F_VOLATILE; test->flags = ACL_TEST_F_VOLATILE;
test->i = ret; temp_pattern.data.integer = ret;
return 1; return 1;
} }
@ -813,8 +813,8 @@ int acl_match_dom(struct acl_test *test, struct acl_pattern *pattern)
/* Checks that the integer in <test> is included between min and max */ /* Checks that the integer in <test> is included between min and max */
int acl_match_int(struct acl_test *test, struct acl_pattern *pattern) int acl_match_int(struct acl_test *test, struct acl_pattern *pattern)
{ {
if ((!pattern->val.range.min_set || pattern->val.range.min <= test->i) && if ((!pattern->val.range.min_set || pattern->val.range.min <= temp_pattern.data.integer) &&
(!pattern->val.range.max_set || test->i <= pattern->val.range.max)) (!pattern->val.range.max_set || temp_pattern.data.integer <= pattern->val.range.max))
return ACL_PAT_PASS; return ACL_PAT_PASS;
return ACL_PAT_FAIL; return ACL_PAT_FAIL;
} }

View File

@ -1340,7 +1340,7 @@ int backend_parse_balance(const char **args, char *err, int errlen, struct proxy
/* All supported keywords must be declared here. */ /* All supported keywords must be declared here. */
/************************************************************************/ /************************************************************************/
/* set test->i to the number of enabled servers on the proxy */ /* set temp integer to the number of enabled servers on the proxy */
static int static int
acl_fetch_nbsrv(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_nbsrv(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1356,11 +1356,11 @@ acl_fetch_nbsrv(struct proxy *px, struct session *l4, void *l7, int dir,
return 0; return 0;
if (px->srv_act) if (px->srv_act)
test->i = px->srv_act; temp_pattern.data.integer = px->srv_act;
else if (px->lbprm.fbck) else if (px->lbprm.fbck)
test->i = 1; temp_pattern.data.integer = 1;
else else
test->i = px->srv_bck; temp_pattern.data.integer = px->srv_bck;
return 1; return 1;
} }
@ -1383,7 +1383,7 @@ acl_fetch_srv_is_up(struct proxy *px, struct session *l4, void *l7, int dir,
return 1; return 1;
} }
/* set test->i to the number of enabled servers on the proxy */ /* set temp integer to the number of enabled servers on the proxy */
static int static int
acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1399,7 +1399,7 @@ acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = 0; temp_pattern.data.integer = 0;
iterator = px->srv; iterator = px->srv;
while (iterator) { while (iterator) {
if ((iterator->state & SRV_RUNNING) == 0) { if ((iterator->state & SRV_RUNNING) == 0) {
@ -1407,31 +1407,31 @@ acl_fetch_connslots(struct proxy *px, struct session *l4, void *l7, int dir,
continue; continue;
} }
if (iterator->maxconn == 0 || iterator->maxqueue == 0) { if (iterator->maxconn == 0 || iterator->maxqueue == 0) {
test->i = -1; /* configuration is stupid */
temp_pattern.data.integer = -1;
return 1; return 1;
} }
test->i += (iterator->maxconn - iterator->cur_sess) temp_pattern.data.integer += (iterator->maxconn - iterator->cur_sess)
+ (iterator->maxqueue - iterator->nbpend); + (iterator->maxqueue - iterator->nbpend);
iterator = iterator->next; iterator = iterator->next;
} }
return 1; return 1;
} }
/* set test->i to the id of the backend */ /* set temp integer to the id of the backend */
static int static int
acl_fetch_be_id(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_be_id(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) { struct acl_expr *expr, struct acl_test *test) {
test->flags = ACL_TEST_F_READ_ONLY; test->flags = ACL_TEST_F_READ_ONLY;
temp_pattern.data.integer = l4->be->uuid;
test->i = l4->be->uuid;
return 1; return 1;
} }
/* set test->i to the id of the server */ /* set temp integer to the id of the server */
static int static int
acl_fetch_srv_id(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_srv_id(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) { struct acl_expr *expr, struct acl_test *test) {
@ -1440,13 +1440,12 @@ acl_fetch_srv_id(struct proxy *px, struct session *l4, void *l7, int dir,
return 0; return 0;
test->flags = ACL_TEST_F_READ_ONLY; test->flags = ACL_TEST_F_READ_ONLY;
temp_pattern.data.integer = target_srv(&l4->target)->puid;
test->i = target_srv(&l4->target)->puid;
return 1; return 1;
} }
/* set test->i to the number of connections per second reaching the backend */ /* set temp integer to the number of connections per second reaching the backend */
static int static int
acl_fetch_be_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_be_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1461,11 +1460,11 @@ acl_fetch_be_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = read_freq_ctr(&px->be_sess_per_sec); temp_pattern.data.integer = read_freq_ctr(&px->be_sess_per_sec);
return 1; return 1;
} }
/* set test->i to the number of concurrent connections on the backend */ /* set temp integer to the number of concurrent connections on the backend */
static int static int
acl_fetch_be_conn(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_be_conn(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1480,11 +1479,11 @@ acl_fetch_be_conn(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = px->beconn; temp_pattern.data.integer = px->beconn;
return 1; return 1;
} }
/* set test->i to the total number of queued connections on the backend */ /* set temp integer to the total number of queued connections on the backend */
static int static int
acl_fetch_queue_size(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_queue_size(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1499,11 +1498,11 @@ acl_fetch_queue_size(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = px->totpend; temp_pattern.data.integer = px->totpend;
return 1; return 1;
} }
/* set test->i to the total number of queued connections on the backend divided /* set temp integer to the total number of queued connections on the backend divided
* by the number of running servers and rounded up. If there is no running * by the number of running servers and rounded up. If there is no running
* server, we return twice the total, just as if we had half a running server. * server, we return twice the total, just as if we had half a running server.
* This is more or less correct anyway, since we expect the last server to come * This is more or less correct anyway, since we expect the last server to come
@ -1533,21 +1532,21 @@ acl_fetch_avg_queue_size(struct proxy *px, struct session *l4, void *l7, int dir
nbsrv = px->srv_bck; nbsrv = px->srv_bck;
if (nbsrv > 0) if (nbsrv > 0)
test->i = (px->totpend + nbsrv - 1) / nbsrv; temp_pattern.data.integer = (px->totpend + nbsrv - 1) / nbsrv;
else else
test->i = px->totpend * 2; temp_pattern.data.integer = px->totpend * 2;
return 1; return 1;
} }
/* set test->i to the number of concurrent connections on the server in the backend */ /* set temp integer to the number of concurrent connections on the server in the backend */
static int static int
acl_fetch_srv_conn(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_srv_conn(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
{ {
struct server *srv = expr->arg.srv; struct server *srv = expr->arg.srv;
test->i = srv->cur_sess; temp_pattern.data.integer = srv->cur_sess;
return 1; return 1;
} }

View File

@ -514,19 +514,17 @@ int make_proxy_line(char *buf, int buf_len, struct sockaddr_storage *src, struct
return ret; return ret;
} }
/* set test->i to the id of the frontend */ /* set temp integer to the id of the frontend */
static int static int
acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_fe_id(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) { struct acl_expr *expr, struct acl_test *test) {
test->flags = ACL_TEST_F_READ_ONLY; test->flags = ACL_TEST_F_READ_ONLY;
temp_pattern.data.integer = l4->fe->uuid;
test->i = l4->fe->uuid;
return 1; return 1;
} }
/* set test->i to the number of connections per second reaching the frontend */ /* set temp integer to the number of connections per second reaching the frontend */
static int static int
acl_fetch_fe_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_fe_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -541,11 +539,11 @@ acl_fetch_fe_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = read_freq_ctr(&px->fe_sess_per_sec); temp_pattern.data.integer = read_freq_ctr(&px->fe_sess_per_sec);
return 1; return 1;
} }
/* set test->i to the number of concurrent connections on the frontend */ /* set temp integer to the number of concurrent connections on the frontend */
static int static int
acl_fetch_fe_conn(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_fe_conn(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -560,7 +558,7 @@ acl_fetch_fe_conn(struct proxy *px, struct session *l4, void *l7, int dir,
if (!px) if (!px)
return 0; return 0;
test->i = px->feconn; temp_pattern.data.integer = px->feconn;
return 1; return 1;
} }

View File

@ -7919,7 +7919,7 @@ acl_fetch_stcode(struct proxy *px, struct session *l4, void *l7, int dir,
len = txn->rsp.sl.st.c_l; len = txn->rsp.sl.st.c_l;
ptr = txn->rsp.sol + txn->rsp.sl.st.c; ptr = txn->rsp.sol + txn->rsp.sl.st.c;
test->i = __strl2ui(ptr, len); temp_pattern.data.integer = __strl2ui(ptr, len);
test->flags = ACL_TEST_F_VOL_1ST; test->flags = ACL_TEST_F_VOL_1ST;
return 1; return 1;
} }
@ -7999,7 +7999,7 @@ acl_fetch_url_port(struct proxy *px, struct session *l4, void *l7, int dir,
/* Same optimization as url_ip */ /* Same optimization as url_ip */
url2sa(txn->req.sol + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->req->cons->addr.to); url2sa(txn->req.sol + txn->req.sl.rq.u, txn->req.sl.rq.u_l, &l4->req->cons->addr.to);
test->i = ntohs(((struct sockaddr_in *)&l4->req->cons->addr.to)->sin_port); temp_pattern.data.integer = ntohs(((struct sockaddr_in *)&l4->req->cons->addr.to)->sin_port);
if (px->options & PR_O_HTTP_PROXY) if (px->options & PR_O_HTTP_PROXY)
l4->flags |= SN_ADDR_SET; l4->flags |= SN_ADDR_SET;
@ -8093,7 +8093,7 @@ acl_fetch_hdr_cnt(struct proxy *px, struct session *l4, void *l7, char *sol,
while (http_find_header2(expr->arg.str, expr->arg_len, sol, idx, &ctx)) while (http_find_header2(expr->arg.str, expr->arg_len, sol, idx, &ctx))
cnt++; cnt++;
test->i = cnt; temp_pattern.data.integer = cnt;
test->flags = ACL_TEST_F_VOL_HDR; test->flags = ACL_TEST_F_VOL_HDR;
return 1; return 1;
} }
@ -8154,7 +8154,7 @@ acl_fetch_hdr_val(struct proxy *px, struct session *l4, void *l7, char *sol,
if (http_find_header2(expr->arg.str, expr->arg_len, sol, idx, ctx)) { if (http_find_header2(expr->arg.str, expr->arg_len, sol, idx, ctx)) {
test->flags |= ACL_TEST_F_FETCH_MORE; test->flags |= ACL_TEST_F_FETCH_MORE;
test->flags |= ACL_TEST_F_VOL_HDR; test->flags |= ACL_TEST_F_VOL_HDR;
test->i = strl2ic((char *)ctx->line + ctx->val, ctx->vlen); temp_pattern.data.integer = strl2ic((char *)ctx->line + ctx->val, ctx->vlen);
return 1; return 1;
} }

View File

@ -1286,12 +1286,12 @@ pattern_fetch_src6(struct proxy *px, struct session *l4, void *l7, int dir,
return 1; return 1;
} }
/* set test->i to the connection's source port */ /* set temp integer to the connection's source port */
static int static int
acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sport(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
{ {
if (!(test->i = get_host_port(&l4->si[0].addr.from))) if (!(temp_pattern.data.integer = get_host_port(&l4->si[0].addr.from)))
return 0; return 0;
test->flags = 0; test->flags = 0;
@ -1350,7 +1350,7 @@ pattern_fetch_dst6(struct proxy *px, struct session *l4, void *l7, int dir,
return 1; return 1;
} }
/* set test->i to the frontend connexion's destination port */ /* set temp integer to the frontend connexion's destination port */
static int static int
acl_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -1358,7 +1358,7 @@ acl_fetch_dport(struct proxy *px, struct session *l4, void *l7, int dir,
if (!(l4->flags & SN_FRT_ADDR_SET)) if (!(l4->flags & SN_FRT_ADDR_SET))
get_frt_addr(l4); get_frt_addr(l4);
if (!(test->i = get_host_port(&l4->si[0].addr.to))) if (!(temp_pattern.data.integer = get_host_port(&l4->si[0].addr.to)))
return 0; return 0;
test->flags = 0; test->flags = 0;

View File

@ -323,24 +323,22 @@ int protocol_disable_all(void)
/* All supported ACL keywords must be declared here. */ /* All supported ACL keywords must be declared here. */
/************************************************************************/ /************************************************************************/
/* set test->i to the number of connexions to the same listening socket */ /* set temp integer to the number of connexions to the same listening socket */
static int static int
acl_fetch_dconn(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_dconn(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
{ {
test->i = l4->listener->nbconn; temp_pattern.data.integer = l4->listener->nbconn;
return 1; return 1;
} }
/* set test->i to the id of the socket (listener) */ /* set temp integer to the id of the socket (listener) */
static int static int
acl_fetch_so_id(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_so_id(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) { struct acl_expr *expr, struct acl_test *test) {
test->flags = ACL_TEST_F_READ_ONLY; test->flags = ACL_TEST_F_READ_ONLY;
temp_pattern.data.integer = l4->listener->luid;
test->i = l4->listener->luid;
return 1; return 1;
} }

View File

@ -2232,22 +2232,22 @@ void session_shutdown(struct session *session, int why)
/* All supported ACL keywords must be declared here. */ /* All supported ACL keywords must be declared here. */
/************************************************************************/ /************************************************************************/
/* set test->i to the General Purpose Counter 0 value in the stksess entry <ts> */ /* set temp integer to the General Purpose Counter 0 value in the stksess entry <ts> */
static int static int
acl_fetch_get_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_get_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, gpc0); temp_pattern.data.integer = stktable_data_cast(ptr, gpc0);
} }
return 1; return 1;
} }
/* set test->i to the General Purpose Counter 0 value from the session's tracked /* set temp integer to the General Purpose Counter 0 value from the session's tracked
* frontend counters. * frontend counters.
*/ */
static int static int
@ -2259,7 +2259,7 @@ acl_fetch_sc1_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_get_gpc0(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_get_gpc0(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the General Purpose Counter 0 value from the session's tracked /* set temp integer to the General Purpose Counter 0 value from the session's tracked
* backend counters. * backend counters.
*/ */
static int static int
@ -2271,7 +2271,7 @@ acl_fetch_sc2_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_get_gpc0(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_get_gpc0(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the General Purpose Counter 0 value from the session's source /* set temp integer to the General Purpose Counter 0 value from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2294,24 +2294,24 @@ acl_fetch_src_get_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Increment the General Purpose Counter 0 value in the stksess entry <ts> and /* Increment the General Purpose Counter 0 value in the stksess entry <ts> and
* return it into test->i. * return it into temp integer.
*/ */
static int static int
acl_fetch_inc_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_inc_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = ++stktable_data_cast(ptr, gpc0); temp_pattern.data.integer = ++stktable_data_cast(ptr, gpc0);
} }
return 1; return 1;
} }
/* Increment the General Purpose Counter 0 value from the session's tracked /* Increment the General Purpose Counter 0 value from the session's tracked
* frontend counters and return it into test->i. * frontend counters and return it into temp integer.
*/ */
static int static int
acl_fetch_sc1_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2323,7 +2323,7 @@ acl_fetch_sc1_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Increment the General Purpose Counter 0 value from the session's tracked /* Increment the General Purpose Counter 0 value from the session's tracked
* backend counters and return it into test->i. * backend counters and return it into temp integer.
*/ */
static int static int
acl_fetch_sc2_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2335,7 +2335,7 @@ acl_fetch_sc2_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Increment the General Purpose Counter 0 value from the session's source /* Increment the General Purpose Counter 0 value from the session's source
* address in the table pointed to by expr, and return it into test->i. * address in the table pointed to by expr, and return it into temp integer.
*/ */
static int static int
acl_fetch_src_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_src_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2357,25 +2357,25 @@ acl_fetch_src_inc_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Clear the General Purpose Counter 0 value in the stksess entry <ts> and /* Clear the General Purpose Counter 0 value in the stksess entry <ts> and
* return its previous value into test->i. * return its previous value into temp integer.
*/ */
static int static int
acl_fetch_clr_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_clr_gpc0(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_GPC0);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, gpc0); temp_pattern.data.integer = stktable_data_cast(ptr, gpc0);
stktable_data_cast(ptr, gpc0) = 0; stktable_data_cast(ptr, gpc0) = 0;
} }
return 1; return 1;
} }
/* Clear the General Purpose Counter 0 value from the session's tracked /* Clear the General Purpose Counter 0 value from the session's tracked
* frontend counters and return its previous value into test->i. * frontend counters and return its previous value into temp integer.
*/ */
static int static int
acl_fetch_sc1_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2387,7 +2387,7 @@ acl_fetch_sc1_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Clear the General Purpose Counter 0 value from the session's tracked /* Clear the General Purpose Counter 0 value from the session's tracked
* backend counters and return its previous value into test->i. * backend counters and return its previous value into temp integer.
*/ */
static int static int
acl_fetch_sc2_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2399,7 +2399,7 @@ acl_fetch_sc2_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
} }
/* Clear the General Purpose Counter 0 value from the session's source address /* Clear the General Purpose Counter 0 value from the session's source address
* in the table pointed to by expr, and return its previous value into test->i. * in the table pointed to by expr, and return its previous value into temp integer.
*/ */
static int static int
acl_fetch_src_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_src_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
@ -2420,22 +2420,22 @@ acl_fetch_src_clr_gpc0(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_clr_gpc0(&px->table, test, stktable_update_key(&px->table, key)); return acl_fetch_clr_gpc0(&px->table, test, stktable_update_key(&px->table, key));
} }
/* set test->i to the cumulated number of connections in the stksess entry <ts> */ /* set temp integer to the cumulated number of connections in the stksess entry <ts> */
static int static int
acl_fetch_conn_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_conn_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, conn_cnt); temp_pattern.data.integer = stktable_data_cast(ptr, conn_cnt);
} }
return 1; return 1;
} }
/* set test->i to the cumulated number of connections from the session's tracked FE counters */ /* set temp integer to the cumulated number of connections from the session's tracked FE counters */
static int static int
acl_fetch_sc1_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2446,7 +2446,7 @@ acl_fetch_sc1_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cnt(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_conn_cnt(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the cumulated number of connections from the session's tracked BE counters */ /* set temp integer to the cumulated number of connections from the session's tracked BE counters */
static int static int
acl_fetch_sc2_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2457,7 +2457,7 @@ acl_fetch_sc2_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cnt(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_conn_cnt(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the cumulated number of connections from the session's source /* set temp integer to the cumulated number of connections from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2479,23 +2479,23 @@ acl_fetch_src_conn_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cnt(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_conn_cnt(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the connection rate in the stksess entry <ts> over the configured period */ /* set temp integer to the connection rate in the stksess entry <ts> over the configured period */
static int static int
acl_fetch_conn_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_conn_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate),
table->data_arg[STKTABLE_DT_CONN_RATE].u); table->data_arg[STKTABLE_DT_CONN_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the connection rate from the session's tracked FE counters over /* set temp integer to the connection rate from the session's tracked FE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2508,7 +2508,7 @@ acl_fetch_sc1_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_conn_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the connection rate from the session's tracked BE counters over /* set temp integer to the connection rate from the session's tracked BE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2521,7 +2521,7 @@ acl_fetch_sc2_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_conn_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the connection rate from the session's source address in the /* set temp integer to the connection rate from the session's source address in the
* table pointed to by expr, over the configured period. * table pointed to by expr, over the configured period.
*/ */
static int static int
@ -2543,7 +2543,7 @@ acl_fetch_src_conn_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_conn_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the number of connections from the session's source address /* set temp integer to the number of connections from the session's source address
* in the table pointed to by expr, after updating it. * in the table pointed to by expr, after updating it.
*/ */
static int static int
@ -2572,28 +2572,28 @@ acl_fetch_src_updt_conn_cnt(struct proxy *px, struct session *l4, void *l7, int
if (!ptr) if (!ptr)
return 0; /* parameter not stored in this table */ return 0; /* parameter not stored in this table */
test->i = ++stktable_data_cast(ptr, conn_cnt); temp_pattern.data.integer = ++stktable_data_cast(ptr, conn_cnt);
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
return 1; return 1;
} }
/* set test->i to the number of concurrent connections in the stksess entry <ts> */ /* set temp integer to the number of concurrent connections in the stksess entry <ts> */
static int static int
acl_fetch_conn_cur(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_conn_cur(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_CUR); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_CONN_CUR);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, conn_cur); temp_pattern.data.integer = stktable_data_cast(ptr, conn_cur);
} }
return 1; return 1;
} }
/* set test->i to the number of concurrent connections from the session's tracked FE counters */ /* set temp integer to the number of concurrent connections from the session's tracked FE counters */
static int static int
acl_fetch_sc1_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2604,7 +2604,7 @@ acl_fetch_sc1_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cur(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_conn_cur(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the number of concurrent connections from the session's tracked BE counters */ /* set temp integer to the number of concurrent connections from the session's tracked BE counters */
static int static int
acl_fetch_sc2_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2615,7 +2615,7 @@ acl_fetch_sc2_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cur(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_conn_cur(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the number of concurrent connections from the session's source /* set temp integer to the number of concurrent connections from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2637,22 +2637,22 @@ acl_fetch_src_conn_cur(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_conn_cur(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_conn_cur(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the cumulated number of sessions in the stksess entry <ts> */ /* set temp integer to the cumulated number of sessions in the stksess entry <ts> */
static int static int
acl_fetch_sess_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_sess_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_SESS_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_SESS_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, sess_cnt); temp_pattern.data.integer = stktable_data_cast(ptr, sess_cnt);
} }
return 1; return 1;
} }
/* set test->i to the cumulated number of sessions from the session's tracked FE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
static int static int
acl_fetch_sc1_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2663,7 +2663,7 @@ acl_fetch_sc1_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_cnt(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_sess_cnt(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the cumulated number of sessions from the session's tracked BE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
static int static int
acl_fetch_sc2_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2674,7 +2674,7 @@ acl_fetch_sc2_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_cnt(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_sess_cnt(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the cumulated number of session from the session's source /* set temp integer to the cumulated number of session from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2696,23 +2696,23 @@ acl_fetch_src_sess_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_cnt(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_sess_cnt(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the session rate in the stksess entry <ts> over the configured period */ /* set temp integer to the session rate in the stksess entry <ts> over the configured period */
static int static int
acl_fetch_sess_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_sess_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_SESS_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_SESS_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate),
table->data_arg[STKTABLE_DT_SESS_RATE].u); table->data_arg[STKTABLE_DT_SESS_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the session rate from the session's tracked FE counters over /* set temp integer to the session rate from the session's tracked FE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2725,7 +2725,7 @@ acl_fetch_sc1_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_sess_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the session rate from the session's tracked BE counters over /* set temp integer to the session rate from the session's tracked BE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2738,7 +2738,7 @@ acl_fetch_sc2_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_sess_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the session rate from the session's source address in the /* set temp integer to the session rate from the session's source address in the
* table pointed to by expr, over the configured period. * table pointed to by expr, over the configured period.
*/ */
static int static int
@ -2760,22 +2760,22 @@ acl_fetch_src_sess_rate(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_sess_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_sess_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the cumulated number of sessions in the stksess entry <ts> */ /* set temp integer to the cumulated number of sessions in the stksess entry <ts> */
static int static int
acl_fetch_http_req_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_http_req_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_REQ_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_REQ_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, http_req_cnt); temp_pattern.data.integer = stktable_data_cast(ptr, http_req_cnt);
} }
return 1; return 1;
} }
/* set test->i to the cumulated number of sessions from the session's tracked FE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
static int static int
acl_fetch_sc1_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2786,7 +2786,7 @@ acl_fetch_sc1_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_req_cnt(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_http_req_cnt(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the cumulated number of sessions from the session's tracked BE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
static int static int
acl_fetch_sc2_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2797,7 +2797,7 @@ acl_fetch_sc2_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_req_cnt(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_http_req_cnt(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the cumulated number of session from the session's source /* set temp integer to the cumulated number of session from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2819,23 +2819,23 @@ acl_fetch_src_http_req_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_req_cnt(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_http_req_cnt(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the session rate in the stksess entry <ts> over the configured period */ /* set temp integer to the session rate in the stksess entry <ts> over the configured period */
static int static int
acl_fetch_http_req_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_http_req_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_REQ_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_REQ_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate),
table->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u); table->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the session rate from the session's tracked FE counters over /* set temp integer to the session rate from the session's tracked FE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2848,7 +2848,7 @@ acl_fetch_sc1_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_req_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_http_req_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the session rate from the session's tracked BE counters over /* set temp integer to the session rate from the session's tracked BE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2861,7 +2861,7 @@ acl_fetch_sc2_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_req_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_http_req_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the session rate from the session's source address in the /* set temp integer to the session rate from the session's source address in the
* table pointed to by expr, over the configured period. * table pointed to by expr, over the configured period.
*/ */
static int static int
@ -2883,22 +2883,22 @@ acl_fetch_src_http_req_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_req_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_http_req_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the cumulated number of sessions in the stksess entry <ts> */ /* set temp integer to the cumulated number of sessions in the stksess entry <ts> */
static int static int
acl_fetch_http_err_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_http_err_cnt(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_ERR_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_ERR_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, http_err_cnt); temp_pattern.data.integer = stktable_data_cast(ptr, http_err_cnt);
} }
return 1; return 1;
} }
/* set test->i to the cumulated number of sessions from the session's tracked FE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked FE counters */
static int static int
acl_fetch_sc1_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc1_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2909,7 +2909,7 @@ acl_fetch_sc1_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_err_cnt(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_http_err_cnt(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the cumulated number of sessions from the session's tracked BE counters */ /* set temp integer to the cumulated number of sessions from the session's tracked BE counters */
static int static int
acl_fetch_sc2_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_sc2_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -2920,7 +2920,7 @@ acl_fetch_sc2_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_err_cnt(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_http_err_cnt(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the cumulated number of session from the session's source /* set temp integer to the cumulated number of session from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -2942,23 +2942,23 @@ acl_fetch_src_http_err_cnt(struct proxy *px, struct session *l4, void *l7, int d
return acl_fetch_http_err_cnt(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_http_err_cnt(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the session rate in the stksess entry <ts> over the configured period */ /* set temp integer to the session rate in the stksess entry <ts> over the configured period */
static int static int
acl_fetch_http_err_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_http_err_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_ERR_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_HTTP_ERR_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate),
table->data_arg[STKTABLE_DT_HTTP_ERR_RATE].u); table->data_arg[STKTABLE_DT_HTTP_ERR_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the session rate from the session's tracked FE counters over /* set temp integer to the session rate from the session's tracked FE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2971,7 +2971,7 @@ acl_fetch_sc1_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_err_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_http_err_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the session rate from the session's tracked BE counters over /* set temp integer to the session rate from the session's tracked BE counters over
* the configured period. * the configured period.
*/ */
static int static int
@ -2984,7 +2984,7 @@ acl_fetch_sc2_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_err_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_http_err_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the session rate from the session's source address in the /* set temp integer to the session rate from the session's source address in the
* table pointed to by expr, over the configured period. * table pointed to by expr, over the configured period.
*/ */
static int static int
@ -3006,23 +3006,23 @@ acl_fetch_src_http_err_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_http_err_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_http_err_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the number of kbytes received from clients matching the stksess entry <ts> */ /* set temp integer to the number of kbytes received from clients matching the stksess entry <ts> */
static int static int
acl_fetch_kbytes_in(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_kbytes_in(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_IN_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_IN_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, bytes_in_cnt) >> 10; temp_pattern.data.integer = stktable_data_cast(ptr, bytes_in_cnt) >> 10;
} }
return 1; return 1;
} }
/* set test->i to the number of kbytes received from clients according to the /* set temp integer to the number of kbytes received from clients according to the
* session's tracked FE counters. * session's tracked FE counters.
*/ */
static int static int
@ -3035,7 +3035,7 @@ acl_fetch_sc1_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_kbytes_in(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_kbytes_in(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the number of kbytes received from clients according to the /* set temp integer to the number of kbytes received from clients according to the
* session's tracked BE counters. * session's tracked BE counters.
*/ */
static int static int
@ -3048,7 +3048,7 @@ acl_fetch_sc2_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_kbytes_in(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_kbytes_in(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the number of kbytes received from the session's source /* set temp integer to the number of kbytes received from the session's source
* address in the table pointed to by expr. * address in the table pointed to by expr.
*/ */
static int static int
@ -3070,25 +3070,25 @@ acl_fetch_src_kbytes_in(struct proxy *px, struct session *l4, void *l7, int dir,
return acl_fetch_kbytes_in(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_kbytes_in(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the bytes rate from clients in the stksess entry <ts> over the /* set temp integer to the bytes rate from clients in the stksess entry <ts> over the
* configured period. * configured period.
*/ */
static int static int
acl_fetch_bytes_in_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_bytes_in_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_IN_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_IN_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
table->data_arg[STKTABLE_DT_BYTES_IN_RATE].u); table->data_arg[STKTABLE_DT_BYTES_IN_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the bytes rate from clients from the session's tracked FE /* set temp integer to the bytes rate from clients from the session's tracked FE
* counters over the configured period. * counters over the configured period.
*/ */
static int static int
@ -3101,7 +3101,7 @@ acl_fetch_sc1_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_in_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_bytes_in_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the bytes rate from clients from the session's tracked BE /* set temp integer to the bytes rate from clients from the session's tracked BE
* counters over the configured period. * counters over the configured period.
*/ */
static int static int
@ -3114,7 +3114,7 @@ acl_fetch_sc2_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_in_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_bytes_in_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the bytes rate from clients from the session's source address /* set temp integer to the bytes rate from clients from the session's source address
* in the table pointed to by expr, over the configured period. * in the table pointed to by expr, over the configured period.
*/ */
static int static int
@ -3136,23 +3136,23 @@ acl_fetch_src_bytes_in_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_in_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_bytes_in_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the number of kbytes sent to clients matching the stksess entry <ts> */ /* set temp integer to the number of kbytes sent to clients matching the stksess entry <ts> */
static int static int
acl_fetch_kbytes_out(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_kbytes_out(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_OUT_CNT); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_OUT_CNT);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = stktable_data_cast(ptr, bytes_out_cnt) >> 10; temp_pattern.data.integer = stktable_data_cast(ptr, bytes_out_cnt) >> 10;
} }
return 1; return 1;
} }
/* set test->i to the number of kbytes sent to clients according to the session's /* set temp integer to the number of kbytes sent to clients according to the session's
* tracked FE counters. * tracked FE counters.
*/ */
static int static int
@ -3165,7 +3165,7 @@ acl_fetch_sc1_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
return acl_fetch_kbytes_out(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_kbytes_out(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the number of kbytes sent to clients according to the session's /* set temp integer to the number of kbytes sent to clients according to the session's
* tracked BE counters. * tracked BE counters.
*/ */
static int static int
@ -3178,7 +3178,7 @@ acl_fetch_sc2_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
return acl_fetch_kbytes_out(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_kbytes_out(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the number of kbytes sent to the session's source address in /* set temp integer to the number of kbytes sent to the session's source address in
* the table pointed to by expr. * the table pointed to by expr.
*/ */
static int static int
@ -3200,25 +3200,25 @@ acl_fetch_src_kbytes_out(struct proxy *px, struct session *l4, void *l7, int dir
return acl_fetch_kbytes_out(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_kbytes_out(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the bytes rate to clients in the stksess entry <ts> over the /* set temp integer to the bytes rate to clients in the stksess entry <ts> over the
* configured period. * configured period.
*/ */
static int static int
acl_fetch_bytes_out_rate(struct stktable *table, struct acl_test *test, struct stksess *ts) acl_fetch_bytes_out_rate(struct stktable *table, struct acl_test *test, struct stksess *ts)
{ {
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = 0; temp_pattern.data.integer = 0;
if (ts != NULL) { if (ts != NULL) {
void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_OUT_RATE); void *ptr = stktable_data_ptr(table, ts, STKTABLE_DT_BYTES_OUT_RATE);
if (!ptr) if (!ptr)
return 0; /* parameter not stored */ return 0; /* parameter not stored */
test->i = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate), temp_pattern.data.integer = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
table->data_arg[STKTABLE_DT_BYTES_OUT_RATE].u); table->data_arg[STKTABLE_DT_BYTES_OUT_RATE].u);
} }
return 1; return 1;
} }
/* set test->i to the bytes rate to clients from the session's tracked FE counters /* set temp integer to the bytes rate to clients from the session's tracked FE counters
* over the configured period. * over the configured period.
*/ */
static int static int
@ -3231,7 +3231,7 @@ acl_fetch_sc1_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_out_rate(l4->stkctr1_table, test, l4->stkctr1_entry); return acl_fetch_bytes_out_rate(l4->stkctr1_table, test, l4->stkctr1_entry);
} }
/* set test->i to the bytes rate to clients from the session's tracked BE counters /* set temp integer to the bytes rate to clients from the session's tracked BE counters
* over the configured period. * over the configured period.
*/ */
static int static int
@ -3244,7 +3244,7 @@ acl_fetch_sc2_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_out_rate(l4->stkctr2_table, test, l4->stkctr2_entry); return acl_fetch_bytes_out_rate(l4->stkctr2_table, test, l4->stkctr2_entry);
} }
/* set test->i to the bytes rate to client from the session's source address in /* set temp integer to the bytes rate to client from the session's source address in
* the table pointed to by expr, over the configured period. * the table pointed to by expr, over the configured period.
*/ */
static int static int
@ -3266,7 +3266,7 @@ acl_fetch_src_bytes_out_rate(struct proxy *px, struct session *l4, void *l7, int
return acl_fetch_bytes_out_rate(&px->table, test, stktable_lookup_key(&px->table, key)); return acl_fetch_bytes_out_rate(&px->table, test, stktable_lookup_key(&px->table, key));
} }
/* set test->i to the number of used entries in the table pointed to by expr. */ /* set temp integer to the number of used entries in the table pointed to by expr. */
static int static int
acl_fetch_table_cnt(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_table_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -3278,11 +3278,11 @@ acl_fetch_table_cnt(struct proxy *px, struct session *l4, void *l7, int dir,
return 0; /* table not found */ return 0; /* table not found */
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = px->table.current; temp_pattern.data.integer = px->table.current;
return 1; return 1;
} }
/* set test->i to the number of free entries in the table pointed to by expr. */ /* set temp integer to the number of free entries in the table pointed to by expr. */
static int static int
acl_fetch_table_avl(struct proxy *px, struct session *l4, void *l7, int dir, acl_fetch_table_avl(struct proxy *px, struct session *l4, void *l7, int dir,
struct acl_expr *expr, struct acl_test *test) struct acl_expr *expr, struct acl_test *test)
@ -3294,7 +3294,7 @@ acl_fetch_table_avl(struct proxy *px, struct session *l4, void *l7, int dir,
return 0; /* table not found */ return 0; /* table not found */
test->flags = ACL_TEST_F_VOL_TEST; test->flags = ACL_TEST_F_VOL_TEST;
test->i = px->table.size - px->table.current; temp_pattern.data.integer = px->table.size - px->table.current;
return 1; return 1;
} }