mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-24 13:42:16 +00:00
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().
This commit is contained in:
parent
5ab33944cd
commit
2d3f8a411f
@ -25,7 +25,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <types/protocol.h>
|
||||
|
||||
extern struct protocol *__protocol_by_family[AF_MAX];
|
||||
extern struct protocol *__protocol_by_family[AF_CUST_MAX];
|
||||
|
||||
/* Registers the protocol <proto> */
|
||||
void protocol_register(struct protocol *proto);
|
||||
@ -56,7 +56,7 @@ int protocol_enable_all(void);
|
||||
/* returns the protocol associated to family <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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 <proto> */
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user