From: Lennart Poettering Date: Fri, 1 Aug 2014 17:48:02 +0000 (+0200) Subject: resolved: always drop multicast membership before adding one X-Git-Tag: v216~298 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=7b4c2ee75faf08b7a415337b46efc670f986128a;ds=sidebyside resolved: always drop multicast membership before adding one This is apparently necessary on some devices, such as veth. --- diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 291d0356b..8d03049c1 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -353,6 +353,12 @@ int dns_scope_llmnr_membership(DnsScope *s, bool b) { if (fd < 0) return fd; + /* Always first try to drop membership before we add + * one. This is necessary on some devices, such as + * veth. */ + if (b) + setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn)); + if (setsockopt(fd, IPPROTO_IP, b ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0) return -errno; @@ -366,6 +372,9 @@ int dns_scope_llmnr_membership(DnsScope *s, bool b) { if (fd < 0) return fd; + if (b) + setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); + if (setsockopt(fd, IPPROTO_IPV6, b ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) return -errno; } else