blob: b90d5612f058697f34fff679f363de73f03d9fa6 [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;
22import java.util.TreeMap;
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;
34import org.onlab.onos.net.packet.PacketProcessor;
35import org.onlab.onos.net.packet.PacketProvider;
36import org.onlab.onos.net.packet.PacketProviderRegistry;
37import org.onlab.onos.net.packet.PacketProviderService;
38import org.onlab.onos.net.packet.PacketService;
39import org.onlab.onos.net.provider.AbstractProviderRegistry;
40import org.onlab.onos.net.provider.AbstractProviderService;
41import org.slf4j.Logger;
42
alshabib7674db42014-09-12 23:40:46 -070043/**
44 * Provides a basic implementation of the packet SB & NB APIs.
alshabib7674db42014-09-12 23:40:46 -070045 */
46@Component(immediate = true)
47@Service
tom202175a2014-09-19 19:00:11 -070048public class PacketManager
alshabib7674db42014-09-12 23:40:46 -070049extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
50implements PacketService, PacketProviderRegistry {
51
52 private final Logger log = getLogger(getClass());
53
54 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
55 private DeviceService deviceService;
56
alshabibd58d3522014-09-13 17:14:53 -070057 private final Map<Integer, PacketProcessor> processors = new TreeMap<>();
alshabib7674db42014-09-12 23:40:46 -070058
alshabib7674db42014-09-12 23:40:46 -070059 @Activate
60 public void activate() {
alshabib7674db42014-09-12 23:40:46 -070061 log.info("Started");
62 }
63
64 @Deactivate
65 public void deactivate() {
alshabib7674db42014-09-12 23:40:46 -070066 log.info("Stopped");
67 }
68
69 @Override
70 public void addProcessor(PacketProcessor processor, int priority) {
alshabib030111e2014-09-15 15:56:42 -070071 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070072 processors.put(priority, processor);
alshabib7674db42014-09-12 23:40:46 -070073 }
74
75 @Override
76 public void removeProcessor(PacketProcessor processor) {
tomc370ebd2014-09-16 01:25:21 -070077 checkNotNull(processor, "Processor cannot be null");
alshabibd58d3522014-09-13 17:14:53 -070078 processors.values().remove(processor);
alshabib7674db42014-09-12 23:40:46 -070079 }
80
81 @Override
82 public void emit(OutboundPacket packet) {
tomc370ebd2014-09-16 01:25:21 -070083 checkNotNull(packet, "Packet cannot be null");
alshabib7674db42014-09-12 23:40:46 -070084 final Device device = deviceService.getDevice(packet.sendThrough());
85 final PacketProvider packetProvider = getProvider(device.providerId());
alshabib3d643ec2014-10-22 18:33:00 -070086 if (packetProvider != null) {
87 packetProvider.emit(packet);
88 }
alshabib7674db42014-09-12 23:40:46 -070089 }
90
91 @Override
tomc370ebd2014-09-16 01:25:21 -070092 protected PacketProviderService createProviderService(PacketProvider provider) {
alshabib7674db42014-09-12 23:40:46 -070093 return new InternalPacketProviderService(provider);
94 }
95
96 // Personalized link provider service issued to the supplied provider.
97 private class InternalPacketProviderService
98 extends AbstractProviderService<PacketProvider>
99 implements PacketProviderService {
100
101 protected InternalPacketProviderService(PacketProvider provider) {
102 super(provider);
103 }
104
105 @Override
106 public void processPacket(PacketContext context) {
alshabibd58d3522014-09-13 17:14:53 -0700107 for (PacketProcessor processor : processors.values()) {
alshabib7674db42014-09-12 23:40:46 -0700108 processor.process(context);
109 }
110 }
111
112 }
alshabibae857582014-09-12 23:53:10 -0700113}