MINOR: listener: move the interface to the struct settings
The interface is common to all listeners/receivers and is used to bind
the listening socket so it must be in the receiver settings and not in
the listener. This removes some unnecessary loops.
diff --git a/include/haproxy/listener-t.h b/include/haproxy/listener-t.h
index 45f30d3..9d0db4e 100644
--- a/include/haproxy/listener-t.h
+++ b/include/haproxy/listener-t.h
@@ -186,6 +186,7 @@
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 @@
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 c13674b..033a3bd 100644
--- a/src/cfgparse-tcp.c
+++ b/src/cfgparse-tcp.c
@@ -178,18 +178,12 @@
/* 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 a455be1..d7ec79a 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -1710,8 +1710,8 @@
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 57bef86..7be6882 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -649,9 +649,10 @@
#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 5ec8bc7..5337ac4 100644
--- a/src/proto_udp.c
+++ b/src/proto_udp.c
@@ -252,9 +252,10 @@
#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 1614d95..5899d44 100644
--- a/src/sock.c
+++ b/src/sock.c
@@ -385,8 +385,8 @@
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 @@
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