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
[6/12] git commit: New tests, passed.
New tests, passed.
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/597c21e2
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/597c21e2
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/597c21e2
Branch: refs/heads/master
Commit: 597c21e29535eeb1eaf8057e003c499309f5987e
Parents: fcd092c
Author: Alan M. Carroll <am...@network-geographics.com>
Authored: Tue Mar 20 12:33:29 2012 -0500
Committer: Alan M. Carroll <am...@network-geographics.com>
Committed: Tue Mar 20 12:33:29 2012 -0500
----------------------------------------------------------------------
lib/ts/IpMap.cc | 87 ++++++++++++++++++++++------------------------
lib/ts/IpMapTest.cc | 38 ++++++++++++++++----
2 files changed, 73 insertions(+), 52 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/597c21e2/lib/ts/IpMap.cc
----------------------------------------------------------------------
diff --git a/lib/ts/IpMap.cc b/lib/ts/IpMap.cc
index 14ce6ab..cfb0791 100644
--- a/lib/ts/IpMap.cc
+++ b/lib/ts/IpMap.cc
@@ -514,49 +514,48 @@ inline int cmp(sockaddr_in6 const& lhs, sockaddr_in6 const& rhs) {
/// Less than.
inline bool operator<(sockaddr_in6 const& lhs, sockaddr_in6 const& rhs) {
- return -1 == ts::detail::cmp(lhs, rhs);
+ return ts::detail::cmp(lhs, rhs) < 0;
}
inline bool operator<(sockaddr_in6 const* lhs, sockaddr_in6 const& rhs) {
- return -1 == ts::detail::cmp(*lhs, rhs);
+ return ts::detail::cmp(*lhs, rhs) < 0;
}
/// Less than.
inline bool operator<(sockaddr_in6 const& lhs, sockaddr_in6 const* rhs) {
- return -1 == ts::detail::cmp(lhs, *rhs);
+ return ts::detail::cmp(lhs, *rhs) < 0;
}
/// Equality.
inline bool operator==(sockaddr_in6 const& lhs, sockaddr_in6 const* rhs) {
- return 0 == ts::detail::cmp(lhs, *rhs);
+ return ts::detail::cmp(lhs, *rhs) == 0;
}
/// Equality.
inline bool operator==(sockaddr_in6 const* lhs, sockaddr_in6 const& rhs) {
- return 0 == ts::detail::cmp(*lhs, rhs);
+ return ts::detail::cmp(*lhs, rhs) == 0;
}
/// Equality.
inline bool operator==(sockaddr_in6 const& lhs, sockaddr_in6 const& rhs) {
- return 0 == ts::detail::cmp(lhs, rhs);
+ return ts::detail::cmp(lhs, rhs) == 0;
}
/// Less than or equal.
inline bool operator<=(sockaddr_in6 const& lhs, sockaddr_in6 const* rhs) {
- return 1 != ts::detail::cmp(lhs, *rhs);
+ return ts::detail::cmp(lhs, *rhs) <= 0;
}
/// Less than or equal.
inline bool operator<=(sockaddr_in6 const& lhs, sockaddr_in6 const& rhs) {
- return 1 != ts::detail::cmp(lhs, rhs);
+ return ts::detail::cmp(lhs, rhs) <= 0;
}
/// Greater than or equal.
inline bool operator>=(sockaddr_in6 const& lhs, sockaddr_in6 const& rhs) {
- return -1 != ts::detail::cmp(lhs, rhs);
+ return ts::detail::cmp(lhs, rhs) >= 0;
}
/// Greater than or equal.
inline bool operator>=(sockaddr_in6 const& lhs, sockaddr_in6 const* rhs) {
- return -1 != ts::detail::cmp(lhs, *rhs);
+ return ts::detail::cmp(lhs, *rhs) >= 0;
}
/// Greater than.
inline bool operator>(sockaddr_in6 const& lhs, sockaddr_in6 const* rhs) {
- return 1 == ts::detail::cmp(lhs, *rhs);
+ return ts::detail::cmp(lhs, *rhs) > 0;
}
-
template < typename N > N*
IpMapBase<N>::lowerBound(ArgType target) {
N* n = _root; // current node to test.
@@ -598,25 +597,21 @@ 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;
- /* 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;
- } else if (n->_data != payload) { // different payload, clip range on left.
- min = n->_max;
- N::inc(min);
- n = next(n);
- } else { // skew overlap with same payload, use node and continue.
- x = n;
- n = next(n);
+ if (n->_min < min) {
+ Metric min_1 = min;
+ N::dec(min_1); // dec is OK because min isn't zero.
+ if (n->_max < min_1) { // no overlap or adj.
+ n = next(n);
+ } else if (n->_max >= max) { // incoming range is covered, just discard.
+ return *this;
+ } else if (n->_data != payload) { // different payload, clip range on left.
+ min = n->_max;
+ N::inc(min);
+ n = next(n);
+ } else { // skew overlap with same payload, use node and continue.
+ x = n;
+ n = next(n);
+ }
}
} else {
n = this->getHead();
@@ -655,7 +650,7 @@ IpMapBase<N>::fill(ArgType rmin, ArgType rmax, void* payload) {
} else { // not carrying a span.
if (n->_max <= max) { // next range is covered - use it.
x = n;
- n->setMin(min);
+ x->setMin(min);
n = next(n);
} else if (n->_min <= max_plus1) {
n->setMin(min);
@@ -677,23 +672,25 @@ IpMapBase<N>::fill(ArgType rmin, ArgType rmax, void* payload) {
x->setMaxMinusOne(n->_min);
x = 0;
min = n->_max;
- N::inc(min);
+ N::inc(min); // OK because n->_max maximal => next is null.
n = next(n);
}
- } else {
+ } else { // no carry node.
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);
+ return *this;
+ } else {
+ if (min < n->_min) { // leading section, need node.
+ N* y = new N(min, n->_min, payload);
+ y->decrementMax();
+ this->insertBefore(n, y);
+ }
+ if (max <= n->_max) // nothing past node
+ return *this;
+ min = n->_max;
+ N::inc(min);
+ n = next(n);
}
- if (max <= n->_max) return *this;
- min = n->_max;
- N::inc(min);
- n = next(n);
}
}
}
@@ -815,7 +812,7 @@ IpMapBase<N>::mark(ArgType min, ArgType max, void* payload) {
this->remove(y);
} else if (max_plus < n->_min) { // no overlap, done.
break;
- } else if (n->_data == payload) { // skew overlap same payload
+ } else if (n->_data == payload) { // skew overlap or adj., same payload
x->setMax(n->_max);
y = n;
n = next(n);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/597c21e2/lib/ts/IpMapTest.cc
----------------------------------------------------------------------
diff --git a/lib/ts/IpMapTest.cc b/lib/ts/IpMapTest.cc
index 34a0bfb..78a25c9 100644
--- a/lib/ts/IpMapTest.cc
+++ b/lib/ts/IpMapTest.cc
@@ -151,7 +151,6 @@ REGRESSION_TEST(IpMap_Unmark)(RegressionTest* t, int atype, int* pstatus) {
tb.check(!map.contains(&a_0), "IpMap Unmark: Range unmark zero address not removed.");
tb.check(!map.contains(&a_0_0_0_16), "IpMap Unmark: Range unmark zero bounded range max not removed.");
tb.check(map.contains(&a_0_0_0_17), "IpMap Unmark: Range unmark zero bounded range max+1 removed.");
- IpMapTestPrint(map);
}
REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
@@ -162,7 +161,7 @@ REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
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* const markC = reinterpret_cast<void*>(3);
void* mark; // for retrieval
IpEndpoint a0,a_10_28_56_0,a_10_28_56_255,a3,a4;
@@ -170,7 +169,7 @@ REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
IpEndpoint a_10_28_55_255, a_10_28_57_0;
IpEndpoint a_63_128_1_12;
IpEndpoint a_0000_0000, a_0000_0001, a_ffff_ffff;
- IpEndpoint a_fe80_9d89, a_fe80_9d90, a_fe80_9d95, a_fe80_9d9d, a_fe80_9d9e;
+ IpEndpoint a_fe80_9d8f, a_fe80_9d90, a_fe80_9d95, a_fe80_9d9d, a_fe80_9d9e;
*pstatus = REGRESSION_TEST_PASSED;
@@ -189,7 +188,7 @@ REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
ats_ip_pton("::", &a_0000_0000);
ats_ip_pton("::1", &a_0000_0001);
ats_ip_pton("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", &a_ffff_ffff);
- ats_ip_pton("fe80::221:9bff:fe10:9d89", &a_fe80_9d89);
+ ats_ip_pton("fe80::221:9bff:fe10:9d8f", &a_fe80_9d8f);
ats_ip_pton("fe80::221:9bff:fe10:9d90", &a_fe80_9d90);
ats_ip_pton("fe80::221:9bff:fe10:9d95", &a_fe80_9d95);
ats_ip_pton("fe80::221:9bff:fe10:9d9d", &a_fe80_9d9d);
@@ -239,8 +238,8 @@ REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
"IpMap Fill[v6]: Max address has bad mark.");
tb.check(map.contains(&a_fe80_9d90, &mark) && mark == markA,
"IpMap Fill[v6]: 9d90 address has bad mark.");
- tb.check(map.contains(&a_fe80_9d89, &mark) && mark == markB,
- "IpMap Fill[v6]: 9d89 address has bad mark.");
+ tb.check(map.contains(&a_fe80_9d8f, &mark) && mark == markB,
+ "IpMap Fill[v6]: 9d8f address has bad mark.");
tb.check(map.contains(&a_fe80_9d9d, &mark) && mark == markA,
"IpMap Fill[v6]: 9d9d address has bad mark.");
tb.check(map.contains(&a_fe80_9d9e, &mark) && mark == markB,
@@ -248,5 +247,30 @@ REGRESSION_TEST(IpMap_Fill)(RegressionTest* t, int atype, int* pstatus) {
tb.check(map.contains(&a_0000_0001, &mark) && mark == markA,
"IpMap Fill[v6]: ::1 has bad mark.");
- IpMapTestPrint(map);
+ tb.check(map.getCount() == 10, "IpMap Fill[pre-refill]: Bad range count.");
+ // These should be ignored by the map as it is completely covered for IPv6.
+ map.fill(&a_fe80_9d90, &a_fe80_9d9d, markA);
+ map.fill(&a_0000_0001, &a_0000_0001, markC);
+ map.fill(&a_0000_0000, &a_ffff_ffff, markB);
+ tb.check(map.getCount() == 10, "IpMap Fill[post-refill]: Bad range count.");
+
+ map.clear();
+ map.fill(&a_fe80_9d90, &a_fe80_9d9d, markA);
+ map.fill(&a_0000_0001, &a_0000_0001, markC);
+ map.fill(&a_0000_0000, &a_ffff_ffff, markB);
+ tb.check(map.contains(&a_0000_0000, &mark) && mark == markB,
+ "IpMap Fill[v6-2]: Zero address has bad mark.");
+ tb.check(map.contains(&a_ffff_ffff, &mark) && mark == markB,
+ "IpMap Fill[v6-2]: Max address has bad mark.");
+ tb.check(map.contains(&a_fe80_9d90, &mark) && mark == markA,
+ "IpMap Fill[v6-2]: 9d90 address has bad mark.");
+ tb.check(map.contains(&a_fe80_9d8f, &mark) && mark == markB,
+ "IpMap Fill[v6-2]: 9d8f address has bad mark.");
+ tb.check(map.contains(&a_fe80_9d9d, &mark) && mark == markA,
+ "IpMap Fill[v6-2]: 9d9d address has bad mark.");
+ tb.check(map.contains(&a_fe80_9d9e, &mark) && mark == markB,
+ "IpMap Fill[v6-2]: 9d9b address has bad mark.");
+ tb.check(map.contains(&a_0000_0001, &mark) && mark == markC,
+ "IpMap Fill[v6-2]: ::1 has bad mark.");
+
}