Use folly::IPAddress::hash instead of gethostid
authorAlecs King <int@fb.com>
Tue, 11 Nov 2014 21:53:09 +0000 (13:53 -0800)
committerDave Watson <davejwatson@fb.com>
Wed, 19 Nov 2014 20:52:15 +0000 (12:52 -0800)
Summary: find a non-loopback ipv4 or ipv6 address and feed it to folly::IPAddress::hash

Test Plan:
1)
fbconfig -r mcrouter
fbmake runtests

2)
compare hostids on different hosts

Reviewed By: pavlo@fb.com

Subscribers: njormrod, folly-diffs@, trunkagent, ps, bmatheny, alikhtarov

FB internal diff: D1668944

Tasks: 5557721

Signature: t1:1668944:1415736928:fb4b042a575c0b00f52780f3abf54bf7630b3a97

folly/IPAddress.h
folly/IPAddressV4.cpp
folly/IPAddressV4.h
folly/IPAddressV6.cpp
folly/test/IPAddressTest.cpp

index b1c474a602b273da339be1709af5bf6c297dd631..e1b461378964ac6e911c3f35a04f3ddd99db21a2 100644 (file)
@@ -318,6 +318,12 @@ class IPAddress : boost::totally_ordered<IPAddress> {
                   : asV6().isLoopback();
   }
 
+  // Return true if the address qualifies as link local
+  bool isLinkLocal() const {
+    return isV4() ? asV4().isLinkLocal()
+                  : asV6().isLinkLocal();
+  }
+
   // Return true if the address qualifies as broadcast.
   bool isLinkLocalBroadcast() const {
     return isV4() ? asV4().isLinkLocalBroadcast()
index d66993c4bde13d359e205881ac3f71e08a44e195..418620459b964f69be9e7cfc6fb5cb1e4e3cb794 100644 (file)
@@ -144,11 +144,18 @@ bool IPAddressV4::inSubnetWithMask(const IPAddressV4& subnet,
   return (mask == subMask);
 }
 
+// public
 bool IPAddressV4::isLoopback() const {
   static IPAddressV4 loopback_addr("127.0.0.0");
   return inSubnetWithMask(loopback_addr, fetchMask(8));
 }
 
+// public
+bool IPAddressV4::isLinkLocal() const {
+  static IPAddressV4 linklocal_addr("169.254.0.0");
+  return inSubnetWithMask(linklocal_addr, fetchMask(16));
+}
+
 // public
 bool IPAddressV4::isNonroutable() const {
   auto ip = toLongHBO();
index 9c66afb64f18d522c69e09456cf2e45145cab3ec..a225e8bf49f5703f4a07af5499ea2ed87fe838a5 100644 (file)
@@ -139,6 +139,9 @@ class IPAddressV4 : boost::totally_ordered<IPAddressV4> {
   // @see IPAddress#isLoopback
   bool isLoopback() const;
 
+  // @see IPAddress#isLinkLocal
+  bool isLinkLocal() const;
+
   // @see IPAddress#isNonroutable
   bool isNonroutable() const;
 
index 45e9e3a1ceea957668db595fbc6fdd17450ef3a6..e7a5b9dfc7da187ad6471998d4a7f92bd0a87687 100644 (file)
@@ -286,6 +286,7 @@ bool IPAddressV6::isPrivate() const {
   return isLoopback() || inBinarySubnet({{0xfc, 0x00}}, 7);
 }
 
+// public
 bool IPAddressV6::isLinkLocal() const {
   return inBinarySubnet({{0xfe, 0x80}}, 10);
 }
index 202661a6d6ea558d72f2231bdadb3718b088046f..e51452dc9cd2d49a4299bccb8988c80e95c63027 100644 (file)
@@ -690,10 +690,7 @@ TEST_P(IPAddressFlagTest, IsZero) {
 
 TEST_P(IPAddressFlagTest, IsLinkLocal) {
   AddressFlags param = GetParam();
-  if (param.version != 6) {
-    return;
-  }
-  IPAddressV6 addr(param.address);
+  IPAddress addr(param.address);
   EXPECT_EQ(param.isLinkLocal(), addr.isLinkLocal()) << addr;
 }
 
@@ -954,13 +951,16 @@ static vector<AddressFlags> flagProvider = {
   AddressFlags("127.0.0.1", 4, IS_LOCAL | IS_PVT_NONROUTE),
   AddressFlags("::1", 6, IS_LOCAL | IS_PVT_NONROUTE),
 
+  // link-local v4
+  AddressFlags("169.254.0.1", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
+
   // private v4
   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_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("169.254.0.0", 4, IS_LINK_LOCAL | IS_PVT_NONROUTE),
   AddressFlags("192.168.0.0", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.200.255", 4, IS_PVT_NONROUTE),
   AddressFlags("192.168.255.255", 4, IS_PVT_NONROUTE),