You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2012/03/20 23:39:21 UTC

[12/12] git commit: A couple of the bugs fixed.

A couple of the bugs fixed.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/c3673da9
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/c3673da9
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/c3673da9

Branch: refs/heads/master
Commit: c3673da95974d01b5223d13883c69a84a66e734a
Parents: 2cebb26
Author: Alan M. Carroll <am...@network-geographics.com>
Authored: Fri Mar 16 21:58:54 2012 -0500
Committer: Alan M. Carroll <am...@network-geographics.com>
Committed: Fri Mar 16 21:58:54 2012 -0500

----------------------------------------------------------------------
 lib/ts/IpMap.cc     |   28 +++++++++++-----
 lib/ts/IpMap.h      |    6 ++--
 lib/ts/IpMapTest.cc |   76 +++++++++++++++++++++++++++++++++-------------
 lib/ts/ink_inet.h   |    4 +-
 4 files changed, 79 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c3673da9/lib/ts/IpMap.cc
----------------------------------------------------------------------
diff --git a/lib/ts/IpMap.cc b/lib/ts/IpMap.cc
index 7c2b157..41d79bd 100644
--- a/lib/ts/IpMap.cc
+++ b/lib/ts/IpMap.cc
@@ -588,7 +588,7 @@ IpMapBase<N>::clear() {
 
 template < typename N > IpMapBase<N>&
 IpMapBase<N>::fill(ArgType rmin, ArgType rmax, void* payload) {
-  // Leftmost node of interest with n->_min <= min.
+  // Rightmost node of interest with n->_min <= min.
   N* n = this->lowerBound(rmin);
   N* x = 0; // New node (if any).
   // Need copies because we will modify these.
@@ -598,9 +598,15 @@ IpMapBase<N>::fill(ArgType rmin, ArgType rmax, void* payload) {
   // Handle cases involving a node of interest to the left of the
   // range.
   if (n) {
-    Metric min_1 = min;
-    N::dec(min_1);
-    if (n->_max < min_1) { // no overlap, move on to next node.
+    Metric min_1;
+    /* Tricky bit here when min is zero and we can't decrement it. If
+       it's strictly greater than the node min then it's not zero and
+       we can check against a decremented value. Moreover, if the node
+       min isn't less than the range min the node max isn't less
+       than range min - 1.
+    */
+    if (n->_min < min && (min_1 = min, N::dec(min_1), n->_max < min_1)) {
+      // no overlap, move on to next node.
       n = next(n);
     } else if (n->_max >= max) { // incoming range is covered, just discard.
       return *this;
@@ -665,7 +671,11 @@ IpMapBase<N>::fill(ArgType rmin, ArgType rmax, void* payload) {
           n = next(n);
         }
       } else {
-        if (min < n->_min) { // Need a span before n.
+        if (max < n->_min) { // entirely before next span.
+          this->insertBefore(n, new N(min, max, payload));
+          return *this; // done
+        } else if (min < n->_min) {
+          // overlap on the right, so make a span to take up the slack.
           N* y = new N(min, n->_min, payload);
           y->decrementMax();
           this->insertBefore(n, y);
@@ -965,11 +975,11 @@ public:
     ats_ip4_set(ats_ip_sa_cast(&_sa._max), htonl(max));
   }
   /// @return The minimum value of the interval.
-  virtual sockaddr const* min() {
+  virtual sockaddr const* min() const {
     return ats_ip_sa_cast(&_sa._min);
   }
   /// @return The maximum value of the interval.
-  virtual sockaddr const* max() {
+  virtual sockaddr const* max() const {
     return ats_ip_sa_cast(&_sa._max);
   }
   /// Set the client data.
@@ -1092,11 +1102,11 @@ public:
   ) : Node(data), Ip6Span(min, max) {
   }
   /// @return The minimum value of the interval.
-  virtual sockaddr const* min() {
+  virtual sockaddr const* min() const {
     return ats_ip_sa_cast(&_min);
   }
   /// @return The maximum value of the interval.
-  virtual sockaddr const* max() {
+  virtual sockaddr const* max() const {
     return ats_ip_sa_cast(&_max);
   }
   /// Set the client data.

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c3673da9/lib/ts/IpMap.h
----------------------------------------------------------------------
diff --git a/lib/ts/IpMap.h b/lib/ts/IpMap.h
index 9357512..5efbc74 100644
--- a/lib/ts/IpMap.h
+++ b/lib/ts/IpMap.h
@@ -280,9 +280,9 @@ public:
       return *this;
     }
     /// @return Minimum value of the interval.
-    virtual sockaddr const* min() = 0;
+    virtual sockaddr const* min() const = 0;
     /// @return Maximum value of the interval.
-    virtual sockaddr const* max() = 0;
+    virtual sockaddr const* max() const = 0;
   protected:
     void* _data; ///< Client data.
   };
@@ -477,7 +477,7 @@ public:
 
   /// Print all spans.
   /// @return This map.
-  self& print();
+  //  self& print();
 
 protected:
   /// Force the IPv4 map to exist.

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c3673da9/lib/ts/IpMapTest.cc
----------------------------------------------------------------------
diff --git a/lib/ts/IpMapTest.cc b/lib/ts/IpMapTest.cc
index 5b034b7..693998c 100644
--- a/lib/ts/IpMapTest.cc
+++ b/lib/ts/IpMapTest.cc
@@ -38,7 +38,22 @@ inline bool check(RegressionTest* t, int* pstatus, bool test, char const* fmt, .
   return test;
 }
 
-REGRESSION_TEST(IpMap_Test_Basic)(RegressionTest* t, int atype, int* pstatus) {
+
+void
+IpMapTestPrint(IpMap& map) {
+  printf("IpMap Dump\n");
+  for ( IpMap::iterator spot(map.begin()), limit(map.end())
+      ; spot != limit
+      ; ++spot
+  ) {
+    ip_text_buffer ipb1, ipb2;
+
+    printf("%s - %s : %p\n", ats_ip_ntop(spot->min(), ipb1, sizeof ipb1), ats_ip_ntop(spot->max(), ipb2, sizeof(ipb2)), spot->data());
+  }
+  printf("\n");
+}
+
+REGRESSION_TEST(IpMap_Basic)(RegressionTest* t, int atype, int* pstatus) {
   IpMap map;
   void* const markA = reinterpret_cast<void*>(1);
   void* const markB = reinterpret_cast<void*>(2);
@@ -98,23 +113,29 @@ REGRESSION_TEST(IpMap_Test_Basic)(RegressionTest* t, int atype, int* pstatus) {
 
 }
 
-REGRESSION_TEST(IpMap_Test_Fill)(RegressionTest* t, int atype, int* pstatus) {
+REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
   IpMap map;
   ip_text_buffer ipb1, ipb2;
-  void* const allow = reinterpret_cast<void*>(1);
-  void* const deny = reinterpret_cast<void*>(2); 
+  void* const allow = reinterpret_cast<void*>(0);
+  void* const deny = reinterpret_cast<void*>(~0); 
+  void* const markA = reinterpret_cast<void*>(1);
+  void* const markB = reinterpret_cast<void*>(2);
+//  void* const markC = reinterpret_cast<void*>(3);
   void* mark; // for retrieval
 
-  IpEndpoint a1,a2,a3,a4,a5,a6, a7, a8;
-  IpEndpoint target, a_loopback;
+  IpEndpoint a0,a_10_28_56_0,a_10_28_56_255,a3,a4,a5,a6, a7,a8;
+  IpEndpoint target, a_max, a_loopback, a_loopback2;
   IpEndpoint t6;
+  IpEndpoint a_63_128_1_12;
 
   *pstatus = REGRESSION_TEST_PASSED;
 
-  ats_ip_pton("10.28.56.0", &a1);
-  ats_ip_pton("10.28.56.255", &a2);
-  ats_ip_pton("0.0.0.0", &a3);
-  ats_ip_pton("255.255.255.255", &a4);
+  ats_ip_pton("0.0.0.0", &a0);
+  ats_ip_pton("255.255.255.255", &a_max);
+  ats_ip_pton("10.28.56.0", &a_10_28_56_0);
+  ats_ip_pton("10.28.56.255", &a_10_28_56_255);
+  ats_ip_pton("192.168.1.0", &a3);
+  ats_ip_pton("192.168.1.255", &a4);
   ats_ip_pton("::", &a5);
   ats_ip_pton("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", &a6);
   ats_ip_pton("fe80::221:9bff:fe10:9d90", &a7);
@@ -122,9 +143,11 @@ REGRESSION_TEST(IpMap_Test_Fill)(RegressionTest* t, int atype, int* pstatus) {
   ats_ip_pton("10.28.56.4", &target);
   ats_ip_pton("fe80::221:9bff:fe10:9d95", &t6);
   ats_ip_pton("127.0.0.1", &a_loopback);
+  ats_ip_pton("127.0.0.255", &a_loopback2);
+  ats_ip_pton("63.128.1.12", &a_63_128_1_12);
 
-  map.fill(&a1,&a2,deny);
-  map.fill(&a3,&a4,allow);
+  map.fill(&a_10_28_56_0,&a_10_28_56_255,deny);
+  map.fill(&a0,&a_max,allow);
   map.fill(&a5,&a6,allow);
   map.fill(&a7,&a8,deny);
 
@@ -134,24 +157,35 @@ REGRESSION_TEST(IpMap_Test_Fill)(RegressionTest* t, int atype, int* pstatus) {
   check(t, pstatus, mark == allow, "IpMap Sample: Bad T6 value. Expected allow, got deny.");
 
   map.clear();
-  map.fill(&a1,&a2,deny);
+  map.fill(&a_10_28_56_0,&a_10_28_56_255,deny);
   map.fill(&a7,&a8,deny);
-  map.fill(&a3,&a4,allow);
+  map.fill(&a0,&a_max,allow);
   map.fill(&a5,&a6,allow);
   check(t, pstatus, map.contains(&t6,&mark), "IpMap Sample: T6 not found.");
   check(t, pstatus, mark == deny, "IpMap Sample: Bad T6 value. Expected deny, got allow.");
 
   map.clear();
   map.fill(&a_loopback, &a_loopback, allow);
-  check(t, pstatus, map.contains(&a_loopback), "Map fill: singleton not marked.");
-  map.fill(&a3, &a4, deny);
+  check(t, pstatus, map.contains(&a_loopback), "IpMap fill: singleton not marked.");
+  map.fill(&a0, &a_max, deny);
 
   mark=0;
-  check(t, pstatus, map.contains(&a_loopback, &mark), "Map fill: singleton marking lost.");
-  check(t, pstatus, mark == allow, "Map fill: overwrote existing singleton mark.");
-  if (check(t, pstatus, map.begin() != map.end(), "Map fill: map is empty.")) {
-    if (check(t, pstatus, ++(map.begin()) != map.end(), "Map fill: only one range.")) {
-      check(t, pstatus, -1 == ats_ip_addr_cmp(map.begin()->max(), (++map.begin())->min()), "Map fill: ranges not disjoint [%s < %s].", ats_ip_ntop(map.begin()->max(), ipb1, sizeof(ipb1)), ats_ip_ntop((++map.begin())->min(), ipb2, sizeof(ipb2)));
+  check(t, pstatus, map.contains(&a_loopback, &mark), "IpMap fill: singleton marking lost.");
+  check(t, pstatus, mark == allow, "IpMap fill: overwrote existing singleton mark.");
+  if (check(t, pstatus, map.begin() != map.end(), "IpMap fill: map is empty.")) {
+    if (check(t, pstatus, ++(map.begin()) != map.end(), "IpMap fill: only one range.")) {
+      check(t, pstatus, -1 == ats_ip_addr_cmp(map.begin()->max(), (++map.begin())->min()), "IpMap fill: ranges not disjoint [%s < %s].", ats_ip_ntop(map.begin()->max(), ipb1, sizeof(ipb1)), ats_ip_ntop((++map.begin())->min(), ipb2, sizeof(ipb2)));
     }
   }
+
+  map.clear();
+  map.fill(&a_loopback, &a_loopback2, markA);
+  map.fill(&a_10_28_56_0, &a_10_28_56_255, markB);
+  check(t, pstatus, !map.contains(&a_63_128_1_12, &mark), "IpMap fill[2]: over extended range.");
+  map.fill(&a0, &a_max, deny);
+  check(t, pstatus, map.getCount() == 5, "IpMap[2]: Fill failed.");
+  if (check(t, pstatus, map.contains(&a_63_128_1_12, &mark), "IpMap fill[2]: missing mark")) {
+    check(t, pstatus, mark == deny, "IpMap fill[2]: missing range");
+  }
+//  IpMapTestPrint(map);
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c3673da9/lib/ts/ink_inet.h
----------------------------------------------------------------------
diff --git a/lib/ts/ink_inet.h b/lib/ts/ink_inet.h
index 9c5ab5f..bee7b12 100644
--- a/lib/ts/ink_inet.h
+++ b/lib/ts/ink_inet.h
@@ -256,8 +256,8 @@ inline sockaddr const* ats_ip_sa_cast(sockaddr_storage const* a) {
 inline sockaddr* ats_ip_sa_cast(sockaddr_in* a) {
   return static_cast<sockaddr*>(static_cast<void*>(a));
 }
-inline sockaddr_storage const* ats_ip_sa_cast(sockaddr_in const* a) {
-  return static_cast<sockaddr_storage const*>(static_cast<void const*>(a));
+inline sockaddr const* ats_ip_sa_cast(sockaddr_in const* a) {
+  return static_cast<sockaddr const*>(static_cast<void const*>(a));
 }
 
 inline sockaddr* ats_ip_sa_cast(sockaddr_in6* a) {