]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: peers: fix internal/network key type mapping.
authorEmeric Brun <ebrun@haproxy.com>
Tue, 2 Jun 2020 09:17:42 +0000 (11:17 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 2 Jun 2020 14:25:19 +0000 (16:25 +0200)
Network types were directly and mistakenly mapped on sample types:

This patch fix the doc with values effectively used to keep backward
compatiblitiy on existing implementations.

In addition it adds an internal/network mapping for key types to avoid
further mistakes adding or modifying internals types.

This patch should be backported on all maintained branches,
particularly until v1.8 included for documentation part.

doc/peers-v2.0.txt
src/peers.c

index 477e7bb84258057b11c18fa29c301be99f128a5d..344cb5609176202ebc0c9499c701ce92f819e9ee 100644 (file)
@@ -191,11 +191,11 @@ between the "Sender Table ID" to identify it directly in case of "Table Switch M
 
 Table Type present the numeric type of key used to store stick table entries:
 integer
0: signed integer
1: IPv4 address
2: IPv6 address
3: string
4: binary
2: signed integer
4: IPv4 address
5: IPv6 address
6: string
7: binary
 
 Table Keylen present the key length or max length in case of strings or binary (padded with 0).
 
index 2e54ab94d5a60b1b9130174f5a3ec4bc49df40ba..9782ff3c1e95587215cbf7a9920c1a635fabc95f 100644 (file)
@@ -125,6 +125,48 @@ enum {
        PEER_MSG_ERR_SIZELIMIT,
 };
 
+/* network key types;
+ * network types were directly and mistakenly
+ * mapped on sample types, to keep backward
+ * compatiblitiy we keep those values but
+ * we now use a internal/network mapping
+ * to avoid further mistakes adding or
+ * modifying internals types
+ */
+enum {
+        PEER_KT_ANY = 0,  /* any type */
+        PEER_KT_RESV1,    /* UNUSED */
+        PEER_KT_SINT,     /* signed 64bits integer type */
+        PEER_KT_RESV3,    /* UNUSED */
+        PEER_KT_IPV4,     /* ipv4 type */
+        PEER_KT_IPV6,     /* ipv6 type */
+        PEER_KT_STR,      /* char string type */
+        PEER_KT_BIN,      /* buffer type */
+        PEER_KT_TYPES     /* number of types, must always be last */
+};
+
+/* Map used to retrieve network type from internal type
+ * Note: Undeclared mapping maps entry to PEER_KT_ANY == 0
+ */
+static int peer_net_key_type[SMP_TYPES] = {
+       [SMP_T_SINT] = PEER_KT_SINT,
+       [SMP_T_IPV4] = PEER_KT_IPV4,
+       [SMP_T_IPV6] = PEER_KT_IPV6,
+       [SMP_T_STR]  = PEER_KT_STR,
+       [SMP_T_BIN]  = PEER_KT_BIN,
+};
+
+/* Map used to retrieve internal type from external type
+ * Note: Undeclared mapping maps entry to SMP_T_ANY == 0
+ */
+static int peer_int_key_type[PEER_KT_TYPES] = {
+       [PEER_KT_SINT] = SMP_T_SINT,
+       [PEER_KT_IPV4] = SMP_T_IPV4,
+       [PEER_KT_IPV6] = SMP_T_IPV6,
+       [PEER_KT_STR]  = SMP_T_STR,
+       [PEER_KT_BIN]  = SMP_T_BIN,
+};
+
 /*
  * Parameters used by functions to build peer protocol messages. */
 struct peer_prep_params {
@@ -620,7 +662,7 @@ static int peer_prepare_switchmsg(char *msg, size_t size, struct peer_prep_param
 
        /* encode table type */
 
-       intencode(st->table->type, &cursor);
+       intencode(peer_net_key_type[st->table->type], &cursor);
 
        /* encode table key size */
        intencode(st->table->key_size, &cursor);
@@ -1655,7 +1697,7 @@ static inline int peer_treat_definemsg(struct appctx *appctx, struct peer *p,
        if (!*msg_cur)
                goto malformed_exit;
 
-       if (p->remote_table->table->type != table_type
+       if (p->remote_table->table->type != peer_int_key_type[table_type]
                || p->remote_table->table->key_size != table_keylen) {
                p->remote_table = NULL;
                goto ignore_msg;