blob: bc5b892f5766c8e955e72720595a079fc8605f96 [file] [log] [blame]
alshabibae857582014-09-12 23:53:10 -07001package org.onlab.onos.provider.of.packet.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
alshabibd58d3522014-09-13 17:14:53 -07005import java.nio.ByteBuffer;
6
alshabibae857582014-09-12 23:53:10 -07007import org.apache.felix.scr.annotations.Activate;
8import org.apache.felix.scr.annotations.Component;
9import org.apache.felix.scr.annotations.Deactivate;
10import org.apache.felix.scr.annotations.Reference;
11import org.apache.felix.scr.annotations.ReferenceCardinality;
alshabibd58d3522014-09-13 17:14:53 -070012import org.onlab.onos.net.ConnectPoint;
13import org.onlab.onos.net.DeviceId;
14import org.onlab.onos.net.PortNumber;
15import org.onlab.onos.net.packet.DefaultInboundPacket;
alshabibae857582014-09-12 23:53:10 -070016import org.onlab.onos.net.packet.OutboundPacket;
17import org.onlab.onos.net.packet.PacketProvider;
18import org.onlab.onos.net.packet.PacketProviderRegistry;
19import org.onlab.onos.net.packet.PacketProviderService;
20import org.onlab.onos.net.provider.AbstractProvider;
21import org.onlab.onos.net.provider.ProviderId;
tom9c94c5b2014-09-17 13:14:42 -070022import org.onlab.onos.openflow.controller.Dpid;
23import org.onlab.onos.openflow.controller.OpenFlowController;
24import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
25import org.onlab.onos.openflow.controller.PacketListener;
alshabibae857582014-09-12 23:53:10 -070026import org.slf4j.Logger;
27
28/**
29 * Provider which uses an OpenFlow controller to detect network
30 * infrastructure links.
31 */
32@Component(immediate = true)
33public class OpenFlowPacketProvider extends AbstractProvider implements PacketProvider {
34
35 private final Logger log = getLogger(getClass());
36
37 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
38 protected PacketProviderRegistry providerRegistry;
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
41 protected OpenFlowController controller;
42
43 private PacketProviderService providerService;
44
alshabibae857582014-09-12 23:53:10 -070045 private final InternalPacketProvider listener = new InternalPacketProvider();
46
alshabibae857582014-09-12 23:53:10 -070047 /**
48 * Creates an OpenFlow link provider.
49 */
50 public OpenFlowPacketProvider() {
tom7e02cda2014-09-18 12:05:46 -070051 super(new ProviderId("of", "org.onlab.onos.provider.openflow"));
alshabibae857582014-09-12 23:53:10 -070052 }
53
54 @Activate
55 public void activate() {
56 providerService = providerRegistry.register(this);
alshabib8aef1ad2014-09-15 17:47:31 -070057 controller.addPacketListener(20, listener);
alshabibae857582014-09-12 23:53:10 -070058 log.info("Started");
59 }
60
61 @Deactivate
62 public void deactivate() {
63 providerRegistry.unregister(this);
64 controller.removePacketListener(listener);
65 providerService = null;
66 log.info("Stopped");
67 }
68
69 @Override
70 public void emit(OutboundPacket packet) {
alshabibae857582014-09-12 23:53:10 -070071
72 }
73
74
alshabibd58d3522014-09-13 17:14:53 -070075 /**
76 * Internal Packet Provider implementation.
77 *
78 */
alshabibae857582014-09-12 23:53:10 -070079 private class InternalPacketProvider implements PacketListener {
80
alshabibae857582014-09-12 23:53:10 -070081 @Override
82 public void handlePacket(OpenFlowPacketContext pktCtx) {
alshabibd58d3522014-09-13 17:14:53 -070083 DeviceId id = DeviceId.deviceId(Dpid.uri(pktCtx.dpid().value()));
alshabibae857582014-09-12 23:53:10 -070084
alshabibd58d3522014-09-13 17:14:53 -070085 DefaultInboundPacket inPkt = new DefaultInboundPacket(
86 new ConnectPoint(id, PortNumber.portNumber(pktCtx.inPort())),
87 pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed()));
alshabibae857582014-09-12 23:53:10 -070088
alshabibd58d3522014-09-13 17:14:53 -070089 OpenFlowCorePacketContext corePktCtx =
alshabib9842a4e2014-09-16 21:42:35 -070090 new OpenFlowCorePacketContext(System.currentTimeMillis(),
91 inPkt, null, pktCtx.isHandled(), pktCtx);
alshabibd58d3522014-09-13 17:14:53 -070092 providerService.processPacket(corePktCtx);
alshabibae857582014-09-12 23:53:10 -070093 }
94
95 }
96
97
98}