Hi Tim, Willy, On 3/20/20 3:01 PM, Tim Düsterhus wrote: > Emeric, > > Am 20.03.20 um 14:29 schrieb Emeric Brun: >> So I understand that since 1.6 the SMP_T are directly announced on the wire >> for key types, and it brokes the documented values and this is hazardous to >> rely on internal enum values. >> >> So we must re-introduce a mapping between internal and on-wire types. >> >> Some questions about choices: >> >> - Re-map types to documented values or Update the doc to match currently >> used values? > > There's really only one sane choice after several years of not following > the documentation: > > Update the documentation to match the currently used values. The peers > protocol is HAProxy specific, so in practice the correct values are > "what HAProxy does" (i.e. the protocol is defined by the reference > implementation). The custom implementation during which I stumbled upon > this issue is brand new and I needed to look into the code anyway, > because the docs are incomplete (as I outlined before in this thread). > > Changing the code will cause larger breakage during a HAProxy bugfix > upgrade if not all machines in a cluster are upgraded simultaneously. > > Best regards > Tim Düsterhus >
In attachement a proposed patch for this issue. R, Emeric
>From 3792e5fb69a10daf03f65d142fa308c8f2704588 Mon Sep 17 00:00:00 2001 From: Emeric Brun <[email protected]> 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. --- 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 477e7bb84..344cb5609 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 2e54ab94d..91f2b3ad8 100644 --- a/src/peers.c +++ b/src/peers.c @@ -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_RESV2, /* 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_ST_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; -- 2.17.1

