diff --git a/include/haproxy/listener-t.h b/include/haproxy/listener-t.h index 45f30d387..9d0db4e53 100644 --- a/include/haproxy/listener-t.h +++ b/include/haproxy/listener-t.h @@ -186,6 +186,7 @@ struct bind_conf { gid_t gid; /* -1 to leave unchanged */ mode_t mode; /* 0 to leave unchanged */ } ux; + char *interface; /* interface name or NULL */ } settings; /* all the settings needed for the listening socket */ }; @@ -214,7 +215,6 @@ struct listener { unsigned int analysers; /* bitmap of required protocol analysers */ int maxseg; /* for TCP, advertised MSS */ int tcp_ut; /* for TCP, user timeout */ - char *interface; /* interface name or NULL */ char *name; /* listener's name */ __decl_thread(HA_SPINLOCK_T lock); diff --git a/src/cfgparse-tcp.c b/src/cfgparse-tcp.c index c13674b7c..033a3bdbb 100644 --- a/src/cfgparse-tcp.c +++ b/src/cfgparse-tcp.c @@ -178,18 +178,12 @@ static int bind_parse_tcp_ut(char **args, int cur_arg, struct proxy *px, struct /* parse the "interface" bind keyword */ static int bind_parse_interface(char **args, int cur_arg, struct proxy *px, struct bind_conf *conf, char **err) { - struct listener *l; - if (!*args[cur_arg + 1]) { memprintf(err, "'%s' : missing interface name", args[cur_arg]); return ERR_ALERT | ERR_FATAL; } - list_for_each_entry(l, &conf->listeners, by_bind) { - if (l->addr.ss_family == AF_INET || l->addr.ss_family == AF_INET6) - l->interface = strdup(args[cur_arg + 1]); - } - + conf->settings.interface = strdup(args[cur_arg + 1]); return 0; } #endif diff --git a/src/cli.c b/src/cli.c index a455be148..d7ec79aba 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1710,8 +1710,8 @@ static int _getsocks(char **args, char *payload, struct appctx *appctx, void *pr if (fdtab[cur_fd].iocb == listener_accept) { const struct listener *l = fdtab[cur_fd].owner; - if (l->interface) { - if_name = l->interface; + if (l->bind_conf->settings.interface) { + if_name = l->bind_conf->settings.interface; if_nlen = strlen(if_name); } diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 57bef8600..7be68820c 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -649,9 +649,10 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) #ifdef SO_BINDTODEVICE /* Note: this might fail if not CAP_NET_RAW */ - if (!ext && listener->interface) { + if (!ext && listener->bind_conf->settings.interface) { if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, - listener->interface, strlen(listener->interface) + 1) == -1) { + listener->bind_conf->settings.interface, + strlen(listener->bind_conf->settings.interface) + 1) == -1) { msg = "cannot bind listener to device"; err |= ERR_WARN; } diff --git a/src/proto_udp.c b/src/proto_udp.c index 5ec8bc742..5337ac4bd 100644 --- a/src/proto_udp.c +++ b/src/proto_udp.c @@ -252,9 +252,10 @@ int udp_bind_listener(struct listener *listener, char *errmsg, int errlen) #ifdef SO_BINDTODEVICE /* Note: this might fail if not CAP_NET_RAW */ - if (listener->interface) { + if (listener->bind_conf->settings.interface) { if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, - listener->interface, strlen(listener->interface) + 1) == -1) { + listener->bind_conf->settings.interface, + strlen(listener->bind_conf->settings.interface) + 1) == -1) { msg = "cannot bind listener to device"; err |= ERR_WARN; } diff --git a/src/sock.c b/src/sock.c index 1614d9542..5899d44b8 100644 --- a/src/sock.c +++ b/src/sock.c @@ -385,8 +385,8 @@ int sock_find_compatible_fd(const struct listener *l) options |= SOCK_XFER_OPT_V6ONLY; } - if (l->interface) - if_namelen = strlen(l->interface); + if (l->bind_conf->settings.interface) + if_namelen = strlen(l->bind_conf->settings.interface); #ifdef USE_NS if (l->netns) ns_namelen = l->netns->name_len; @@ -396,7 +396,7 @@ int sock_find_compatible_fd(const struct listener *l) if ((options == xfer_sock->options) && (if_namelen == xfer_sock->if_namelen) && (ns_namelen == xfer_sock->ns_namelen) && - (!if_namelen || strcmp(l->interface, xfer_sock->iface) == 0) && + (!if_namelen || strcmp(l->bind_conf->settings.interface, xfer_sock->iface) == 0) && #ifdef USE_NS (!ns_namelen || strcmp(l->netns->node.key, xfer_sock->namespace) == 0) && #endif