diff --git a/include/haproxy/protocol.h b/include/haproxy/protocol.h index 3a3da90b5..ac331c78d 100644 --- a/include/haproxy/protocol.h +++ b/include/haproxy/protocol.h @@ -26,7 +26,8 @@ #include #include -extern struct protocol *__protocol_by_family[AF_CUST_MAX]; +/* [AF][sock_dgram][ctrl_dgram] */ +extern struct protocol *__protocol_by_family[AF_CUST_MAX][2][2]; __decl_thread(extern HA_SPINLOCK_T proto_lock); /* Registers the protocol */ @@ -55,11 +56,24 @@ int protocol_unbind_all(void); */ int protocol_enable_all(void); -/* returns the protocol associated to family or NULL if not found */ +/* returns the protocol associated to family with sock_type and + * ctrl_type of SOCK_STREAM, or NULL if not found + */ static inline struct protocol *protocol_by_family(int family) { if (family >= 0 && family < AF_CUST_MAX) - return __protocol_by_family[family]; + return __protocol_by_family[family][0][0]; + return NULL; +} + +/* returns the protocol associated to family with sock_type and + * ctrl_type of either SOCK_STREAM or SOCK_DGRAM depending on the requested + * values, or NULL if not found. + */ +static inline struct protocol *protocol_lookup(int family, int sock_dgram, int ctrl_dgram) +{ + if (family >= 0 && family < AF_CUST_MAX) + return __protocol_by_family[family][!!sock_dgram][!!ctrl_dgram]; return NULL; } diff --git a/src/protocol.c b/src/protocol.c index 748587025..48bce766b 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -24,7 +24,7 @@ /* List head of all registered protocols */ static struct list protocols = LIST_HEAD_INIT(protocols); -struct protocol *__protocol_by_family[AF_CUST_MAX] = { }; +struct protocol *__protocol_by_family[AF_CUST_MAX][2][2] = { }; /* This is the global spinlock we may need to register/unregister listeners or * protocols. Its main purpose is in fact to serialize the rare stop/deinit() @@ -38,7 +38,9 @@ void protocol_register(struct protocol *proto) HA_SPIN_LOCK(PROTO_LOCK, &proto_lock); LIST_ADDQ(&protocols, &proto->list); if (proto->sock_domain >= 0 && proto->sock_domain < AF_CUST_MAX) - __protocol_by_family[proto->sock_domain] = proto; + __protocol_by_family[proto->sock_domain] + [proto->sock_type == SOCK_DGRAM] + [proto->ctrl_type == SOCK_DGRAM] = proto; HA_SPIN_UNLOCK(PROTO_LOCK, &proto_lock); }