/* sc_* variant, args[0] = ctr# (mandatory) */
num = args[arg++].data.sint;
}
- else if (num > 9) { /* src_* variant, args[0] = table */
- struct stksess *entry;
- struct connection *conn = objt_conn(sess->origin);
- struct sample smp;
- if (!conn)
- return NULL;
-
- /* Fetch source address in a sample. */
- smp.px = NULL;
- smp.sess = sess;
- smp.strm = strm;
- if (!smp_fetch_src || !smp_fetch_src(empty_arg_list, &smp, "src", NULL))
- return NULL;
-
- entry = smp_fetch_stksess(args->data.t, &smp, 0);
-
- stkctr->table = args->data.t;
- stkctr_set_entry(stkctr, entry);
- return stkctr;
- }
+ BUG_ON(num > 9, "unexpected value");
/* Here, <num> contains the counter number from 0 to 9 for
* the sc[0-9]_ form, or even higher using sc_(num) if needed.
}
/* same as smp_fetch_sc_stkctr() but dedicated to src_* and can create
- * the entry if it doesn't exist yet. This is needed for a few fetch
- * functions which need to create an entry, such as src_inc_gpc* and
- * src_clr_gpc*.
+ * the entry if it doesn't exist yet and <create> is set to 1.
*/
struct stkctr *
-smp_create_src_stkctr(struct session *sess, struct stream *strm, const struct arg *args, const char *kw, struct stkctr *stkctr)
+smp_fetch_src_stkctr(struct session *sess, struct stream *strm,
+ const struct arg *args, struct stkctr *stkctr, int create)
{
struct stksess *entry;
struct connection *conn = objt_conn(sess->origin);
struct sample smp;
- if (strncmp(kw, "src_", 4) != 0)
- return NULL;
-
if (!conn)
return NULL;
if (!smp_fetch_src || !smp_fetch_src(empty_arg_list, &smp, "src", NULL))
return NULL;
- entry = smp_fetch_stksess(args->data.t, &smp, 1);
+ entry = smp_fetch_stksess(args->data.t, &smp, create);
stkctr->table = args->data.t;
stkctr_set_entry(stkctr, entry);
idx = args[0].data.sint;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args + 1, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
idx = args[0].data.sint;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args + 1, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
idx = args[0].data.sint;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args + 1, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
idx = args[0].data.sint;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args + 1, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
-
return smp_fetch_inc_gpc(stkctr, smp, idx, (stkctr == &tmpstkctr) ? 1 : 0);
}
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
-
return smp_fetch_inc_gpc0(stkctr, smp, (stkctr == &tmpstkctr) ? 1 : 0);
}
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
-
return smp_fetch_inc_gpc1(stkctr, smp, (stkctr == &tmpstkctr) ? 1 : 0);
}
idx = args[0].data.sint;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args + 1, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args + 1, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
-
return smp_fetch_clr_gpc(stkctr, smp, idx, (stkctr == &tmpstkctr) ? 1 : 0);
}
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
-
return smp_fetch_clr_gpc0(stkctr, smp, (stkctr == &tmpstkctr) ? 1 : 0);
}
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 1);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
- if (!stkctr_entry(stkctr))
- stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
-
return smp_fetch_clr_gpc1(stkctr, smp, (stkctr == &tmpstkctr) ? 1 : 0);
}
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
static int
smp_fetch_src_updt_conn_cnt(const struct arg *args, struct sample *smp, const char *kw, void *private)
{
- struct connection *conn = objt_conn(smp->sess->origin);
- struct stksess *ts;
struct stkctr tmpstkctr;
+ struct stkctr *stkctr;
- if (!conn)
- return 0;
-
- /* Fetch source address in a sample. */
- if (!smp_fetch_src || !smp_fetch_src(empty_arg_list, smp, "src", NULL))
- return 0;
-
- tmpstkctr.table = args->data.t;
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 1);
- if ((ts = smp_fetch_stksess(args->data.t, smp, 1)) == NULL)
- /* entry does not exist and could not be created */
+ if (!stkctr)
return 0;
- stkctr_set_entry(&tmpstkctr, ts);
-
- return smp_fetch_updt_conn_cnt(&tmpstkctr, smp);
+ return smp_fetch_updt_conn_cnt(stkctr, smp);
}
static int smp_fetch_conn_cur(struct stkctr *stkctr, struct sample *smp, int decrefcnt)
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;
struct stkctr tmpstkctr;
struct stkctr *stkctr;
- stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+ if (strncmp(kw, "src_", 4) == 0)
+ stkctr = smp_fetch_src_stkctr(smp->sess, smp->strm, args, &tmpstkctr, 0);
+ else
+ stkctr = smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw, &tmpstkctr);
+
if (!stkctr)
return 0;