From: Willy Tarreau Date: Fri, 20 Feb 2015 15:53:25 +0000 (+0100) Subject: MEDIUM: protocol: use a family array to index the protocol handlers X-Git-Tag: v1.6-dev1~122 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b550d009ca06e31672e3e4b7b8555a26e17b3370;p=thirdparty%2Fhaproxy.git MEDIUM: protocol: use a family array to index the protocol handlers Instead of walking over a list, we now have a direct mapping between protocol families and their respective handlers. This will allow fast lookups. --- diff --git a/include/proto/protocol.h b/include/proto/protocol.h index 1842faf167..13a3c0a61b 100644 --- a/include/proto/protocol.h +++ b/include/proto/protocol.h @@ -22,8 +22,11 @@ #ifndef _PROTO_PROTOCOL_H #define _PROTO_PROTOCOL_H +#include #include +extern struct protocol *__protocol_by_family[AF_MAX]; + /* Registers the protocol */ void protocol_register(struct protocol *proto); @@ -51,7 +54,12 @@ int protocol_unbind_all(void); int protocol_enable_all(void); /* returns the protocol associated to family or NULL if not found */ -struct protocol *protocol_by_family(int family); +static inline struct protocol *protocol_by_family(int family) +{ + if (family >= 0 && family < AF_MAX) + return __protocol_by_family[family]; + return NULL; +} #endif /* _PROTO_PROTOCOL_H */ diff --git a/src/protocol.c b/src/protocol.c index 84d23dab08..3caccb6a3f 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -10,6 +10,8 @@ * */ +#include + #include #include #include @@ -19,11 +21,14 @@ /* List head of all registered protocols */ static struct list protocols = LIST_HEAD_INIT(protocols); +struct protocol *__protocol_by_family[AF_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) + __protocol_by_family[proto->sock_domain] = proto; } /* Unregisters the protocol . Note that all listeners must have @@ -109,18 +114,6 @@ int protocol_disable_all(void) return err; } -/* Returns the protocol handler for socket family or NULL if not found */ -struct protocol *protocol_by_family(int family) -{ - struct protocol *proto; - - list_for_each_entry(proto, &protocols, list) { - if (proto->sock_domain == family) - return proto; - } - return NULL; -} - /* * Local variables: * c-indent-level: 8