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.
This commit is contained in:
Willy Tarreau 2020-09-03 07:23:34 +02:00
parent e26993c098
commit 7e307215e8
6 changed files with 13 additions and 17 deletions

View File

@ -186,6 +186,7 @@ struct bind_conf {
gid_t gid; /* -1 to leave unchanged */ gid_t gid; /* -1 to leave unchanged */
mode_t mode; /* 0 to leave unchanged */ mode_t mode; /* 0 to leave unchanged */
} ux; } ux;
char *interface; /* interface name or NULL */
} settings; /* all the settings needed for the listening socket */ } settings; /* all the settings needed for the listening socket */
}; };
@ -214,7 +215,6 @@ struct listener {
unsigned int analysers; /* bitmap of required protocol analysers */ unsigned int analysers; /* bitmap of required protocol analysers */
int maxseg; /* for TCP, advertised MSS */ int maxseg; /* for TCP, advertised MSS */
int tcp_ut; /* for TCP, user timeout */ int tcp_ut; /* for TCP, user timeout */
char *interface; /* interface name or NULL */
char *name; /* listener's name */ char *name; /* listener's name */
__decl_thread(HA_SPINLOCK_T lock); __decl_thread(HA_SPINLOCK_T lock);

View File

@ -178,18 +178,12 @@ static int bind_parse_tcp_ut(char **args, int cur_arg, struct proxy *px, struct
/* parse the "interface" bind keyword */ /* parse the "interface" bind keyword */
static int bind_parse_interface(char **args, int cur_arg, struct proxy *px, struct bind_conf *conf, char **err) 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]) { if (!*args[cur_arg + 1]) {
memprintf(err, "'%s' : missing interface name", args[cur_arg]); memprintf(err, "'%s' : missing interface name", args[cur_arg]);
return ERR_ALERT | ERR_FATAL; return ERR_ALERT | ERR_FATAL;
} }
list_for_each_entry(l, &conf->listeners, by_bind) { conf->settings.interface = strdup(args[cur_arg + 1]);
if (l->addr.ss_family == AF_INET || l->addr.ss_family == AF_INET6)
l->interface = strdup(args[cur_arg + 1]);
}
return 0; return 0;
} }
#endif #endif

View File

@ -1710,8 +1710,8 @@ static int _getsocks(char **args, char *payload, struct appctx *appctx, void *pr
if (fdtab[cur_fd].iocb == listener_accept) { if (fdtab[cur_fd].iocb == listener_accept) {
const struct listener *l = fdtab[cur_fd].owner; const struct listener *l = fdtab[cur_fd].owner;
if (l->interface) { if (l->bind_conf->settings.interface) {
if_name = l->interface; if_name = l->bind_conf->settings.interface;
if_nlen = strlen(if_name); if_nlen = strlen(if_name);
} }

View File

@ -649,9 +649,10 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
#ifdef SO_BINDTODEVICE #ifdef SO_BINDTODEVICE
/* Note: this might fail if not CAP_NET_RAW */ /* 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, 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"; msg = "cannot bind listener to device";
err |= ERR_WARN; err |= ERR_WARN;
} }

View File

@ -252,9 +252,10 @@ int udp_bind_listener(struct listener *listener, char *errmsg, int errlen)
#ifdef SO_BINDTODEVICE #ifdef SO_BINDTODEVICE
/* Note: this might fail if not CAP_NET_RAW */ /* 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, 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"; msg = "cannot bind listener to device";
err |= ERR_WARN; err |= ERR_WARN;
} }

View File

@ -385,8 +385,8 @@ int sock_find_compatible_fd(const struct listener *l)
options |= SOCK_XFER_OPT_V6ONLY; options |= SOCK_XFER_OPT_V6ONLY;
} }
if (l->interface) if (l->bind_conf->settings.interface)
if_namelen = strlen(l->interface); if_namelen = strlen(l->bind_conf->settings.interface);
#ifdef USE_NS #ifdef USE_NS
if (l->netns) if (l->netns)
ns_namelen = l->netns->name_len; 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 ((options == xfer_sock->options) &&
(if_namelen == xfer_sock->if_namelen) && (if_namelen == xfer_sock->if_namelen) &&
(ns_namelen == xfer_sock->ns_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 #ifdef USE_NS
(!ns_namelen || strcmp(l->netns->node.key, xfer_sock->namespace) == 0) && (!ns_namelen || strcmp(l->netns->node.key, xfer_sock->namespace) == 0) &&
#endif #endif