]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: protocol: retrieve the family-specific fields from the family
authorWilly Tarreau <w@1wt.eu>
Fri, 4 Sep 2020 06:15:31 +0000 (08:15 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 16 Sep 2020 20:08:07 +0000 (22:08 +0200)
We now take care of retrieving sock_family, l3_addrlen, bind(),
addrcmp(), get_src() and get_dst() from the protocol family and
not just the protocol itself. There are very few places, this was
only seldom used. Interestingly in sock_inet.c used to rely on
->sock_family instead of ->sock_domain, and sock_unix.c used to
hard-code PF_UNIX instead of using ->sock_domain.

Also it appears obvious we have something wrong it the protocol
selection algorithm because sock_domain is the one set to the custom
protocols while it ought to be sock_family instead, which would avoid
having to hard-code some conversions for UDP namely.

include/haproxy/connection.h
src/protocol.c
src/sock.c
src/sock_inet.c
src/sock_unix.c

index 05e85e1cbcaba433ffd29e34c545324df0baac84..876f55761f9cbdf09f8da0216a27055764ebfa2b 100644 (file)
@@ -534,13 +534,13 @@ static inline int conn_get_src(struct connection *conn)
        if (conn->flags & CO_FL_ADDR_FROM_SET)
                return 1;
 
-       if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src)
+       if (!conn_ctrl_ready(conn) || !conn->ctrl->fam->get_src)
                return 0;
 
        if (!sockaddr_alloc(&conn->src))
                return 0;
 
-       if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
+       if (conn->ctrl->fam->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
                                sizeof(*conn->src),
                                obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
                return 0;
@@ -557,13 +557,13 @@ static inline int conn_get_dst(struct connection *conn)
        if (conn->flags & CO_FL_ADDR_TO_SET)
                return 1;
 
-       if (!conn_ctrl_ready(conn) || !conn->ctrl->get_dst)
+       if (!conn_ctrl_ready(conn) || !conn->ctrl->fam->get_dst)
                return 0;
 
        if (!sockaddr_alloc(&conn->dst))
                return 0;
 
-       if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
+       if (conn->ctrl->fam->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
                                sizeof(*conn->dst),
                                obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
                return 0;
index a4e93e2de1439a28281fd492122dd9203331484d..74858702523ba4694d2cc6f574e8d7b28fc8502f 100644 (file)
@@ -82,7 +82,7 @@ int protocol_bind_all(int verbose)
                                handler = syslog_fd_handler;
                        }
 
-                       lerr = proto->bind(receiver, handler, &errmsg);
+                       lerr = proto->fam->bind(receiver, handler, &errmsg);
                        err |= lerr;
 
                        /* errors are reported if <verbose> is set or if they are fatal */
index 9431e758253742ef0af5fa132a217162369287a8..3e414a8b9ccfb711703c34ae76d932d1ae22149c 100644 (file)
@@ -363,7 +363,7 @@ int sock_find_compatible_fd(const struct receiver *rx)
        int ns_namelen = 0;
        int ret = -1;
 
-       if (!rx->proto->addrcmp)
+       if (!rx->proto->fam->addrcmp)
                return -1;
 
        if (rx->proto->sock_type == SOCK_DGRAM)
@@ -397,7 +397,7 @@ int sock_find_compatible_fd(const struct receiver *rx)
 #ifdef USE_NS
                    (!ns_namelen || strcmp(rx->settings->netns->node.key, xfer_sock->namespace) == 0) &&
 #endif
-                   rx->proto->addrcmp(&xfer_sock->addr, &rx->addr) == 0)
+                   rx->proto->fam->addrcmp(&xfer_sock->addr, &rx->addr) == 0)
                        break;
                xfer_sock = xfer_sock->next;
        }
index 09ff71e5ea2921137ab01ef4e1390a7cfc6e9b60..7c814d05591af0f69270d5d882f9df1e4d4cf04e 100644 (file)
@@ -263,7 +263,7 @@ int sock_inet_bind_receiver(struct receiver *rx, void (*handler)(int fd), char *
        struct sockaddr_storage addr_inet = rx->addr;
 
        /* force to classic sock family, not AF_CUST_* */
-       addr_inet.ss_family = rx->proto->sock_family;
+       addr_inet.ss_family = rx->proto->fam->sock_family;
 
        /* ensure we never return garbage */
        if (errmsg)
@@ -289,7 +289,7 @@ int sock_inet_bind_receiver(struct receiver *rx, void (*handler)(int fd), char *
        ext = (fd >= 0);
 
        if (!ext) {
-               fd = my_socketat(rx->settings->netns, rx->proto->sock_family,
+               fd = my_socketat(rx->settings->netns, rx->proto->fam->sock_domain,
                                 rx->proto->sock_type, rx->proto->sock_prot);
                if (fd == -1) {
                        err |= ERR_RETRYABLE | ERR_ALERT;
@@ -367,7 +367,7 @@ int sock_inet_bind_receiver(struct receiver *rx, void (*handler)(int fd), char *
        }
 #endif
 
-       if (!ext && bind(fd, (struct sockaddr *)&addr_inet, rx->proto->sock_addrlen) == -1) {
+       if (!ext && bind(fd, (struct sockaddr *)&addr_inet, rx->proto->fam->sock_addrlen) == -1) {
                err |= ERR_RETRYABLE | ERR_ALERT;
                memprintf(errmsg, "cannot bind socket");
                goto bind_close_return;
index 4620b74404b06e2a1e8e9624a2d03788520b0a51..8bdfed9be88e52df7c7f104ff5c686d0ab538a71 100644 (file)
@@ -218,7 +218,7 @@ int sock_unix_bind_receiver(struct receiver *rx, void (*handler)(int fd), char *
        addr.sun_family = AF_UNIX;
 
        /* WT: shouldn't we use my_socketat(rx->netns) here instead ? */
-       fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       fd = socket(rx->proto->fam->sock_domain, rx->proto->sock_type, rx->proto->sock_prot);
        if (fd < 0) {
                err |= ERR_FATAL | ERR_ALERT;
                memprintf(errmsg, "cannot create receiving socket");