Finished off initial proxy arp implementation
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 1f852c8..90c7db0 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -18,6 +18,7 @@
 import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.topology.ITopologyService;
 import net.floodlightcontroller.topology.NodePortTuple;
+import net.floodlightcontroller.util.MACAddress;
 
 import org.openflow.protocol.OFMessage;
 import org.openflow.protocol.OFPacketIn;
@@ -26,6 +27,7 @@
 import org.openflow.protocol.OFType;
 import org.openflow.protocol.action.OFAction;
 import org.openflow.protocol.action.OFActionOutput;
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,7 +86,7 @@
 			ARP arp = (ARP) eth.getPayload();
 			
 			if (arp.getOpCode() == ARP.OP_REQUEST) {
-				log.debug("ARP request received");
+				log.debug("ARP request received for {}", bytesToStringAddr(arp.getTargetProtocolAddress()));
 				
 				byte[] mac = lookupArpTable(arp.getTargetProtocolAddress());
 				
@@ -100,11 +102,12 @@
 				}
 				else {
 					//We know the address, so send a reply
+					log.debug("Sending reply of {}", MACAddress.valueOf(mac).toString());
 					sendArpReply(arp, pi, mac, sw);
 				}
 			}
 			else if (arp.getOpCode() == ARP.OP_REPLY) {
-				log.debug("ARP reply recieved for {}");
+				log.debug("ARP reply recieved for {}", bytesToStringAddr(arp.getSenderProtocolAddress()));
 				
 				log.debug("arp table {}", arpTable.keySet());
 				
@@ -168,6 +171,11 @@
 			Collection<Short> enabledPorts = sw.getEnabledPortNumbers();
 			Set<Short> linkPorts = topology.getPortsWithLinks(sw.getId());
 			
+			if (linkPorts == null){
+				//I think this means the switch isn't known to topology yet.
+				//Maybe it only just joined.
+				continue;
+			}
 			
 			OFPacketOut po = new OFPacketOut();
 			po.setInPort(OFPort.OFPP_NONE)
@@ -188,6 +196,7 @@
 				}
 				
 				actions.add(new OFActionOutput(portNum));
+				log.debug("Broadcasting out {}/{}", HexString.toHexString(sw.getId()), portNum);
 			}
 			
 			po.setActions(actions);
@@ -232,7 +241,7 @@
 		OFPacketOut po = new OFPacketOut();
 		po.setInPort(OFPort.OFPP_NONE)
 			.setBufferId(-1)
-			.setPacketData(pi.getPacketData())
+			.setPacketData(eth.serialize())
 			.setActions(actions)
 			.setActionsLength((short)OFActionOutput.MINIMUM_LENGTH)
 			.setLengthU(OFPacketOut.MINIMUM_LENGTH + OFActionOutput.MINIMUM_LENGTH
@@ -242,10 +251,24 @@
 		msgList.add(po);
 		
 		try {
+			log.debug("Sending ARP reply to {}/{}", HexString.toHexString(sw.getId()), pi.getInPort());
 			sw.write(msgList, null);
 			sw.flush();
 		} catch (IOException e) {
 			log.warn("Failure writing packet out to switch", e);
 		}
 	}
+	
+	private String bytesToStringAddr(byte[] bytes){
+		InetAddress addr;
+		try {
+			addr = InetAddress.getByAddress(bytes);
+		} catch (UnknownHostException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return "";
+		}
+		if (addr == null) return "";
+		else return addr.getHostAddress();
+	}
 }