diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2015-02-18 17:54:50 +0100 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2015-02-18 17:54:50 +0100 |
commit | a8f51c2e2c94387e7dcd95dcb12371b7253847f8 (patch) | |
tree | 0ddc3891823e2be8c293420ad72b144cf6223ba6 /socket.c | |
parent | e6e971ba1b23bb67b43a909b486cbad5c6e96e06 (diff) |
llmnrd: Add IPv6 support
Closes #5
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'socket.c')
-rw-r--r-- | socket.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -88,7 +88,13 @@ int socket_open_ipv6(uint16_t port) opt_pktinfo = IPV6_PKTINFO; #endif if (setsockopt(sock, IPPROTO_IPV6, opt_pktinfo, &YES, sizeof(YES)) < 0) { - log_err("Failed to set IPv4 packet info socket option: %s\n", strerror(errno)); + log_err("Failed to set IPv6 packet info socket option: %s\n", strerror(errno)); + goto err; + } + + /* IPv6 only socket */ + if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &YES, sizeof(YES)) < 0) { + log_err("Failed to set IPv6 only socket option: %s\n", strerror(errno)); goto err; } @@ -156,7 +162,7 @@ int socket_mcast_group_ipv4(int sock, unsigned int ifindex, bool join) if (setsockopt(sock, IPPROTO_IP, join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { - log_err("Failed to join multicast group on interface %s: %s\n", + log_err("Failed to join IPv4 multicast group on interface %s: %s\n", if_indextoname(ifindex, ifname), strerror(errno)); return -1; } @@ -166,19 +172,20 @@ int socket_mcast_group_ipv4(int sock, unsigned int ifindex, bool join) int socket_mcast_group_ipv6(int sock, unsigned int ifindex, bool join) { - struct ipv6_mreq mreq; + struct ipv6_mreq mreq6; char ifname[IF_NAMESIZE]; /* silently ignore, we might not be listening on an IPv6 socket */ if (sock < 0) return -1; - memset(&mreq, 0, sizeof(mreq)); - inet_pton(AF_INET6, LLMNR_IPV6_MCAST_ADDR, &mreq.ipv6mr_multiaddr); + memset(&mreq6, 0, sizeof(mreq6)); + mreq6.ipv6mr_interface = ifindex; + inet_pton(AF_INET6, LLMNR_IPV6_MCAST_ADDR, &mreq6.ipv6mr_multiaddr); - if (setsockopt(sock, IPPROTO_IP, join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, - &mreq, sizeof(mreq)) < 0) { - log_err("Failed to join multicast group on interface %s: %s\n", + if (setsockopt(sock, IPPROTO_IPV6, join ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP, + &mreq6, sizeof(mreq6)) < 0) { + log_err("Failed to join IPv6 multicast group on interface %s: %s\n", if_indextoname(ifindex, ifname), strerror(errno)); return -1; } |