blob: 95d366463504ca49dddd151fee6f5fdfc52ad2c0 [file] [log] [blame]
alshabib7674db42014-09-12 23:40:46 -07001package org.onlab.onos.net.trivial.packet.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
alshabibd58d3522014-09-13 17:14:53 -07005import java.util.Map;
6import java.util.TreeMap;
alshabib7674db42014-09-12 23:40:46 -07007
8import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
11import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
13import org.apache.felix.scr.annotations.Service;
14import org.onlab.onos.net.Device;
15import org.onlab.onos.net.device.DeviceService;
16import org.onlab.onos.net.packet.OutboundPacket;
17import org.onlab.onos.net.packet.PacketContext;
18import org.onlab.onos.net.packet.PacketProcessor;
19import org.onlab.onos.net.packet.PacketProvider;
20import org.onlab.onos.net.packet.PacketProviderRegistry;
21import org.onlab.onos.net.packet.PacketProviderService;
22import org.onlab.onos.net.packet.PacketService;
23import org.onlab.onos.net.provider.AbstractProviderRegistry;
24import org.onlab.onos.net.provider.AbstractProviderService;
25import org.slf4j.Logger;
26
27
28/**
29 * Provides a basic implementation of the packet SB & NB APIs.
30 *
31 */
32@Component(immediate = true)
33@Service
34public class SimplePacketManager
35extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
36implements PacketService, PacketProviderRegistry {
37
38 private final Logger log = getLogger(getClass());
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
41 private DeviceService deviceService;
42
alshabibd58d3522014-09-13 17:14:53 -070043 private final Map<Integer, PacketProcessor> processors = new TreeMap<>();
alshabib7674db42014-09-12 23:40:46 -070044
45 private final PacketProcessor reactiveProcessor = new ReactivePacketProcessor();
46
47 @Activate
48 public void activate() {
49 addProcessor(reactiveProcessor, PacketProcessor.ADVISOR_MAX + 1);
50 log.info("Started");
51 }
52
53 @Deactivate
54 public void deactivate() {
55 removeProcessor(reactiveProcessor);
56 log.info("Stopped");
57 }
58
59 @Override
60 public void addProcessor(PacketProcessor processor, int priority) {
alshabibd58d3522014-09-13 17:14:53 -070061 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -070062 }
63
64 @Override
65 public void removeProcessor(PacketProcessor processor) {
alshabibd58d3522014-09-13 17:14:53 -070066 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -070067 }
68
69 @Override
70 public void emit(OutboundPacket packet) {
71 final Device device = deviceService.getDevice(packet.sendThrough());
72 final PacketProvider packetProvider = getProvider(device.providerId());
73 packetProvider.emit(packet);
74 }
75
76 @Override
77 protected PacketProviderService createProviderService(
78 PacketProvider provider) {
79 return new InternalPacketProviderService(provider);
80 }
81
82 // Personalized link provider service issued to the supplied provider.
83 private class InternalPacketProviderService
84 extends AbstractProviderService<PacketProvider>
85 implements PacketProviderService {
86
87 protected InternalPacketProviderService(PacketProvider provider) {
88 super(provider);
89 }
90
91 @Override
92 public void processPacket(PacketContext context) {
alshabibd58d3522014-09-13 17:14:53 -070093 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -070094 processor.process(context);
95 }
96 }
97
98 }
alshabibae857582014-09-12 23:53:10 -070099}