blob: cf324f475c02722b48c70d6d35fa2202eead6f6f [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
5import java.util.ArrayList;
6
7import 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;
12import org.apache.felix.scr.annotations.Service;
13import org.onlab.onos.net.Device;
14import org.onlab.onos.net.device.DeviceService;
15import org.onlab.onos.net.packet.OutboundPacket;
16import org.onlab.onos.net.packet.PacketContext;
17import org.onlab.onos.net.packet.PacketProcessor;
18import org.onlab.onos.net.packet.PacketProvider;
19import org.onlab.onos.net.packet.PacketProviderRegistry;
20import org.onlab.onos.net.packet.PacketProviderService;
21import org.onlab.onos.net.packet.PacketService;
22import org.onlab.onos.net.provider.AbstractProviderRegistry;
23import org.onlab.onos.net.provider.AbstractProviderService;
24import org.slf4j.Logger;
25
26
27/**
28 * Provides a basic implementation of the packet SB & NB APIs.
29 *
30 */
31@Component(immediate = true)
32@Service
33public class SimplePacketManager
34extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
35implements PacketService, PacketProviderRegistry {
36
37 private final Logger log = getLogger(getClass());
38
39 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
40 private DeviceService deviceService;
41
42 private final ArrayList<PacketProcessor> processors = new ArrayList<>();
43
44 private final PacketProcessor reactiveProcessor = new ReactivePacketProcessor();
45
46 @Activate
47 public void activate() {
48 addProcessor(reactiveProcessor, PacketProcessor.ADVISOR_MAX + 1);
49 log.info("Started");
50 }
51
52 @Deactivate
53 public void deactivate() {
54 removeProcessor(reactiveProcessor);
55 log.info("Stopped");
56 }
57
58 @Override
59 public void addProcessor(PacketProcessor processor, int priority) {
60 processors.add(priority, processor);
61 }
62
63 @Override
64 public void removeProcessor(PacketProcessor processor) {
65 processors.remove(processor);
66 }
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) {
92 for (PacketProcessor processor : processors) {
93 processor.process(context);
94 }
95 }
96
97 }
98}