fix ARP (single onos instance & multiple onos instances)
1. make sure that ARP requests coming from host in a LAN
are not broadcasted to all other edge ports (other ASes)
2. make sure the ARP requests from BGPd host can be singlecast
to other ASes
3. add a 'get external network switch ports' function
4. make the arp work for both single onos instance & multiple
onos instances
5. add a switch ports blacklist. Arp requests are not to be sent
to those switch ports on this list.
Change-Id: I4ffdd73e2ad202517c54690a86109cfa1fbe400f
diff --git a/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
index f872e5c..9cf618a 100644
--- a/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
+++ b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
@@ -3,8 +3,10 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import net.floodlightcontroller.core.FloodlightContext;
@@ -21,6 +23,7 @@
import net.onrc.onos.core.datagrid.IEventChannel;
import net.onrc.onos.core.datagrid.IEventChannelListener;
import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.core.main.config.IConfigInfoService;
import net.onrc.onos.core.packet.Ethernet;
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.Port;
@@ -54,6 +57,7 @@
private MutableTopology mutableTopology;
private IDatagridService datagrid;
private IFlowPusherService flowPusher;
+ private IConfigInfoService configService;
private IEventChannel<Long, PacketOutNotification> packetOutEventChannel;
@@ -69,12 +73,14 @@
@Override
public void entryAdded(PacketOutNotification value) {
Multimap<Long, Short> localPorts = HashMultimap.create();
+
for (IOFSwitch sw : floodlightProvider.getSwitches().values()) {
for (OFPortDesc port : sw.getEnabledPorts()) {
// XXX S fix this to int
localPorts.put(sw.getId(), port.getPortNo().getShortPortNumber());
}
}
+
Multimap<Long, Short> outPorts = value.calculateOutPorts(
localPorts, mutableTopology);
sendPacketToSwitches(outPorts, value.getPacketData());
@@ -118,16 +124,21 @@
}
@Override
- public void broadcastPacketOutEdge(Ethernet eth) {
+ public void broadcastPacketOutInternalEdge(Ethernet eth) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
- public void broadcastPacketOutEdge(Ethernet eth, SwitchPort inSwitchPort) {
+ public void broadcastPacketOutInternalEdge(Ethernet eth, SwitchPort inSwitchPort) {
+
+ Set<SwitchPort> blacklistSwitchPorts = new HashSet<SwitchPort>(configService
+ .getExternalSwitchPorts());
+ blacklistSwitchPorts.add(inSwitchPort);
+
BroadcastPacketOutNotification notification =
new BroadcastPacketOutNotification(eth.serialize(), 0,
- inSwitchPort.getDpid().value(), inSwitchPort.getPortNumber().shortValue());
+ blacklistSwitchPorts);
long dstMac = eth.getDestinationMAC().toLong();
packetOutEventChannel.addTransientEntry(dstMac, notification);
@@ -209,6 +220,7 @@
dependencies.add(ITopologyService.class);
dependencies.add(IDatagridService.class);
dependencies.add(IFlowPusherService.class);
+ dependencies.add(IConfigInfoService.class);
return dependencies;
}
@@ -221,6 +233,7 @@
.getTopology();
datagrid = context.getServiceImpl(IDatagridService.class);
flowPusher = context.getServiceImpl(IFlowPusherService.class);
+ configService = context.getServiceImpl(IConfigInfoService.class);
}
@Override