face: Prevent infinite loop in TcpFactory and UdpFactory

Change-Id: Idd694bc08033c524f3c0e569ed74341aa33fce31
Refs: #2292
diff --git a/daemon/face/tcp-factory.cpp b/daemon/face/tcp-factory.cpp
index bdc8c24..598a2c4 100644
--- a/daemon/face/tcp-factory.cpp
+++ b/daemon/face/tcp-factory.cpp
@@ -32,6 +32,12 @@
 
 namespace nfd {
 
+static const boost::asio::ip::address_v4 ALL_V4_ENDPOINT(
+  boost::asio::ip::address_v4::from_string("0.0.0.0"));
+
+static const boost::asio::ip::address_v6 ALL_V6_ENDPOINT(
+  boost::asio::ip::address_v6::from_string("::"));
+
 TcpFactory::TcpFactory(const std::string& defaultPort/* = "6363"*/)
   : m_defaultPort(defaultPort)
 {
@@ -42,9 +48,6 @@
 {
   using namespace boost::asio::ip;
 
-  static const address_v4 ALL_V4_ENDPOINT(address_v4::from_string("0.0.0.0"));
-  static const address_v6 ALL_V6_ENDPOINT(address_v6::from_string("::"));
-
   const address& address = endpoint.address();
 
   if (address.is_v4() && address == ALL_V4_ENDPOINT)
@@ -56,8 +59,7 @@
       prohibitAllIpv6Endpoints(endpoint.port());
     }
 
-  NFD_LOG_TRACE("prohibiting TCP " <<
-                endpoint.address().to_string() << ":" << endpoint.port());
+  NFD_LOG_TRACE("prohibiting TCP " << endpoint);
 
   m_prohibitedEndpoints.insert(endpoint);
 }
@@ -69,7 +71,9 @@
 
   for (const NetworkInterfaceInfo& nic : listNetworkInterfaces()) {
     for (const address_v4& addr : nic.ipv4Addresses) {
-      prohibitEndpoint(tcp::Endpoint(addr, port));
+      if (addr != ALL_V4_ENDPOINT) {
+        prohibitEndpoint(tcp::Endpoint(addr, port));
+      }
     }
   }
 }
@@ -81,7 +85,9 @@
 
   for (const NetworkInterfaceInfo& nic : listNetworkInterfaces()) {
     for (const address_v6& addr : nic.ipv6Addresses) {
-      prohibitEndpoint(tcp::Endpoint(addr, port));
+      if (addr != ALL_V6_ENDPOINT) {
+        prohibitEndpoint(tcp::Endpoint(addr, port));
+      }
     }
   }
 }
diff --git a/daemon/face/tcp-factory.hpp b/daemon/face/tcp-factory.hpp
index fd57fe5..e2ebda5 100644
--- a/daemon/face/tcp-factory.hpp
+++ b/daemon/face/tcp-factory.hpp
@@ -88,7 +88,7 @@
   virtual std::list<shared_ptr<const Channel> >
   getChannels() const;
 
-private:
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
 
   void
   prohibitEndpoint(const tcp::Endpoint& endpoint);
@@ -115,7 +115,7 @@
                                  const FaceCreatedCallback& onCreated,
                                  const FaceConnectFailedCallback& onConnectFailed);
 
-private:
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   typedef std::map< tcp::Endpoint, shared_ptr<TcpChannel> > ChannelMap;
   ChannelMap m_channels;
 
diff --git a/daemon/face/udp-factory.cpp b/daemon/face/udp-factory.cpp
index dcb819d..458d4fb 100644
--- a/daemon/face/udp-factory.cpp
+++ b/daemon/face/udp-factory.cpp
@@ -38,6 +38,12 @@
 
 NFD_LOG_INIT("UdpFactory");
 
+static const boost::asio::ip::address_v4 ALL_V4_ENDPOINT(
+  boost::asio::ip::address_v4::from_string("0.0.0.0"));
+
+static const boost::asio::ip::address_v6 ALL_V6_ENDPOINT(
+  boost::asio::ip::address_v6::from_string("::"));
+
 UdpFactory::UdpFactory(const std::string& defaultPort/* = "6363"*/)
   : m_defaultPort(defaultPort)
 {
@@ -48,9 +54,6 @@
 {
   using namespace boost::asio::ip;
 
-  static const address_v4 ALL_V4_ENDPOINT(address_v4::from_string("0.0.0.0"));
-  static const address_v6 ALL_V6_ENDPOINT(address_v6::from_string("::"));
-
   const address& address = endpoint.address();
 
   if (address.is_v4() && address == ALL_V4_ENDPOINT)
@@ -62,8 +65,7 @@
       prohibitAllIpv6Endpoints(endpoint.port());
     }
 
-  NFD_LOG_TRACE("prohibiting UDP " <<
-                endpoint.address().to_string() << ":" << endpoint.port());
+  NFD_LOG_TRACE("prohibiting UDP " << endpoint);
 
   m_prohibitedEndpoints.insert(endpoint);
 }
@@ -73,14 +75,14 @@
 {
   using namespace boost::asio::ip;
 
-  static const address_v4 INVALID_BROADCAST(address_v4::from_string("0.0.0.0"));
-
   for (const NetworkInterfaceInfo& nic : listNetworkInterfaces()) {
     for (const address_v4& addr : nic.ipv4Addresses) {
-      prohibitEndpoint(udp::Endpoint(addr, port));
+      if (addr != ALL_V4_ENDPOINT) {
+        prohibitEndpoint(udp::Endpoint(addr, port));
+      }
     }
 
-    if (nic.isBroadcastCapable() && nic.broadcastAddress != INVALID_BROADCAST)
+    if (nic.isBroadcastCapable() && nic.broadcastAddress != ALL_V4_ENDPOINT)
     {
       NFD_LOG_TRACE("prohibiting broadcast address: " << nic.broadcastAddress.to_string());
       prohibitEndpoint(udp::Endpoint(nic.broadcastAddress, port));
@@ -97,7 +99,9 @@
 
   for (const NetworkInterfaceInfo& nic : listNetworkInterfaces()) {
     for (const address_v6& addr : nic.ipv6Addresses) {
-      prohibitEndpoint(udp::Endpoint(addr, port));
+      if (addr != ALL_V6_ENDPOINT) {
+        prohibitEndpoint(udp::Endpoint(addr, port));
+      }
     }
   }
 }
diff --git a/daemon/face/udp-factory.hpp b/daemon/face/udp-factory.hpp
index 5d83541..1f7f7de 100644
--- a/daemon/face/udp-factory.hpp
+++ b/daemon/face/udp-factory.hpp
@@ -160,7 +160,7 @@
   const MulticastFaceMap&
   getMulticastFaces() const;
 
-private:
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
 
   void
   prohibitEndpoint(const udp::Endpoint& endpoint);
@@ -202,7 +202,7 @@
                                  const FaceCreatedCallback& onCreated,
                                  const FaceConnectFailedCallback& onConnectFailed);
 
-private:
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   typedef std::map< udp::Endpoint, shared_ptr<UdpChannel> > ChannelMap;
 
   ChannelMap m_channels;