blob: 9dd0634a2fe00c43e699af82814b23acc172811a [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.packet.impl;
alshabib7674db42014-09-12 23:40:46 -070017
alshabib7674db42014-09-12 23:40:46 -070018import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080024import org.onosproject.core.ApplicationId;
Thomas Vachuska6cba4952015-04-22 12:38:22 -070025import org.onosproject.core.CoreService;
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.net.Device;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080027import org.onosproject.net.device.DeviceEvent;
28import org.onosproject.net.device.DeviceListener;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.net.device.DeviceService;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080030import org.onosproject.net.flow.DefaultFlowRule;
31import org.onosproject.net.flow.DefaultTrafficTreatment;
32import org.onosproject.net.flow.FlowRule;
33import org.onosproject.net.flow.FlowRuleService;
34import org.onosproject.net.flow.TrafficSelector;
35import org.onosproject.net.flow.TrafficTreatment;
alshabib42947782015-03-31 14:59:06 -070036import org.onosproject.net.packet.DefaultPacketRequest;
Brian O'Connorabafb502014-12-02 22:26:20 -080037import org.onosproject.net.packet.OutboundPacket;
38import org.onosproject.net.packet.PacketContext;
39import org.onosproject.net.packet.PacketEvent;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080040import org.onosproject.net.packet.PacketPriority;
Brian O'Connorabafb502014-12-02 22:26:20 -080041import org.onosproject.net.packet.PacketProcessor;
42import org.onosproject.net.packet.PacketProvider;
43import org.onosproject.net.packet.PacketProviderRegistry;
44import org.onosproject.net.packet.PacketProviderService;
alshabib42947782015-03-31 14:59:06 -070045import org.onosproject.net.packet.PacketRequest;
Brian O'Connorabafb502014-12-02 22:26:20 -080046import org.onosproject.net.packet.PacketService;
47import org.onosproject.net.packet.PacketStore;
48import org.onosproject.net.packet.PacketStoreDelegate;
49import org.onosproject.net.provider.AbstractProviderRegistry;
50import org.onosproject.net.provider.AbstractProviderService;
alshabib7674db42014-09-12 23:40:46 -070051import org.slf4j.Logger;
52
alshabib089bb772015-03-03 18:26:26 -080053import java.util.Map;
alshabib089bb772015-03-03 18:26:26 -080054import java.util.concurrent.ConcurrentHashMap;
55
56import static com.google.common.base.Preconditions.checkNotNull;
57import static org.slf4j.LoggerFactory.getLogger;
58
alshabib7674db42014-09-12 23:40:46 -070059/**
60 * Provides a basic implementation of the packet SB & NB APIs.
alshabib7674db42014-09-12 23:40:46 -070061 */
62@Component(immediate = true)
63@Service
tom202175a2014-09-19 19:00:11 -070064public class PacketManager
Thomas Vachuska6cba4952015-04-22 12:38:22 -070065 extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
66 implements PacketService, PacketProviderRegistry {
alshabib7674db42014-09-12 23:40:46 -070067
68 private final Logger log = getLogger(getClass());
69
Jonathan Hart4f60f982014-10-27 08:11:17 -070070 private final PacketStoreDelegate delegate = new InternalStoreDelegate();
71
alshabib7674db42014-09-12 23:40:46 -070072 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Thomas Vachuska6cba4952015-04-22 12:38:22 -070073 private CoreService coreService;
74
75 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
alshabib7674db42014-09-12 23:40:46 -070076 private DeviceService deviceService;
77
Jonathan Hart4f60f982014-10-27 08:11:17 -070078 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080079 private FlowRuleService flowService;
80
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart4f60f982014-10-27 08:11:17 -070082 private PacketStore store;
83
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080084 private final DeviceListener deviceListener = new InternalDeviceListener();
85
Jonathan Hart4f60f982014-10-27 08:11:17 -070086 private final Map<Integer, PacketProcessor> processors = new ConcurrentHashMap<>();
alshabib7674db42014-09-12 23:40:46 -070087
Thomas Vachuska6cba4952015-04-22 12:38:22 -070088 private ApplicationId appId;
89
alshabib7674db42014-09-12 23:40:46 -070090 @Activate
91 public void activate() {
Thomas Vachuska6cba4952015-04-22 12:38:22 -070092 appId = coreService.getAppId(CoreService.CORE_APP_NAME);
Jonathan Hart4f60f982014-10-27 08:11:17 -070093 store.setDelegate(delegate);
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080094 deviceService.addListener(deviceListener);
alshabib7674db42014-09-12 23:40:46 -070095 log.info("Started");
96 }
97
98 @Deactivate
99 public void deactivate() {
Jonathan Hart4f60f982014-10-27 08:11:17 -0700100 store.unsetDelegate(delegate);
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800101 deviceService.removeListener(deviceListener);
alshabib7674db42014-09-12 23:40:46 -0700102 log.info("Stopped");
103 }
104
105 @Override
106 public void addProcessor(PacketProcessor processor, int priority) {
alshabib030111e2014-09-15 15:56:42 -0700107 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -0700108 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -0700109 }
110
111 @Override
112 public void removeProcessor(PacketProcessor processor) {
tomc370ebd2014-09-16 01:25:21 -0700113 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -0700114 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -0700115 }
116
117 @Override
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800118 public void requestPackets(TrafficSelector selector, PacketPriority priority,
119 ApplicationId appId) {
120 checkNotNull(selector, "Selector cannot be null");
121 checkNotNull(appId, "Application ID cannot be null");
122
123 PacketRequest request =
alshabib42947782015-03-31 14:59:06 -0700124 new DefaultPacketRequest(selector, priority, appId, FlowRule.Type.DEFAULT);
Saurav Dasc313c402015-02-27 10:09:47 -0800125
alshabib42947782015-03-31 14:59:06 -0700126 if (store.requestPackets(request)) {
127 pushToAllDevices(request);
128 }
Saurav Dasc313c402015-02-27 10:09:47 -0800129 }
130
131 @Override
132 public void requestPackets(TrafficSelector selector, PacketPriority priority,
133 ApplicationId appId, FlowRule.Type tableType) {
134 checkNotNull(selector, "Selector cannot be null");
135 checkNotNull(appId, "Application ID cannot be null");
136 checkNotNull(tableType, "Table Type cannot be null. For requesting packets +"
137 + "without table hints, use other methods in the packetService API");
138
139 PacketRequest request =
alshabib42947782015-03-31 14:59:06 -0700140 new DefaultPacketRequest(selector, priority, appId, tableType);
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800141
alshabib42947782015-03-31 14:59:06 -0700142 if (store.requestPackets(request)) {
alshabib089bb772015-03-03 18:26:26 -0800143 pushToAllDevices(request);
144 }
alshabib42947782015-03-31 14:59:06 -0700145
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800146 }
147
148 /**
149 * Pushes a packet request flow rule to all devices.
150 *
151 * @param request the packet request
152 */
153 private void pushToAllDevices(PacketRequest request) {
154 for (Device device : deviceService.getDevices()) {
alshabib42947782015-03-31 14:59:06 -0700155 pushRule(device, request);
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800156 }
157 }
158
159 /**
160 * Pushes flow rules to the device to request packets be sent to the
161 * controller.
162 *
Thomas Vachuska6cba4952015-04-22 12:38:22 -0700163 * @param device the device to push the rules to
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800164 * @param request the packet request
165 */
166 private void pushRule(Device device, PacketRequest request) {
Marc De Leenheer8b3e80b2015-03-06 14:27:03 -0800167 // Everything is pre-provisioned on ROADMs
168 if (device.type().equals(Device.Type.ROADM)) {
169 return;
170 }
171
Thomas Vachuska6cba4952015-04-22 12:38:22 -0700172 TrafficTreatment treatment = DefaultTrafficTreatment.builder().punt().build();
173 FlowRule flow = new DefaultFlowRule(device.id(), request.selector(), treatment,
174 request.priority().priorityValue(),
175 appId, 0, true, request.tableType());
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800176
177 flowService.applyFlowRules(flow);
178 }
179
180 @Override
alshabib7674db42014-09-12 23:40:46 -0700181 public void emit(OutboundPacket packet) {
tomc370ebd2014-09-16 01:25:21 -0700182 checkNotNull(packet, "Packet cannot be null");
Jonathan Hart4f60f982014-10-27 08:11:17 -0700183
184 store.emit(packet);
185 }
186
187 private void localEmit(OutboundPacket packet) {
alshabib7674db42014-09-12 23:40:46 -0700188 final Device device = deviceService.getDevice(packet.sendThrough());
Jonathan Hart7466d612014-11-24 17:09:53 -0800189
190 if (device == null) {
191 return;
192 }
193
alshabib7674db42014-09-12 23:40:46 -0700194 final PacketProvider packetProvider = getProvider(device.providerId());
Jonathan Hart7466d612014-11-24 17:09:53 -0800195
alshabib3d643ec2014-10-22 18:33:00 -0700196 if (packetProvider != null) {
197 packetProvider.emit(packet);
198 }
alshabib7674db42014-09-12 23:40:46 -0700199 }
200
201 @Override
tomc370ebd2014-09-16 01:25:21 -0700202 protected PacketProviderService createProviderService(PacketProvider provider) {
alshabib7674db42014-09-12 23:40:46 -0700203 return new InternalPacketProviderService(provider);
204 }
205
206 // Personalized link provider service issued to the supplied provider.
207 private class InternalPacketProviderService
Thomas Vachuska6cba4952015-04-22 12:38:22 -0700208 extends AbstractProviderService<PacketProvider>
209 implements PacketProviderService {
alshabib7674db42014-09-12 23:40:46 -0700210
211 protected InternalPacketProviderService(PacketProvider provider) {
212 super(provider);
213 }
214
215 @Override
216 public void processPacket(PacketContext context) {
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800217 // TODO filter packets sent to processors based on registrations
alshabibd58d3522014-09-13 17:14:53 -0700218 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -0700219 processor.process(context);
220 }
221 }
222
223 }
Jonathan Hart4f60f982014-10-27 08:11:17 -0700224
225 /**
226 * Internal callback from the packet store.
227 */
228 private class InternalStoreDelegate
Thomas Vachuska6cba4952015-04-22 12:38:22 -0700229 implements PacketStoreDelegate {
Jonathan Hart4f60f982014-10-27 08:11:17 -0700230 @Override
231 public void notify(PacketEvent event) {
232 localEmit(event.subject());
233 }
234 }
235
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800236 /**
237 * Internal listener for device service events.
238 */
239 private class InternalDeviceListener implements DeviceListener {
240 @Override
241 public void event(DeviceEvent event) {
242 Device device = event.subject();
243 if (event.type() == DeviceEvent.Type.DEVICE_ADDED) {
alshabib42947782015-03-31 14:59:06 -0700244 for (PacketRequest request : store.existingRequests()) {
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800245 pushRule(device, request);
246 }
247 }
248 }
249 }
250
alshabibae857582014-09-12 23:53:10 -0700251}