From: Thierry FOURNIER Date: Fri, 24 Jul 2015 17:31:59 +0000 (+0200) Subject: MAJOR: stick-tables: remove key storage from the key struct X-Git-Tag: v1.6-dev4~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7e25df3f17142259fa623a525b7a28866acb9b28;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/proto/proto_tcp.h b/include/proto/proto_tcp.h index 66df33c3f7..17404d44a8 100644 --- a/include/proto/proto_tcp.h +++ b/include/proto/proto_tcp.h @@ -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. 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. diff --git a/include/types/stick_table.h b/include/types/stick_table.h index e6fbfc23f7..2800add11e 100644 --- a/include/types/stick_table.h +++ b/include/types/stick_table.h @@ -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() diff --git a/src/haproxy.c b/src/haproxy.c index 4110893384..4ff05abd8e 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -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)); diff --git a/src/stick_table.c b/src/stick_table.c index e9e9304232..9c053bc227 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -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; } diff --git a/src/stream.c b/src/stream.c index 5280e372f2..278bdb8567 100644 --- a/src/stream.c +++ b/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;