blob: 49d21e0021143d1bc5617a7e8364dc22832adc0e [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.packet.impl;
alshabib7674db42014-09-12 23:40:46 -07002
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
tom202175a2014-09-19 19:00:11 -070033public class PacketManager
alshabib7674db42014-09-12 23:40:46 -070034extends 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());
alshabib3d643ec2014-10-22 18:33:00 -070071 if (packetProvider != null) {
72 packetProvider.emit(packet);
73 }
alshabib7674db42014-09-12 23:40:46 -070074 }
75
76 @Override
tomc370ebd2014-09-16 01:25:21 -070077 protected PacketProviderService createProviderService(PacketProvider provider) {
alshabib7674db42014-09-12 23:40:46 -070078 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}