فهرست منبع

Drop extra debug output.

Adam Ierymenko 12 سال پیش
والد
کامیت
aa96bdfd1e
1فایلهای تغییر یافته به همراه30 افزوده شده و 5 حذف شده
  1. 30 5
      node/EthernetTap.cpp

+ 30 - 5
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()