summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/EthernetTap.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/node/EthernetTap.cpp b/node/EthernetTap.cpp
index 1b77404a..dd6873bc 100644
--- a/node/EthernetTap.cpp
+++ b/node/EthernetTap.cpp
@@ -1096,6 +1096,7 @@ bool EthernetTap::removeIP(const InetAddress &ip)
std::set<InetAddress> EthernetTap::allIps() const
{
+ static const InetAddress ifLoopback("fe80::1",64);
std::set<InetAddress> addrs;
try {
@@ -1109,9 +1110,11 @@ std::set<InetAddress> EthernetTap::allIps() const
case AF_INET:
addrs.insert(InetAddress(&(ipt->Table[i].Address.Ipv4.sin_addr.S_un.S_addr),4,ipt->Table[i].OnLinkPrefixLength));
break;
- case AF_INET6:
- addrs.insert(InetAddress(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength));
- break;
+ case AF_INET6: {
+ InetAddress ip(ipt->Table[i].Address.Ipv6.sin6_addr.u.Byte,16,ipt->Table[i].OnLinkPrefixLength);
+ if (ip != ifLoopback) // don't include fe80::1
+ addrs.insert(ip);
+ } break;
}
}
}
@@ -1147,8 +1150,30 @@ std::string EthernetTap::deviceName() const
bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
{
- // TODO
- return false;
+ std::set<MulticastGroup> newGroups;
+
+ std::set<InetAddress> ipaddrs(allIps());
+ for(std::set<InetAddress>::const_iterator i(ipaddrs.begin());i!=ipaddrs.end();++i)
+ newGroups.insert(MulticastGroup::deriveMulticastGroupForAddressResolution(*i));
+
+ bool changed = false;
+
+ newGroups.insert(_blindWildcardMulticastGroup); // always join this
+
+ for(std::set<MulticastGroup>::iterator mg(newGroups.begin());mg!=newGroups.end();++mg) {
+ if (!groups.count(*mg)) {
+ groups.insert(*mg);
+ changed = true;
+ }
+ }
+ for(std::set<MulticastGroup>::iterator mg(groups.begin());mg!=groups.end();) {
+ if (!newGroups.count(*mg)) {
+ groups.erase(mg++);
+ changed = true;
+ } else ++mg;
+ }
+
+ return changed;
}
void EthernetTap::threadMain()