From: Willy Tarreau Date: Fri, 15 Sep 2017 05:55:51 +0000 (+0200) Subject: MINOR: protocols: register the ->add function and stop calling them directly X-Git-Tag: v1.8-dev3~97 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9d5be5c82378ba3b02b2ff94178e5c8aa835f5c6;p=thirdparty%2Fhaproxy.git MINOR: protocols: register the ->add function and stop calling them directly cfgparse has no business directly calling each individual protocol's 'add' function to create a listener. Now that they're all registered, better perform a protocol lookup on the family and have a standard ->add method for all of them. --- diff --git a/include/proto/proto_tcp.h b/include/proto/proto_tcp.h index 94a84153b1..5241e7cafb 100644 --- a/include/proto/proto_tcp.h +++ b/include/proto/proto_tcp.h @@ -28,8 +28,6 @@ #include int tcp_bind_socket(int fd, int flags, struct sockaddr_storage *local, struct sockaddr_storage *remote); -void tcpv4_add_listener(struct listener *listener, int port); -void tcpv6_add_listener(struct listener *listener, int port); int tcp_pause_listener(struct listener *l); int tcp_connect_server(struct connection *conn, int data, int delack); int tcp_connect_probe(struct connection *conn); diff --git a/include/proto/proto_uxst.h b/include/proto/proto_uxst.h index 63de24f53d..11aed981bb 100644 --- a/include/proto/proto_uxst.h +++ b/include/proto/proto_uxst.h @@ -26,7 +26,6 @@ #include #include -void uxst_add_listener(struct listener *listener, int port); int uxst_pause_listener(struct listener *l); int uxst_get_src(int fd, struct sockaddr *sa, socklen_t salen, int dir); int uxst_get_dst(int fd, struct sockaddr *sa, socklen_t salen, int dir); diff --git a/include/types/protocol.h b/include/types/protocol.h index 6a4986ff4a..9480c18690 100644 --- a/include/types/protocol.h +++ b/include/types/protocol.h @@ -61,6 +61,7 @@ struct protocol { int (*get_dst)(int fd, struct sockaddr *, socklen_t, int dir); /* syscall used to retrieve dst addr */ int (*drain)(int fd); /* indicates whether we can safely close the fd */ int (*pause)(struct listener *l); /* temporarily pause this listener for a soft restart */ + void (*add)(struct listener *l, int port); /* add a listener for this protocol and port */ struct list listeners; /* list of listeners using this protocol */ int nb_listeners; /* number of listeners */ diff --git a/src/cfgparse.c b/src/cfgparse.c index 9752b81e29..759d407598 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -72,8 +72,6 @@ #include #include #include -#include -#include #include #include #include @@ -288,6 +286,13 @@ int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, memcpy(&ss, ss2, sizeof(ss)); for (; port <= end; port++) { + struct protocol *proto = protocol_by_family(ss.ss_family); + + if (!proto) { + memprintf(err, "unsupported protocol family %d for address '%s'.\n", ss.ss_family, str); + goto fail; + } + l = calloc(1, sizeof(*l)); l->obj_type = OBJ_TYPE_LISTENER; LIST_ADDQ(&curproxy->conf.listeners, &l->by_fe); @@ -298,15 +303,7 @@ int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, memcpy(&l->addr, &ss, sizeof(ss)); l->state = LI_INIT; - if (ss.ss_family == AF_INET) { - tcpv4_add_listener(l, port); - } - else if (ss.ss_family == AF_INET6) { - tcpv6_add_listener(l, port); - } - else { - uxst_add_listener(l, port); - } + proto->add(l, port); jobs++; listeners++; diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 6b1505a3a5..0fad867a92 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -63,6 +63,8 @@ static int tcp_bind_listeners(struct protocol *proto, char *errmsg, int errlen); static int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen); +static void tcpv4_add_listener(struct listener *listener, int port); +static void tcpv6_add_listener(struct listener *listener, int port); /* Note: must not be declared as its list will be overwritten */ static struct protocol proto_tcpv4 = { @@ -83,6 +85,7 @@ static struct protocol proto_tcpv4 = { .get_dst = tcp_get_dst, .drain = tcp_drain, .pause = tcp_pause_listener, + .add = tcpv4_add_listener, .listeners = LIST_HEAD_INIT(proto_tcpv4.listeners), .nb_listeners = 0, }; @@ -106,6 +109,7 @@ static struct protocol proto_tcpv6 = { .get_dst = tcp_get_dst, .drain = tcp_drain, .pause = tcp_pause_listener, + .add = tcpv6_add_listener, .listeners = LIST_HEAD_INIT(proto_tcpv6.listeners), .nb_listeners = 0, }; @@ -1141,7 +1145,7 @@ static int tcp_bind_listeners(struct protocol *proto, char *errmsg, int errlen) * listener's state is automatically updated from LI_INIT to LI_ASSIGNED. * The number of listeners for the protocol is updated. */ -void tcpv4_add_listener(struct listener *listener, int port) +static void tcpv4_add_listener(struct listener *listener, int port) { if (listener->state != LI_INIT) return; @@ -1156,7 +1160,7 @@ void tcpv4_add_listener(struct listener *listener, int port) * listener's state is automatically updated from LI_INIT to LI_ASSIGNED. * The number of listeners for the protocol is updated. */ -void tcpv6_add_listener(struct listener *listener, int port) +static void tcpv6_add_listener(struct listener *listener, int port) { if (listener->state != LI_INIT) return; diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 767cd16fd3..ae6e3388c3 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -49,6 +49,7 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle static int uxst_bind_listeners(struct protocol *proto, char *errmsg, int errlen); static int uxst_unbind_listeners(struct protocol *proto); static int uxst_connect_server(struct connection *conn, int data, int delack); +static void uxst_add_listener(struct listener *listener, int port); /* Note: must not be declared as its list will be overwritten */ static struct protocol proto_unix = { @@ -69,6 +70,7 @@ static struct protocol proto_unix = { .get_src = uxst_get_src, .get_dst = uxst_get_dst, .pause = uxst_pause_listener, + .add = uxst_add_listener, .listeners = LIST_HEAD_INIT(proto_unix.listeners), .nb_listeners = 0, }; @@ -369,7 +371,7 @@ static int uxst_unbind_listener(struct listener *listener) * listener's state is automatically updated from LI_INIT to LI_ASSIGNED. * The number of listeners for the protocol is updated. */ -void uxst_add_listener(struct listener *listener, int port) +static void uxst_add_listener(struct listener *listener, int port) { if (listener->state != LI_INIT) return;