From 2d3f8a411f764ec3cfca5e2a31ef682e8144056d Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Tue, 11 Sep 2018 16:51:28 +0200 Subject: [PATCH] MEDIUM: protocol: use a custom AF_MAX to help protocol parser It's possible to have several protocols per family which is a problem with the current way the protocols are stored. This allows to register a new protocol in HAProxy which is not a protocol in the strict socket definition. It will be used to register a SOCK_STREAM protocol using socketpair(). --- include/proto/protocol.h | 4 ++-- include/types/protocol.h | 17 +++++++++++++++++ src/protocol.c | 4 ++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/proto/protocol.h b/include/proto/protocol.h index 13a3c0a61..857f9e692 100644 --- a/include/proto/protocol.h +++ b/include/proto/protocol.h @@ -25,7 +25,7 @@ #include #include -extern struct protocol *__protocol_by_family[AF_MAX]; +extern struct protocol *__protocol_by_family[AF_CUST_MAX]; /* Registers the protocol */ void protocol_register(struct protocol *proto); @@ -56,7 +56,7 @@ int protocol_enable_all(void); /* returns the protocol associated to family or NULL if not found */ static inline struct protocol *protocol_by_family(int family) { - if (family >= 0 && family < AF_MAX) + if (family >= 0 && family < AF_CUST_MAX) return __protocol_by_family[family]; return NULL; } diff --git a/include/types/protocol.h b/include/types/protocol.h index 9480c1869..378e2b0e1 100644 --- a/include/types/protocol.h +++ b/include/types/protocol.h @@ -33,6 +33,23 @@ struct listener; struct connection; +/* + * Custom network family for str2sa parsing. Should be ok to do this since + * sa_family_t is standardized as an unsigned integer + */ + +#define AF_CUST_SOCKPAIR (AF_MAX + 1) +#define AF_CUST_MAX (AF_MAX + 2) + +/* + * Test in case AF_CUST_MAX overflows the sa_family_t (unsigned int) + */ +#if (AF_CUST_MAX < AF_MAX) +# error "Can't build on the target system, AF_CUST_MAX overflow" +#endif + + + /* max length of a protcol name, including trailing zero */ #define PROTO_NAME_LEN 16 diff --git a/src/protocol.c b/src/protocol.c index 7884ef734..96e01c827 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -22,13 +22,13 @@ /* List head of all registered protocols */ static struct list protocols = LIST_HEAD_INIT(protocols); -struct protocol *__protocol_by_family[AF_MAX] = { }; +struct protocol *__protocol_by_family[AF_CUST_MAX] = { }; /* Registers the protocol */ void protocol_register(struct protocol *proto) { LIST_ADDQ(&protocols, &proto->list); - if (proto->sock_domain >= 0 && proto->sock_domain < AF_MAX) + if (proto->sock_domain >= 0 && proto->sock_domain < AF_CUST_MAX) __protocol_by_family[proto->sock_domain] = proto; }