]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: listener: pass the chosen protocol to create_listeners()
authorWilly Tarreau <w@1wt.eu>
Wed, 16 Sep 2020 15:58:55 +0000 (17:58 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 16 Sep 2020 20:08:08 +0000 (22:08 +0200)
The function will need to use more than just a family, let's pass it
the selected protocol. The caller will then be able to do all the fancy
stuff required to pick the best protocol.

include/haproxy/listener.h
src/cfgparse.c
src/listener.c

index fc37128a6594fe84cbc791642944dc485dce4680..7269316241bd2711641fada76f4f528577428fb8 100644 (file)
@@ -85,13 +85,13 @@ void unbind_listener_no_close(struct listener *listener);
 
 /* creates one or multiple listeners for bind_conf <bc> on sockaddr <ss> on port
  * range <portl> to <porth>, and possibly attached to fd <fd> (or -1 for auto
- * allocation). The address family is taken from ss->ss_family. The number of
- * jobs and listeners is automatically increased by the number of listeners
- * created. It returns non-zero on success, zero on error with the error message
- * set in <err>.
+ * allocation). The address family is taken from ss->ss_family, and the protocol
+ * passed in <proto> must be usable on this family. The number of jobs and
+ * listeners is automatically increased by the number of listeners created. It
+ * returns non-zero on success, zero on error with the error message set in <err>.
  */
 int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss,
-                     int portl, int porth, int fd, char **err);
+                     int portl, int porth, int fd, struct protocol *proto, char **err);
 
 /* Delete a listener from its protocol's list of listeners. The listener's
  * state is automatically updated from LI_ASSIGNED to LI_INIT. The protocol's
index 23a3695614610ec32f9a9dc3d6579009f3958b4d..c4dd262ff20766b011a37b64b8550fa93e10032e 100644 (file)
@@ -111,6 +111,7 @@ struct cfg_kw_list cfg_keywords = {
  */
 int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, const char *file, int line, char **err)
 {
+       struct protocol *proto;
        char *next, *dupstr;
        int port, end;
 
@@ -133,8 +134,14 @@ int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf,
                if (!ss2)
                        goto fail;
 
+               proto = protocol_by_family(ss2->ss_family);
+               if (!proto) {
+                       memprintf(err, "unsupported protocol family %d fr address '%s'", ss2->ss_family, str);
+                       goto fail;
+               }
+
                /* OK the address looks correct */
-               if (!create_listeners(bind_conf, ss2, port, end, fd, err)) {
+               if (!create_listeners(bind_conf, ss2, port, end, fd, proto, err)) {
                        memprintf(err, "%s for address '%s'.\n", *err, str);
                        goto fail;
                }
@@ -160,6 +167,7 @@ int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf,
  */
 int str2receiver(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, const char *file, int line, char **err)
 {
+       struct protocol *proto;
        char *next, *dupstr;
        int port, end;
 
@@ -182,8 +190,14 @@ int str2receiver(char *str, struct proxy *curproxy, struct bind_conf *bind_conf,
                if (!ss2)
                        goto fail;
 
+               proto = protocol_by_family(ss2->ss_family);
+               if (!proto) {
+                       memprintf(err, "unsupported protocol family %d fr address '%s'", ss2->ss_family, str);
+                       goto fail;
+               }
+
                /* OK the address looks correct */
-               if (!create_listeners(bind_conf, ss2, port, end, fd, err)) {
+               if (!create_listeners(bind_conf, ss2, port, end, fd, proto, err)) {
                        memprintf(err, "%s for address '%s'.\n", *err, str);
                        goto fail;
                }
index 263508bc4e195146687a97e64d26423f1e3f03f2..59aedb2249a4f809d6ed6ab1e5d2e263f12fbbba 100644 (file)
@@ -535,23 +535,17 @@ void unbind_listener_no_close(struct listener *listener)
 
 /* creates one or multiple listeners for bind_conf <bc> on sockaddr <ss> on port
  * range <portl> to <porth>, and possibly attached to fd <fd> (or -1 for auto
- * allocation). The address family is taken from ss->ss_family. The number of
- * jobs and listeners is automatically increased by the number of listeners
- * created. It returns non-zero on success, zero on error with the error message
- * set in <err>.
+ * allocation). The address family is taken from ss->ss_family, and the protocol
+ * passed in <proto> must be usable on this family. The number of jobs and
+ * listeners is automatically increased by the number of listeners created. It
+ * returns non-zero on success, zero on error with the error message set in <err>.
  */
 int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss,
-                     int portl, int porth, int fd, char **err)
+                     int portl, int porth, int fd, struct protocol *proto, char **err)
 {
-       struct protocol *proto = protocol_by_family(ss->ss_family);
        struct listener *l;
        int port;
 
-       if (!proto) {
-               memprintf(err, "unsupported protocol family %d", ss->ss_family);
-               return 0;
-       }
-
        for (port = portl; port <= porth; port++) {
                l = calloc(1, sizeof(*l));
                if (!l) {