blob: 637ada8f7cc5e79ccf356ff527d1beceeee926b6 [file] [log] [blame]
alshabib7674db42014-09-12 23:40:46 -07001package org.onlab.onos.net.trivial.packet.impl;
2
alshabib030111e2014-09-15 15:56:42 -07003import static com.google.common.base.Preconditions.checkNotNull;
alshabib7674db42014-09-12 23:40:46 -07004import static org.slf4j.LoggerFactory.getLogger;
5
alshabibd58d3522014-09-13 17:14:53 -07006import java.util.Map;
7import java.util.TreeMap;
alshabib7674db42014-09-12 23:40:46 -07008
9import org.apache.felix.scr.annotations.Activate;
10import org.apache.felix.scr.annotations.Component;
11import org.apache.felix.scr.annotations.Deactivate;
12import org.apache.felix.scr.annotations.Reference;
13import org.apache.felix.scr.annotations.ReferenceCardinality;
14import org.apache.felix.scr.annotations.Service;
15import org.onlab.onos.net.Device;
16import org.onlab.onos.net.device.DeviceService;
17import org.onlab.onos.net.packet.OutboundPacket;
18import org.onlab.onos.net.packet.PacketContext;
19import org.onlab.onos.net.packet.PacketProcessor;
20import org.onlab.onos.net.packet.PacketProvider;
21import org.onlab.onos.net.packet.PacketProviderRegistry;
22import org.onlab.onos.net.packet.PacketProviderService;
23import org.onlab.onos.net.packet.PacketService;
24import org.onlab.onos.net.provider.AbstractProviderRegistry;
25import org.onlab.onos.net.provider.AbstractProviderService;
26import org.slf4j.Logger;
27
28
29/**
30 * Provides a basic implementation of the packet SB & NB APIs.
31 *
32 */
33@Component(immediate = true)
34@Service
35public class SimplePacketManager
36extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
37implements PacketService, PacketProviderRegistry {
38
39 private final Logger log = getLogger(getClass());
40
41 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
42 private DeviceService deviceService;
43
alshabibd58d3522014-09-13 17:14:53 -070044 private final Map<Integer, PacketProcessor> processors = new TreeMap<>();
alshabib7674db42014-09-12 23:40:46 -070045
alshabib7674db42014-09-12 23:40:46 -070046
47 @Activate
48 public void activate() {
alshabib7674db42014-09-12 23:40:46 -070049 log.info("Started");
50 }
51
52 @Deactivate
53 public void deactivate() {
alshabib7674db42014-09-12 23:40:46 -070054 log.info("Stopped");
55 }
56
57 @Override
58 public void addProcessor(PacketProcessor processor, int priority) {
alshabib030111e2014-09-15 15:56:42 -070059 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070060 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -070061 }
62
63 @Override
64 public void removeProcessor(PacketProcessor processor) {
alshabibd58d3522014-09-13 17:14:53 -070065 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -070066 }
67
68 @Override
69 public void emit(OutboundPacket packet) {
70 final Device device = deviceService.getDevice(packet.sendThrough());
71 final PacketProvider packetProvider = getProvider(device.providerId());
72 packetProvider.emit(packet);
73 }
74
75 @Override
76 protected PacketProviderService createProviderService(
77 PacketProvider provider) {
78 return new InternalPacketProviderService(provider);
79 }
80
81 // Personalized link provider service issued to the supplied provider.
82 private class InternalPacketProviderService
83 extends AbstractProviderService<PacketProvider>
84 implements PacketProviderService {
85
86 protected InternalPacketProviderService(PacketProvider provider) {
87 super(provider);
88 }
89
90 @Override
91 public void processPacket(PacketContext context) {
alshabibd58d3522014-09-13 17:14:53 -070092 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -070093 processor.process(context);
94 }
95 }
96
97 }
alshabibae857582014-09-12 23:53:10 -070098}