mirror of
https://github.com/haproxy/haproxy.git
synced 2026-04-29 02:00:37 -04:00
MAJOR: stick-tables: remove key storage from the key struct
Now, the key struct only points to the storage provided by the sample as input.
This commit is contained in:
parent
5d24ebc3d7
commit
7e25df3f17
5 changed files with 27 additions and 49 deletions
|
|
@ -47,49 +47,6 @@ void tcp_res_cont_keywords_register(struct action_kw_list *kw_list);
|
|||
/* Export some samples. */
|
||||
int smp_fetch_src(const struct arg *args, struct sample *smp, const char *kw, void *private);
|
||||
|
||||
/* Converts the INET/INET6 source address to a stick_table key usable for table
|
||||
* lookups. <type> can be SMP_T_IPV4 or SMP_T_IPV6. The function
|
||||
* try to convert the incoming IP to the type expected by the sticktable.
|
||||
* Returns either NULL if the source cannot be converted (eg: not IPv4) or a
|
||||
* pointer to the converted result in static_table_key in the appropriate format
|
||||
* (IP).
|
||||
*/
|
||||
static inline struct stktable_key *addr_to_stktable_key(struct sockaddr_storage *addr, long type)
|
||||
{
|
||||
switch (addr->ss_family) {
|
||||
case AF_INET:
|
||||
/* Convert IPv4 to IPv4 key. */
|
||||
if (type == SMP_T_IPV4) {
|
||||
static_table_key->key = (void *)&((struct sockaddr_in *)addr)->sin_addr;
|
||||
break;
|
||||
}
|
||||
/* Convert IPv4 to IPv6 key. */
|
||||
if (type == SMP_T_IPV6) {
|
||||
v4tov6(&static_table_key->data.ipv6, &((struct sockaddr_in *)addr)->sin_addr);
|
||||
static_table_key->key = &static_table_key->data.ipv6;
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
case AF_INET6:
|
||||
/* Convert IPv6 to IPv4 key. This conversion can be failed. */
|
||||
if (type == SMP_T_IPV4) {
|
||||
if (!v6tov4(&static_table_key->data.ipv4, &((struct sockaddr_in6 *)addr)->sin6_addr))
|
||||
return NULL;
|
||||
static_table_key->key = &static_table_key->data.ipv4;
|
||||
break;
|
||||
}
|
||||
/* Convert IPv6 to IPv6 key. */
|
||||
if (type == SMP_T_IPV6) {
|
||||
static_table_key->key = (void *)&((struct sockaddr_in6 *)addr)->sin6_addr;
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
return static_table_key;
|
||||
}
|
||||
|
||||
/* for a tcp-request action ACT_TCP_TRK_*, return a tracking index starting at
|
||||
* zero for SC0. Unknown actions also return zero.
|
||||
|
|
|
|||
|
|
@ -175,7 +175,6 @@ extern struct stktable_data_type stktable_data_types[STKTABLE_DATA_TYPES];
|
|||
struct stktable_key {
|
||||
void *key; /* pointer on key buffer */
|
||||
size_t key_len; /* data len to read in buff in case of null terminated string */
|
||||
union sample_value data;
|
||||
};
|
||||
|
||||
/* WARNING: if new fields are added, they must be initialized in stream_accept()
|
||||
|
|
|
|||
|
|
@ -1051,7 +1051,7 @@ void init(int argc, char **argv)
|
|||
|
||||
swap_buffer = (char *)calloc(1, global.tune.bufsize);
|
||||
get_http_auth_buff = (char *)calloc(1, global.tune.bufsize);
|
||||
static_table_key = calloc(1, sizeof(*static_table_key) + global.tune.bufsize);
|
||||
static_table_key = calloc(1, sizeof(*static_table_key));
|
||||
|
||||
fdinfo = (struct fdinfo *)calloc(1,
|
||||
sizeof(struct fdinfo) * (global.maxsock));
|
||||
|
|
|
|||
|
|
@ -521,7 +521,6 @@ struct stktable_key *smp_to_stkey(struct sample *smp, struct stktable *t)
|
|||
default: /* impossible case. */
|
||||
return NULL;
|
||||
}
|
||||
static_table_key->data = smp->data.u;
|
||||
|
||||
return static_table_key;
|
||||
}
|
||||
|
|
|
|||
29
src/stream.c
29
src/stream.c
|
|
@ -2597,11 +2597,20 @@ smp_fetch_sc_stkctr(struct session *sess, struct stream *strm, const struct arg
|
|||
else if (num > 9) { /* src_* variant, args[0] = table */
|
||||
struct stktable_key *key;
|
||||
struct connection *conn = objt_conn(sess->origin);
|
||||
struct sample smp;
|
||||
|
||||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
key = addr_to_stktable_key(&conn->addr.from, args->data.prx->table.type);
|
||||
/* Fetch source adress in a sample. */
|
||||
smp.px = NULL;
|
||||
smp.sess = sess;
|
||||
smp.strm = strm;
|
||||
if (!smp_fetch_src(NULL, &smp, NULL, NULL))
|
||||
return NULL;
|
||||
|
||||
/* Converts into key. */
|
||||
key = smp_to_stkey(&smp, &args->data.prx->table);
|
||||
if (!key)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -2647,6 +2656,7 @@ smp_create_src_stkctr(struct session *sess, struct stream *strm, const struct ar
|
|||
static struct stkctr stkctr;
|
||||
struct stktable_key *key;
|
||||
struct connection *conn = objt_conn(sess->origin);
|
||||
struct sample smp;
|
||||
|
||||
if (strncmp(kw, "src_", 4) != 0)
|
||||
return NULL;
|
||||
|
|
@ -2654,7 +2664,15 @@ smp_create_src_stkctr(struct session *sess, struct stream *strm, const struct ar
|
|||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
key = addr_to_stktable_key(&conn->addr.from, args->data.prx->table.type);
|
||||
/* Fetch source adress in a sample. */
|
||||
smp.px = NULL;
|
||||
smp.sess = sess;
|
||||
smp.strm = strm;
|
||||
if (!smp_fetch_src(NULL, &smp, NULL, NULL))
|
||||
return NULL;
|
||||
|
||||
/* Converts into key. */
|
||||
key = smp_to_stkey(&smp, &args->data.prx->table);
|
||||
if (!key)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -2867,7 +2885,12 @@ smp_fetch_src_updt_conn_cnt(const struct arg *args, struct sample *smp, const ch
|
|||
if (!conn)
|
||||
return 0;
|
||||
|
||||
key = addr_to_stktable_key(&conn->addr.from, smp->px->table.type);
|
||||
/* Fetch source adress in a sample. */
|
||||
if (!smp_fetch_src(NULL, smp, NULL, NULL))
|
||||
return 0;
|
||||
|
||||
/* Converts into key. */
|
||||
key = smp_to_stkey(smp, &args->data.prx->table);
|
||||
if (!key)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue