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