Redo ArpHandler changes - 1
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
index fe4e6e3..20f05e1 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
@@ -16,8 +16,6 @@
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.ARP;
 import net.onrc.onos.core.packet.Ethernet;
@@ -48,13 +46,12 @@
  * hosts to the controllers.
  * TODO: need to check the network config file for all hosts and packets
  */
-public class ArpHandler implements IPacketListener  {
+public class ArpHandler {
 
     private static final Logger log = LoggerFactory
             .getLogger(ArpHandler.class);
 
     private IFloodlightProviderService floodlightProvider;
-    private IPacketService packetService;
     private IFlowPusherService flowPusher;
     private ITopologyService topologyService;
     private MutableTopology mutableTopology;
@@ -84,45 +81,31 @@
     public ArpHandler(FloodlightModuleContext context, SegmentRoutingManager segmentRoutingManager) {
 
         this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.srManager = segmentRoutingManager;
         this.mutableTopology = topologyService.getTopology();
 
-        packetService.registerPacketListener(this);
-        //arpEntries = new ArrayList<ArpEntry>();
-
         Log.debug("Arp Handler is initialized");
 
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
-        log.debug("Received a packet {} from sw {} ", payload.toString(), sw.getDpid());
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload){
 
-        if (payload.getEtherType() == Ethernet.TYPE_ARP) {
+    	log.debug("ArpHandler: Received a ARP packet from sw {} ", sw.getDpid());
 
-            ARP arp = (ARP)payload.getPayload();
-            srManager.updateArpCache(arp);
+        ARP arp = (ARP)payload.getPayload();
 
-            if (arp.getOpCode() == ARP.OP_REQUEST) {
-                handleArpRequest(sw, inPort, arp);
-            }
-            else {
-                byte[] senderMacAddressByte = arp.getSenderHardwareAddress();
-                String targetMacAddressStr = MacAddress.of(senderMacAddressByte).toString();
-                if (targetMacAddressStr.equals(sw.getStringAttribute("routerMac"))) {
-                    IPv4Address hostIpAddress = IPv4Address.of(arp.getSenderProtocolAddress());
-                    srManager.addRouteToHost(sw,hostIpAddress.getInt(), senderMacAddressByte);
-                }
-            }
-
+        if (arp.getOpCode() == ARP.OP_REQUEST) {
+        	log.debug("ArpHandler: Received a ARP Requestfrom sw {} ", sw.getDpid());
+            handleArpRequest(sw, inPort, payload);
         }
-
+        byte[] senderMacAddressByte = arp.getSenderHardwareAddress();
+        IPv4Address hostIpAddress = IPv4Address.of(arp.getSenderProtocolAddress());
+    	log.debug("ArpHandler: Add IP route to Host {} ", hostIpAddress);
+        srManager.addRouteToHost(sw,hostIpAddress.getInt(), senderMacAddressByte);
     }
 
-
     /**
      * Send an ARP response for the ARP request to the known switches
      *
@@ -130,8 +113,9 @@
      * @param inPort port to send ARP response to
      * @param arpRequest ARP request packet to handle
      */
-    private void handleArpRequest(Switch sw, Port inPort, ARP arpRequest) {
+    private void handleArpRequest(Switch sw, Port inPort, Ethernet payload) {
 
+    	ARP arpRequest = (ARP)payload.getPayload();
         List<String> subnetGatewayIPs = getSubnetGatewayIps(sw);
         String switchMacAddressStr = sw.getStringAttribute("routerMac");
         if (!subnetGatewayIPs.isEmpty()) {
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
index e04ae85..0784144 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
@@ -7,8 +7,6 @@
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.IPv4;
@@ -36,13 +34,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class GenericIpHandler implements IPacketListener {
+public class GenericIpHandler {
 
     private MutableTopology mutableTopology;
     private ITopologyService topologyService;
     private IFloodlightProviderService floodlightProvider;
     private IFlowPusherService flowPusher;
-    private IPacketService packetService;
     private SegmentRoutingManager srManager;
 
     private static final Logger log = LoggerFactory
@@ -66,38 +63,30 @@
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.mutableTopology = topologyService.getTopology();
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.srManager = sr;
 
-        packetService.registerPacketListener(this);
-
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload) {
         // TODO Auto-generated method stub
-        if ((payload.getEtherType() == Ethernet.TYPE_IPV4) &&
-            (((IPv4)payload.getPayload()).getProtocol() != IPv4.PROTOCOL_ICMP)){
+        log.debug("GenericIPHandler: Received a IP packet {} from sw {} ",
+                payload.toString(), sw.getDpid());
+        IPv4 ipv4 = (IPv4)payload.getPayload();
+        int destinationAddress = ipv4.getDestinationAddress();
 
-            log.debug("GenericIPHandler: Received a IP packet {} from sw {} ",
-                    payload.toString(), sw.getDpid());
-            IPv4 ipv4 = (IPv4)payload.getPayload();
-            int destinationAddress = ipv4.getDestinationAddress();
-
-            // Check if the destination is any host known to TopologyService
-            for (net.onrc.onos.core.topology.Host host: mutableTopology.getHosts()) {
-                IPv4Address hostIpAddress = IPv4Address.of(host.getIpAddress());
-                if (hostIpAddress != null && hostIpAddress.getInt() == destinationAddress) {
-                    byte[] destinationMacAddress = host.getMacAddress().toBytes();
-                    addRouteToHost(sw, destinationAddress, destinationMacAddress);
-                    return;
-                }
+        // Check if the destination is any host known to TopologyService
+        for (net.onrc.onos.core.topology.Host host: mutableTopology.getHosts()) {
+            IPv4Address hostIpAddress = IPv4Address.of(host.getIpAddress());
+            if (hostIpAddress != null && hostIpAddress.getInt() == destinationAddress) {
+                byte[] destinationMacAddress = host.getMacAddress().toBytes();
+                addRouteToHost(sw, destinationAddress, destinationMacAddress);
+                return;
             }
+        }
 
-            // Check if the destination is within subnets of the swtich
-            if (isWithinSubnets(sw, IPv4Address.of(destinationAddress).toString())) {
-                srManager.sendArpRequest(sw, destinationAddress, inPort);
-            }
+        // Check if the destination is within subnets of the swtich
+        if (isWithinSubnets(sw, IPv4Address.of(destinationAddress).toString())) {
+            srManager.sendArpRequest(sw, destinationAddress, inPort);
         }
     }
 
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
index b8bbc99..2f5576a 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
@@ -6,8 +6,6 @@
 import net.floodlightcontroller.core.IFloodlightProviderService;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.ICMP;
@@ -41,12 +39,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class IcmpHandler implements IPacketListener {
+public class IcmpHandler {
 
     private SegmentRoutingManager srManager;
     private IFloodlightProviderService floodlightProvider;
     private MutableTopology mutableTopology;
-    private IPacketService packetService;
     private ITopologyService topologyService;
     private static final Logger log = LoggerFactory
             .getLogger(IcmpHandler.class);
@@ -75,18 +72,13 @@
 
         this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.mutableTopology = topologyService.getTopology();
 
         this.srManager = manager;
-
-        packetService.registerPacketListener(this);
-
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload) {
 
         if (payload.getEtherType() == Ethernet.TYPE_IPV4) {
 
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index eedc1c9..b51370f 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -15,11 +15,14 @@
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.api.packet.IPacketListener;
 import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.intent.Path;
 import net.onrc.onos.core.main.config.IConfigInfoService;
 import net.onrc.onos.core.packet.ARP;
+import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.topology.LinkData;
@@ -34,16 +37,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SegmentRoutingManager implements IFloodlightModule, ITopologyListener {
+public class SegmentRoutingManager implements IFloodlightModule,
+						ITopologyListener, IPacketListener {
 
     private static final Logger log = LoggerFactory
             .getLogger(SegmentRoutingManager.class);
     private ITopologyService topologyService;
+    private IPacketService packetService;
     private MutableTopology mutableTopology;
 
     private List<ArpEntry> arpEntries;
     private ArpHandler arpHandler;
     private GenericIpHandler ipHandler;
+    private IcmpHandler icmpHandler;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -76,13 +82,15 @@
     public void init(FloodlightModuleContext context) throws FloodlightModuleException {
 
         arpHandler = new ArpHandler(context, this);
-        IcmpHandler icmpHandler = new IcmpHandler(context, this);
+        icmpHandler = new IcmpHandler(context, this);
         ipHandler = new GenericIpHandler(context, this);
         arpEntries = new ArrayList<ArpEntry>();
         topologyService = context.getServiceImpl(ITopologyService.class);
         mutableTopology = topologyService.getTopology();
         topologyService.addListener(this, false);
 
+        this.packetService = context.getServiceImpl(IPacketService.class);
+        packetService.registerPacketListener(this);
     }
 
     @Override
@@ -91,6 +99,17 @@
 
     }
 
+    @Override
+    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    	if (payload.getEtherType() == Ethernet.TYPE_ARP)
+    		arpHandler.processPacketIn(sw, inPort, payload);
+        if (payload.getEtherType() == Ethernet.TYPE_IPV4) {
+        	if (((IPv4)payload.getPayload()).getProtocol() != IPv4.PROTOCOL_ICMP)
+        		icmpHandler.processPacketIn(sw, inPort, payload);
+        	else
+        		ipHandler.processPacketIn(sw, inPort, payload);
+        }
+    }
     /**
      * Update ARP Cache using ARP packets
      * It is used to set destination MAC address to forward packets to known hosts.