Fixed bug in Prefix which caused some updates not to be added to the PTrie, and reverted ProxyArp to broadcasting every received request
diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
index 1b55cd6..c36d4a5 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
@@ -494,12 +494,19 @@
@Override
public void newRibUpdate(RibUpdate update) {
- ribUpdates.add(update);
+ try {
+ ribUpdates.put(update);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ log.debug(" ", e);
+ }
}
public synchronized void processRibAdd(RibUpdate update) {
Prefix prefix = update.getPrefix();
+ log.debug("Processing prefix add {}", prefix);
+
//PtreeNode node = ptree.acquire(prefix.getAddress(), prefix.getPrefixLength());
RibEntry rib = ptree.put(prefix, update.getRibEntry());
@@ -1165,6 +1172,7 @@
break;
}
} catch (InterruptedException e) {
+ log.debug("interrupted", e);
interrupted = true;
}
}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/Prefix.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/Prefix.java
index c40214b..21dd45c 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/Prefix.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/Prefix.java
@@ -73,13 +73,12 @@
byte lastByte = address[lastByteIndex];
byte mask = 0;
- byte lsb = 1;
+ byte msb = (byte) 0x80;
int lastBit = (prefixLength - 1) % Byte.SIZE;
for (int i = 0; i < Byte.SIZE; i++) {
- if (i <= lastBit + 1) {
- mask |= lsb;
+ if (i <= lastBit) {
+ mask |= (msb >> i);
}
- mask <<= 1;
}
result[lastByteIndex] = (byte) (lastByte & mask);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
index 8ef388a..521ba0f 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -223,19 +223,13 @@
return;
}
- boolean shouldBroadcastRequest = false;
- synchronized (arpRequests) {
- if (!arpRequests.containsKey(target)) {
- shouldBroadcastRequest = true;
- }
- arpRequests.put(target, new ArpRequest(
- new HostArpRequester(this, arp, sw.getId(), pi.getInPort()), false));
- }
+ //Should we just broadcast all received requests here? Or rate limit
+ //if we know we just sent an request?
+ arpRequests.put(target, new ArpRequest(
+ new HostArpRequester(this, arp, sw.getId(), pi.getInPort()), false));
//Flood the request out edge ports
- if (shouldBroadcastRequest) {
- broadcastArpRequestOutEdge(pi.getPacketData(), sw.getId(), pi.getInPort());
- }
+ broadcastArpRequestOutEdge(pi.getPacketData(), sw.getId(), pi.getInPort());
}
else {
//We know the address, so send a reply
diff --git a/src/test/java/net/onrc/onos/ofcontroller/bgproute/PrefixTest.java b/src/test/java/net/onrc/onos/ofcontroller/bgproute/PrefixTest.java
index 01c5ea7..6ebaf0f 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/bgproute/PrefixTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/bgproute/PrefixTest.java
@@ -63,4 +63,39 @@
assertEquals(p1.hashCode(), p3.hashCode());
}
+ @Test
+ public void testPrefixReturnsSame() {
+ //Create a prefix of all 1s for each prefix length.
+ //Check that Prefix doesn't mangle it
+ int MAX_PREFIX_LENGTH = 32;
+ for (int prefixLength = 1; prefixLength <= MAX_PREFIX_LENGTH; prefixLength++) {
+ byte address[] = new byte[MAX_PREFIX_LENGTH/Byte.SIZE];
+
+ int lastByte = (prefixLength - 1) / Byte.SIZE;
+ int lastBit = (prefixLength - 1) % Byte.SIZE;
+
+ for (int j = 0; j < address.length; j++) {
+ if (j < lastByte) {
+ address[j] = (byte)0xff;
+ }
+ else if (j == lastByte) {
+ byte b = 0;
+ byte msb = (byte) 0x80;
+ for (int k = 0; k < Byte.SIZE; k++) {
+ if (k <= lastBit) {
+ b |= (msb >> k);
+ }
+ }
+ address[j] = b;
+ }
+ else {
+ address[j] = 0;
+ }
+ }
+
+ Prefix p = new Prefix(address, prefixLength);
+ System.out.println(p.printAsBits());
+ assertTrue(Arrays.equals(address, p.getAddress()));
+ }
+ }
}