Created a packet service which presents a global-context API to
applications for packet events.
The API will provide both packet-ins and packet-outs. Packet-ins have been
implemented, packet-outs are left for a future commit.
Change-Id: Ia1666412ebc68912c6c84e43a7cbc327fcd0e8f8
diff --git a/src/main/java/net/onrc/onos/api/packet/IPacketListener.java b/src/main/java/net/onrc/onos/api/packet/IPacketListener.java
new file mode 100644
index 0000000..000ed7a
--- /dev/null
+++ b/src/main/java/net/onrc/onos/api/packet/IPacketListener.java
@@ -0,0 +1,9 @@
+package net.onrc.onos.api.packet;
+
+import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.topology.Port;
+import net.onrc.onos.core.topology.Switch;
+
+public interface IPacketListener {
+ public void receive(Switch sw, Port inPort, Ethernet payload);
+}
diff --git a/src/main/java/net/onrc/onos/api/packet/IPacketService.java b/src/main/java/net/onrc/onos/api/packet/IPacketService.java
new file mode 100644
index 0000000..eaa372d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/api/packet/IPacketService.java
@@ -0,0 +1,21 @@
+package net.onrc.onos.api.packet;
+
+import java.util.List;
+
+import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.topology.Port;
+
+public interface IPacketService extends IFloodlightService {
+ // packet ins
+ public void registerPacketListener(IPacketListener listener);
+
+ // packet outs
+ public void sendPacket(Port port, Ethernet eth);
+
+ public void sendPacket(List<Port> ports, Ethernet eth);
+
+ public void broadcastPacket(Ethernet eth);
+
+ public void broadcastPacket(Ethernet eth, Port inPort);
+}
diff --git a/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
new file mode 100644
index 0000000..b804a82
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packetservice/PacketModule.java
@@ -0,0 +1,159 @@
+package net.onrc.onos.core.packetservice;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import net.floodlightcontroller.core.FloodlightContext;
+import net.floodlightcontroller.core.IFloodlightProviderService;
+import net.floodlightcontroller.core.IOFMessageListener;
+import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+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.packet.Ethernet;
+import net.onrc.onos.core.topology.INetworkGraphService;
+import net.onrc.onos.core.topology.NetworkGraph;
+import net.onrc.onos.core.topology.Port;
+import net.onrc.onos.core.topology.Switch;
+
+import org.openflow.protocol.OFMessage;
+import org.openflow.protocol.OFPacketIn;
+import org.openflow.protocol.OFType;
+
+public class PacketModule implements IOFMessageListener, IPacketService,
+ IFloodlightModule {
+
+ private final CopyOnWriteArrayList<IPacketListener> listeners;
+
+ private IFloodlightProviderService floodlightProvider;
+ private NetworkGraph networkGraph;
+
+ public PacketModule() {
+ listeners = new CopyOnWriteArrayList<>();
+ }
+
+ @Override
+ public void registerPacketListener(IPacketListener listener) {
+ listeners.addIfAbsent(listener);
+ }
+
+ @Override
+ public void sendPacket(Port port, Ethernet eth) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void sendPacket(List<Port> ports, Ethernet eth) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void broadcastPacket(Ethernet eth) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void broadcastPacket(Ethernet eth, Port inPort) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isCallbackOrderingPrereq(OFType type, String name) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isCallbackOrderingPostreq(OFType type, String name) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Command receive(IOFSwitch sw, OFMessage msg,
+ FloodlightContext cntx) {
+ if (!(msg instanceof OFPacketIn)) {
+ return Command.CONTINUE;
+ }
+
+ OFPacketIn pi = (OFPacketIn) msg;
+
+ Ethernet eth = IFloodlightProviderService.bcStore.
+ get(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
+
+ Switch networkGraphSwitch;
+ Port inPort;
+ try {
+ networkGraph.acquireReadLock();
+ networkGraphSwitch = networkGraph.getSwitch(sw.getId());
+ inPort = networkGraph.getPort(sw.getId(), (long) pi.getInPort());
+ } finally {
+ networkGraph.releaseReadLock();
+ }
+
+ if (networkGraphSwitch == null || inPort == null) {
+ return Command.CONTINUE;
+ }
+
+ for (IPacketListener listener : listeners) {
+ listener.receive(networkGraphSwitch, inPort, eth);
+ }
+
+ return Command.CONTINUE;
+ }
+
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+ List<Class<? extends IFloodlightService>> services = new ArrayList<>();
+ services.add(IPacketService.class);
+ return services;
+ }
+
+ @Override
+ public Map<Class<? extends IFloodlightService>, IFloodlightService>
+ getServiceImpls() {
+ Map<Class<? extends IFloodlightService>, IFloodlightService>
+ serviceImpls = new HashMap<>();
+ serviceImpls.put(IPacketService.class, this);
+ return serviceImpls;
+ }
+
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+ List<Class<? extends IFloodlightService>> dependencies = new ArrayList<>();
+ dependencies.add(IFloodlightProviderService.class);
+ dependencies.add(INetworkGraphService.class);
+ return dependencies;
+ }
+
+ @Override
+ public void init(FloodlightModuleContext context)
+ throws FloodlightModuleException {
+ floodlightProvider =
+ context.getServiceImpl(IFloodlightProviderService.class);
+ networkGraph = context.getServiceImpl(INetworkGraphService.class)
+ .getNetworkGraph();
+ }
+
+ @Override
+ public void startUp(FloodlightModuleContext context) {
+ floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
+ }
+}
diff --git a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
index dff2708..83e6b68 100644
--- a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
+++ b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
@@ -21,3 +21,4 @@
net.onrc.onos.core.topology.NetworkGraphModule
net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule
net.onrc.onos.core.intent.runtime.PlanInstallModule
+net.onrc.onos.core.packetservice.PacketModule