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()));
+		}
+	}
 }