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 66df33c..17404d4 100644
--- a/include/proto/proto_tcp.h
+++ b/include/proto/proto_tcp.h
@@ -47,49 +47,6 @@
 /* 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.
diff --git a/include/types/stick_table.h b/include/types/stick_table.h
index e6fbfc2..2800add 100644
--- a/include/types/stick_table.h
+++ b/include/types/stick_table.h
@@ -175,7 +175,6 @@
 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 4110893..4ff05ab 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1051,7 +1051,7 @@
 
 	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 e9e9304..9c053bc 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -521,7 +521,6 @@
 	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 5280e37..278bdb8 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -2597,11 +2597,20 @@
 	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 @@
 	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 @@
 	if (!conn)
 		return NULL;
 
+	/* 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;
+
-	key = addr_to_stktable_key(&conn->addr.from, args->data.prx->table.type);
+	/* Converts into key. */
+	key = smp_to_stkey(&smp, &args->data.prx->table);
 	if (!key)
 		return NULL;
 
@@ -2867,7 +2885,12 @@
 	if (!conn)
 		return 0;
 
+	/* Fetch source adress in a sample. */
+	if (!smp_fetch_src(NULL, smp, NULL, NULL))
+		return 0;
+
-	key = addr_to_stktable_key(&conn->addr.from, smp->px->table.type);
+	/* Converts into key. */
+	key = smp_to_stkey(smp, &args->data.prx->table);
 	if (!key)
 		return 0;