blob: 44a3a582dfca1926caf6221a99fa57358838a06c [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;
alshabibd58d3522014-09-13 17:14:53 -070022import org.onlab.onos.of.controller.Dpid;
alshabibae857582014-09-12 23:53:10 -070023import org.onlab.onos.of.controller.OpenFlowController;
24import org.onlab.onos.of.controller.OpenFlowPacketContext;
25import org.onlab.onos.of.controller.PacketListener;
26import 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() {
51 super(new ProviderId("org.onlab.onos.provider.openflow"));
52 }
53
54 @Activate
55 public void activate() {
56 providerService = providerRegistry.register(this);
alshabibd58d3522014-09-13 17:14:53 -070057 controller.addPacketListener(1, 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
81
82 @Override
83 public void handlePacket(OpenFlowPacketContext pktCtx) {
alshabibd58d3522014-09-13 17:14:53 -070084 DeviceId id = DeviceId.deviceId(Dpid.uri(pktCtx.dpid().value()));
alshabibae857582014-09-12 23:53:10 -070085
alshabibd58d3522014-09-13 17:14:53 -070086 DefaultInboundPacket inPkt = new DefaultInboundPacket(
87 new ConnectPoint(id, PortNumber.portNumber(pktCtx.inPort())),
88 pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed()));
alshabibae857582014-09-12 23:53:10 -070089
alshabibd58d3522014-09-13 17:14:53 -070090 OpenFlowCorePacketContext corePktCtx =
91 new OpenFlowCorePacketContext(0, inPkt, null, false, pktCtx,
92 controller.getSwitch(pktCtx.dpid()));
93 providerService.processPacket(corePktCtx);
alshabibae857582014-09-12 23:53:10 -070094 }
95
96 }
97
98
99}