blob: b6546cf169d2ee0a46f322bab2bc6b260cc27918 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
tombe988312014-09-19 18:38:47 -070016package org.onlab.onos.net.packet.impl;
alshabib7674db42014-09-12 23:40:46 -070017
alshabib030111e2014-09-15 15:56:42 -070018import static com.google.common.base.Preconditions.checkNotNull;
alshabib7674db42014-09-12 23:40:46 -070019import static org.slf4j.LoggerFactory.getLogger;
20
alshabibd58d3522014-09-13 17:14:53 -070021import java.util.Map;
Jonathan Hart4f60f982014-10-27 08:11:17 -070022import java.util.concurrent.ConcurrentHashMap;
alshabib7674db42014-09-12 23:40:46 -070023
24import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
30import org.onlab.onos.net.Device;
31import org.onlab.onos.net.device.DeviceService;
32import org.onlab.onos.net.packet.OutboundPacket;
33import org.onlab.onos.net.packet.PacketContext;
Jonathan Hart4f60f982014-10-27 08:11:17 -070034import org.onlab.onos.net.packet.PacketEvent;
alshabib7674db42014-09-12 23:40:46 -070035import org.onlab.onos.net.packet.PacketProcessor;
36import org.onlab.onos.net.packet.PacketProvider;
37import org.onlab.onos.net.packet.PacketProviderRegistry;
38import org.onlab.onos.net.packet.PacketProviderService;
39import org.onlab.onos.net.packet.PacketService;
Jonathan Hart4f60f982014-10-27 08:11:17 -070040import org.onlab.onos.net.packet.PacketStore;
41import org.onlab.onos.net.packet.PacketStoreDelegate;
alshabib7674db42014-09-12 23:40:46 -070042import org.onlab.onos.net.provider.AbstractProviderRegistry;
43import org.onlab.onos.net.provider.AbstractProviderService;
44import org.slf4j.Logger;
45
alshabib7674db42014-09-12 23:40:46 -070046/**
47 * Provides a basic implementation of the packet SB & NB APIs.
alshabib7674db42014-09-12 23:40:46 -070048 */
49@Component(immediate = true)
50@Service
tom202175a2014-09-19 19:00:11 -070051public class PacketManager
alshabib7674db42014-09-12 23:40:46 -070052extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
53implements PacketService, PacketProviderRegistry {
54
55 private final Logger log = getLogger(getClass());
56
Jonathan Hart4f60f982014-10-27 08:11:17 -070057 private final PacketStoreDelegate delegate = new InternalStoreDelegate();
58
alshabib7674db42014-09-12 23:40:46 -070059 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
60 private DeviceService deviceService;
61
Jonathan Hart4f60f982014-10-27 08:11:17 -070062 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 private PacketStore store;
64
65 private final Map<Integer, PacketProcessor> processors = new ConcurrentHashMap<>();
alshabib7674db42014-09-12 23:40:46 -070066
alshabib7674db42014-09-12 23:40:46 -070067 @Activate
68 public void activate() {
Jonathan Hart4f60f982014-10-27 08:11:17 -070069 store.setDelegate(delegate);
alshabib7674db42014-09-12 23:40:46 -070070 log.info("Started");
71 }
72
73 @Deactivate
74 public void deactivate() {
Jonathan Hart4f60f982014-10-27 08:11:17 -070075 store.unsetDelegate(delegate);
alshabib7674db42014-09-12 23:40:46 -070076 log.info("Stopped");
77 }
78
79 @Override
80 public void addProcessor(PacketProcessor processor, int priority) {
alshabib030111e2014-09-15 15:56:42 -070081 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070082 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -070083 }
84
85 @Override
86 public void removeProcessor(PacketProcessor processor) {
tomc370ebd2014-09-16 01:25:21 -070087 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070088 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -070089 }
90
91 @Override
92 public void emit(OutboundPacket packet) {
tomc370ebd2014-09-16 01:25:21 -070093 checkNotNull(packet, "Packet cannot be null");
Jonathan Hart4f60f982014-10-27 08:11:17 -070094
95 store.emit(packet);
96 }
97
98 private void localEmit(OutboundPacket packet) {
alshabib7674db42014-09-12 23:40:46 -070099 final Device device = deviceService.getDevice(packet.sendThrough());
Jonathan Hart7466d612014-11-24 17:09:53 -0800100
101 if (device == null) {
102 return;
103 }
104
alshabib7674db42014-09-12 23:40:46 -0700105 final PacketProvider packetProvider = getProvider(device.providerId());
Jonathan Hart7466d612014-11-24 17:09:53 -0800106
alshabib3d643ec2014-10-22 18:33:00 -0700107 if (packetProvider != null) {
108 packetProvider.emit(packet);
109 }
alshabib7674db42014-09-12 23:40:46 -0700110 }
111
112 @Override
tomc370ebd2014-09-16 01:25:21 -0700113 protected PacketProviderService createProviderService(PacketProvider provider) {
alshabib7674db42014-09-12 23:40:46 -0700114 return new InternalPacketProviderService(provider);
115 }
116
117 // Personalized link provider service issued to the supplied provider.
118 private class InternalPacketProviderService
119 extends AbstractProviderService<PacketProvider>
120 implements PacketProviderService {
121
122 protected InternalPacketProviderService(PacketProvider provider) {
123 super(provider);
124 }
125
126 @Override
127 public void processPacket(PacketContext context) {
alshabibd58d3522014-09-13 17:14:53 -0700128 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -0700129 processor.process(context);
130 }
131 }
132
133 }
Jonathan Hart4f60f982014-10-27 08:11:17 -0700134
135 /**
136 * Internal callback from the packet store.
137 */
138 private class InternalStoreDelegate
139 implements PacketStoreDelegate {
140 @Override
141 public void notify(PacketEvent event) {
142 localEmit(event.subject());
143 }
144 }
145
alshabibae857582014-09-12 23:53:10 -0700146}