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.