diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-09-10 16:31:31 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2020-09-11 10:33:13 +0200 |
commit | 5d0fe4233b98301a2f8644824dd1dec0c5fc3403 (patch) | |
tree | 0aa90c72b02056121b6a7ce9a90008793e54d931 /src/resolve/resolved-dns-scope.c | |
parent | 00df39a56a247a9936ca0c0a79c17cd0dda31daa (diff) | |
download | systemd-5d0fe4233b98301a2f8644824dd1dec0c5fc3403.tar.gz |
tree-wide: add helper for IPv4/IPv6 sockopts
A variety of sockopts exist both for IPv4 and IPv6 but require a
different pair of sockopt level/option number. Let's add helpers for
these that internally determine the right sockopt to call.
This should shorten code that generically wants to support both ipv4 +
ipv6 and for the first time adds correct support for some cases where we
only called the ipv4 versions, and not the ipv6 options.
Diffstat (limited to 'src/resolve/resolved-dns-scope.c')
-rw-r--r-- | src/resolve/resolved-dns-scope.c | 51 |
1 files changed, 12 insertions, 39 deletions
diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index e69ba3c758..2ad4544002 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -386,54 +386,27 @@ static int dns_scope_socket( } if (s->link) { - be32_t ifindex_be = htobe32(ifindex); - - if (sa.sa.sa_family == AF_INET) { - r = setsockopt(fd, IPPROTO_IP, IP_UNICAST_IF, &ifindex_be, sizeof(ifindex_be)); - if (r < 0) - return -errno; - } else if (sa.sa.sa_family == AF_INET6) { - r = setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_IF, &ifindex_be, sizeof(ifindex_be)); - if (r < 0) - return -errno; - } + r = socket_set_unicast_if(fd, sa.sa.sa_family, ifindex); + if (r < 0) + return r; } if (s->protocol == DNS_PROTOCOL_LLMNR) { /* RFC 4795, section 2.5 requires the TTL to be set to 1 */ - - if (sa.sa.sa_family == AF_INET) { - r = setsockopt_int(fd, IPPROTO_IP, IP_TTL, 1); - if (r < 0) - return r; - } else if (sa.sa.sa_family == AF_INET6) { - r = setsockopt_int(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, 1); - if (r < 0) - return r; - } + r = socket_set_ttl(fd, sa.sa.sa_family, 1); + if (r < 0) + return r; } if (type == SOCK_DGRAM) { /* Set IP_RECVERR or IPV6_RECVERR to get ICMP error feedback. See discussion in #10345. */ + r = socket_set_recverr(fd, sa.sa.sa_family, true); + if (r < 0) + return r; - if (sa.sa.sa_family == AF_INET) { - r = setsockopt_int(fd, IPPROTO_IP, IP_RECVERR, true); - if (r < 0) - return r; - - r = setsockopt_int(fd, IPPROTO_IP, IP_PKTINFO, true); - if (r < 0) - return r; - - } else if (sa.sa.sa_family == AF_INET6) { - r = setsockopt_int(fd, IPPROTO_IPV6, IPV6_RECVERR, true); - if (r < 0) - return r; - - r = setsockopt_int(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, true); - if (r < 0) - return r; - } + r = socket_set_recvpktinfo(fd, sa.sa.sa_family, true); + if (r < 0) + return r; } if (ret_socket_address) |