From 7b18cabe8a78746cfcb5db26d55a7a9a9c961d6b Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Tue, 2 Jun 2020 11:17:42 +0200 Subject: [PATCH] BUG/MINOR: peers: fix internal/network key type mapping. 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. (cherry picked from commit 530ba38a706ed640e43eb44abe5578c7a5826d5d) Signed-off-by: Christopher Faulet --- doc/peers-v2.0.txt | 10 +++++----- src/peers.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/doc/peers-v2.0.txt b/doc/peers-v2.0.txt index 477e7bb..344cb56 100644 --- a/doc/peers-v2.0.txt +++ b/doc/peers-v2.0.txt @@ -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). diff --git a/src/peers.c b/src/peers.c index 974b3fc..b24f0d0 100644 --- a/src/peers.c +++ b/src/peers.c @@ -124,6 +124,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 { @@ -619,7 +661,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); @@ -1654,7 +1696,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; -- 1.7.10.4