From 07286cf094a743a4db0b7cc68f7daf0337064d37 Mon Sep 17 00:00:00 2001 From: Dave Watson Date: Wed, 3 Sep 2014 14:41:47 -0700 Subject: [PATCH] Make TSocketAddress use folly::IPAddress 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 | 6 ++++++ folly/IPAddressV4.h | 4 +--- folly/IPAddressV6.cpp | 15 +++++++++------ folly/Makefile.am | 1 + folly/test/IPAddressTest.cpp | 4 ++-- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/folly/IPAddressV4.cpp b/folly/IPAddressV4.cpp index 144e4cce..a5db28fc 100644 --- a/folly/IPAddressV4.cpp +++ b/folly/IPAddressV4.cpp @@ -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(); diff --git a/folly/IPAddressV4.h b/folly/IPAddressV4.h index 42f5002d..ac63ef8f 100644 --- a/folly/IPAddressV4.h +++ b/folly/IPAddressV4.h @@ -137,9 +137,7 @@ class IPAddressV4 : boost::totally_ordered { 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; diff --git a/folly/IPAddressV6.cpp b/folly/IPAddressV6.cpp index ea07bb8d..1bf3a300 100644 --- a/folly/IPAddressV6.cpp +++ b/folly/IPAddressV6.cpp @@ -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); } diff --git a/folly/Makefile.am b/folly/Makefile.am index 59f2fc24..346ee87a 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -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 \ diff --git a/folly/test/IPAddressTest.cpp b/folly/test/IPAddressTest.cpp index 7b7be995..4b655027 100644 --- a/folly/test/IPAddressTest.cpp +++ b/folly/test/IPAddressTest.cpp @@ -958,8 +958,8 @@ static vector 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), -- 2.34.1