Make TSocketAddress use folly::IPAddress
authorDave Watson <davejwatson@fb.com>
Wed, 3 Sep 2014 21:41:47 +0000 (14:41 -0700)
committerDave Watson <davejwatson@fb.com>
Mon, 15 Sep 2014 21:30:13 +0000 (14:30 -0700)
Summary:
Step 1 of moving TAsyncSocket and friends to folly.

folly::IPAddress changes (can split these off if requested):
* isLoopback looks for a single address, as opposed to subnet
* For V6, isPrivate & isLoopback don't seem to check mapped addresses

TSocketAddress changes:
* Make union use folly::IPAddress instead of sockaddr struct.  external_ bool to tell if using AF_UNIX instead.
* manage the port and scope/zone info ourselves

@override-unit-failures

Overriding failures, can't get contbuild to finish all builds after several tries.  None of the failures look related

Test Plan:
fbconfig -r thrift
fbmake runtests
fbconfig folly/test:network_address_test
fbmake runtests

Reviewed By: simpkins@fb.com

Subscribers: snaptu-diffs@, trunkagent, hphp-diffs@, njormrod, fbcode-common-diffs@, doug, ruibalp, ps, alandau, bmatheny

FB internal diff: D1479365

Tasks: 3658665

folly/IPAddressV4.cpp
folly/IPAddressV4.h
folly/IPAddressV6.cpp
folly/Makefile.am
folly/test/IPAddressTest.cpp

index 144e4cce6d006b204ce95d52fddfd14f0682c9e5..a5db28fc50933d52375985b2ba5df1b0a69069de 100644 (file)
@@ -28,6 +28,8 @@ using std::string;
 
 namespace folly {
 
+static IPAddressV4 loopback_addr("127.0.0.0");
+
 // free functions
 size_t hash_value(const IPAddressV4& addr) {
   return addr.hash();
@@ -143,6 +145,10 @@ bool IPAddressV4::inSubnetWithMask(const IPAddressV4& subnet,
   return (mask == subMask);
 }
 
+bool IPAddressV4::isLoopback() const {
+  return inSubnetWithMask(loopback_addr, fetchMask(8));
+}
+
 // public
 bool IPAddressV4::isNonroutable() const {
   auto ip = toLongHBO();
index 42f5002d8340ba4fee1bcbadcc250423f20c3cba..ac63ef8f98f36e45d83979c26a1255a887f1e97d 100644 (file)
@@ -137,9 +137,7 @@ class IPAddressV4 : boost::totally_ordered<IPAddressV4> {
   bool inSubnetWithMask(const IPAddressV4& subnet, const ByteArray4 mask) const;
 
   // @see IPAddress#isLoopback
-  bool isLoopback() const {
-    return (INADDR_LOOPBACK == toLongHBO());
-  }
+  bool isLoopback() const;
 
   // @see IPAddress#isNonroutable
   bool isNonroutable() const;
index ea07bb8d5516b8c3d00d5de54c86f6483207a920..1bf3a3005d43084ead1912562944511475346e02 100644 (file)
@@ -255,13 +255,12 @@ bool IPAddressV6::inSubnetWithMask(const IPAddressV6& subnet,
 
 // public
 bool IPAddressV6::isLoopback() const {
-  const unsigned char* by = bytes();
-  for (int i = 0; i < 15; i++) {
-    if (by[i] != 0x00) {
-      return false;
-    }
+  // Check if v4 mapped is loopback
+  if (isIPv4Mapped() && createIPv4().isLoopback()) {
+    return true;
   }
-  return (by[15] == 0x01);
+  auto socka = toSockAddr();
+  return IN6_IS_ADDR_LOOPBACK(&socka.sin6_addr);
 }
 
 bool IPAddressV6::isRoutable() const {
@@ -280,6 +279,10 @@ bool IPAddressV6::isLinkLocalBroadcast() const {
 
 // public
 bool IPAddressV6::isPrivate() const {
+  // Check if mapped is private
+  if (isIPv4Mapped() && createIPv4().isPrivate()) {
+    return true;
+  }
   return isLoopback() || inBinarySubnet({{0xfc, 0x00}}, 7);
 }
 
index 59f2fc241c26f33620ed90c62cabff505f7b6de5..346ee87ac495f67538156882c4e2b5fb7608c45c 100644 (file)
@@ -50,6 +50,7 @@ nobase_follyinclude_HEADERS = \
        detail/FunctionalExcept.h \
        detail/Futex.h \
        detail/GroupVarintDetail.h \
+       detail/IPAddress.h \
        detail/Malloc.h \
        detail/MemoryIdler.h \
        detail/MPMCPipelineDetail.h \
index 7b7be99549d28dde5cb1bc47ada830d77c4f586f..4b655027709d671bb34528eb8f8476ebe1aafddc 100644 (file)
@@ -958,8 +958,8 @@ static vector<AddressFlags> flagProvider = {
   AddressFlags("10.0.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("10.11.12.13", 4, IS_PVT_NONROUTE),
   AddressFlags("10.255.255.255", 4, IS_PVT_NONROUTE),
-  AddressFlags("127.128.129.200", 4, IS_PVT_NONROUTE),
-  AddressFlags("127.255.255.255", 4, IS_PVT_NONROUTE),
+  AddressFlags("127.128.129.200", 4, IS_LOCAL | IS_PVT_NONROUTE),
+  AddressFlags("127.255.255.255", 4, IS_LOCAL | IS_PVT_NONROUTE),
   AddressFlags("169.254.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.200.255", 4, IS_PVT_NONROUTE),