blob: 53c3fbcf73c71ec64a6dbc7295a5621ca54126f7 [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
alshabib7674db42014-09-12 23:40:46 -070028/**
29 * Provides a basic implementation of the packet SB & NB APIs.
alshabib7674db42014-09-12 23:40:46 -070030 */
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
alshabibd58d3522014-09-13 17:14:53 -070042 private final Map<Integer, PacketProcessor> processors = new TreeMap<>();
alshabib7674db42014-09-12 23:40:46 -070043
alshabib7674db42014-09-12 23:40:46 -070044 @Activate
45 public void activate() {
alshabib7674db42014-09-12 23:40:46 -070046 log.info("Started");
47 }
48
49 @Deactivate
50 public void deactivate() {
alshabib7674db42014-09-12 23:40:46 -070051 log.info("Stopped");
52 }
53
54 @Override
55 public void addProcessor(PacketProcessor processor, int priority) {
alshabib030111e2014-09-15 15:56:42 -070056 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070057 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -070058 }
59
60 @Override
61 public void removeProcessor(PacketProcessor processor) {
tomc370ebd2014-09-16 01:25:21 -070062 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070063 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -070064 }
65
66 @Override
67 public void emit(OutboundPacket packet) {
tomc370ebd2014-09-16 01:25:21 -070068 checkNotNull(packet, "Packet cannot be null");
alshabib7674db42014-09-12 23:40:46 -070069 final Device device = deviceService.getDevice(packet.sendThrough());
70 final PacketProvider packetProvider = getProvider(device.providerId());
71 packetProvider.emit(packet);
72 }
73
74 @Override
tomc370ebd2014-09-16 01:25:21 -070075 protected PacketProviderService createProviderService(PacketProvider provider) {
alshabib7674db42014-09-12 23:40:46 -070076 return new InternalPacketProviderService(provider);
77 }
78
79 // Personalized link provider service issued to the supplied provider.
80 private class InternalPacketProviderService
81 extends AbstractProviderService<PacketProvider>
82 implements PacketProviderService {
83
84 protected InternalPacketProviderService(PacketProvider provider) {
85 super(provider);
86 }
87
88 @Override
89 public void processPacket(PacketContext context) {
alshabibd58d3522014-09-13 17:14:53 -070090 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -070091 processor.process(context);
92 }
93 }
94
95 }
alshabibae857582014-09-12 23:53:10 -070096}