Fix for ARPs being broadcast out the input port
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 eadbbdd..5d09f96 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -363,7 +363,7 @@
if(!outPorts.iterator().hasNext()){
log.debug("outPort : null");
- sendToOtherNodes(eth, pi);
+ sendToOtherNodes(eth, sw.getId(), pi);
}else{
for (IPortObject portObject : outPorts) {
@@ -391,7 +391,7 @@
log.debug("The Device info in DB is {} for IP {}", targetDevice, inetAddressToString(arp.getTargetProtocolAddress()));
// We don't know the device so broadcast the request out
- sendToOtherNodes(eth, pi);
+ sendToOtherNodes(eth, sw.getId(), pi);
}
}
@@ -516,7 +516,7 @@
}
}
- private void sendToOtherNodes(Ethernet eth, OFPacketIn pi) {
+ private void sendToOtherNodes(Ethernet eth, long inSwitchId, OFPacketIn pi) {
ARP arp = (ARP) eth.getPayload();
if (log.isTraceEnabled()) {
@@ -532,7 +532,8 @@
return;
}
- datagrid.sendArpRequest(ArpMessage.newRequest(targetAddress, eth.serialize()));
+ datagrid.sendArpRequest(ArpMessage.newRequest(targetAddress, eth.serialize(),
+ -1L, (short)-1, inSwitchId, pi.getInPort()));
}
//hazelcast to other ONOS instances to send the ARP packet out on outPort of outSwitch
private void sendToOtherNodes(Ethernet eth, OFPacketIn pi, long outSwitch, short outPort) {
@@ -628,7 +629,8 @@
}
}
- private void broadcastArpRequestOutMyEdge(byte[] arpRequest) {
+ private void broadcastArpRequestOutMyEdge(byte[] arpRequest,
+ long inSwitch, short inPort) {
List<SwitchPort> switchPorts = new ArrayList<SwitchPort>();
for (IOFSwitch sw : floodlightProvider.getSwitches().values()) {
@@ -648,9 +650,17 @@
for (IPortObject portObject : ports) {
if (!portObject.getLinkedPorts().iterator().hasNext()) {
+ short portNumber = portObject.getNumber();
+
+ if (sw.getId() == inSwitch && portNumber == inPort) {
+ // This is the port that the ARP message came in,
+ // so don't broadcast out this port
+ continue;
+ }
+
switchPorts.add(new SwitchPort(new Dpid(sw.getId()),
- new Port(portObject.getNumber())));
- actions.add(new OFActionOutput(portObject.getNumber()));
+ new Port(portNumber)));
+ actions.add(new OFActionOutput(portNumber));
}
}
@@ -814,7 +824,8 @@
switch (arpMessage.getType()){
case REQUEST:
if(arpMessage.getOutSwitch() == -1 || arpMessage.getOutPort() == -1){
- broadcastArpRequestOutMyEdge(arpMessage.getPacket());
+ broadcastArpRequestOutMyEdge(arpMessage.getPacket(),
+ arpMessage.getInSwitch(), arpMessage.getInPort());
}else{
sendArpRequestOutPort(arpMessage.getPacket(),arpMessage.getOutSwitch(),arpMessage.getOutPort());
log.debug("OutSwitch in ARP request message is: {}; OutPort in ARP request message is: {}",arpMessage.getOutSwitch(),arpMessage.getOutPort());