blob: 26011338075855dc593404f737b9260abf6ff236 [file] [log] [blame]
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -08001/*
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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.optical.testapp;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080017
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.util.HashMap;
21import java.util.Map;
22
23import org.apache.felix.scr.annotations.Activate;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
Brian O'Connorabafb502014-12-02 22:26:20 -080027import org.onosproject.core.ApplicationId;
28import org.onosproject.core.CoreService;
29import org.onosproject.net.Device;
30import org.onosproject.net.DeviceId;
31import org.onosproject.net.PortNumber;
32import org.onosproject.net.device.DeviceEvent;
33import org.onosproject.net.device.DeviceListener;
34import org.onosproject.net.device.DeviceService;
35import org.onosproject.net.flow.DefaultFlowRule;
36import org.onosproject.net.flow.DefaultTrafficSelector;
37import org.onosproject.net.flow.DefaultTrafficTreatment;
38import org.onosproject.net.flow.FlowRule;
39import org.onosproject.net.flow.FlowRuleService;
40import org.onosproject.net.flow.TrafficSelector;
41import org.onosproject.net.flow.TrafficTreatment;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080042import org.onlab.packet.Ethernet;
Michele Santuari4b6019e2014-12-19 11:31:45 +010043import org.onlab.packet.MplsLabel;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080044import org.slf4j.Logger;
45
46/**
47 * Sample reactive forwarding application.
48 */
49//@Component(immediate = true)
50public class MPLSForwarding {
51
52 private final Logger log = getLogger(getClass());
53
54 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
55 protected FlowRuleService flowRuleService;
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected CoreService coreService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected DeviceService deviceService;
62
63 private ApplicationId appId;
64
65 private final InternalDeviceListener listener = new InternalDeviceListener();
66
67 private final Map<DeviceId, Integer> uglyMap = new HashMap<>();
68
69 @Activate
70 public void activate() {
Brian O'Connorabafb502014-12-02 22:26:20 -080071 appId = coreService.registerApplication("org.onosproject.testapp" +
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080072 ".mplsfwd");
73
74 uglyMap.put(DeviceId.deviceId("of:0000000000000001"), 1);
75 uglyMap.put(DeviceId.deviceId("of:0000000000000002"), 2);
76 uglyMap.put(DeviceId.deviceId("of:0000000000000003"), 3);
77
78 deviceService.addListener(listener);
79
80 for (Device d : deviceService.getDevices()) {
81 pushRules(d);
82 }
83
84
85 log.info("Started with Application ID {}", appId.id());
86 }
87
88 @Deactivate
89 public void deactivate() {
90 flowRuleService.removeFlowRulesById(appId);
91
92 log.info("Stopped");
93 }
94
95
96 private void pushRules(Device device) {
97
98 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
99 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
100 int inport = 1;
101 int outport = 2;
Michele Santuari4b6019e2014-12-19 11:31:45 +0100102 MplsLabel mplsLabel = MplsLabel.mplsLabel(101);
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800103 Integer switchNumber = uglyMap.get(device.id());
104 if (switchNumber == null) {
105 return;
106 }
107
108 switch (switchNumber) {
109 case 1:
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800110 sbuilder.matchInPort(PortNumber.portNumber(inport));
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800111 tbuilder.setOutput(PortNumber.portNumber(outport))
112 .pushMpls()
113 .setMpls(mplsLabel);
114 break;
115 case 2:
116 sbuilder.matchMplsLabel(mplsLabel)
117 .matchEthType(Ethernet.MPLS_UNICAST)
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800118 .matchInPort(PortNumber.portNumber(inport));
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800119 tbuilder.setOutput(PortNumber.portNumber(outport));
120 break;
121 case 3:
122 sbuilder.matchMplsLabel(mplsLabel)
123 .matchEthType(Ethernet.MPLS_UNICAST)
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800124 .matchInPort(PortNumber.portNumber(inport));
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800125 tbuilder.popMpls().setOutput(PortNumber.portNumber(outport));
126 break;
127 default:
128 }
129
130 TrafficTreatment treatement = tbuilder.build();
131 TrafficSelector selector = sbuilder.build();
132
133 FlowRule f = new DefaultFlowRule(device.id(), selector,
134 treatement, 100, appId, 600, false);
135
136 flowRuleService.applyFlowRules(f);
137 }
138
139
140 public class InternalDeviceListener implements DeviceListener {
141
142 @Override
143 public void event(DeviceEvent event) {
144 switch (event.type()) {
145 case DEVICE_ADDED:
146 pushRules(event.subject());
147 break;
148 case DEVICE_AVAILABILITY_CHANGED:
149 break;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800150 case DEVICE_REMOVED:
151 break;
152 case DEVICE_SUSPENDED:
153 break;
154 case DEVICE_UPDATED:
155 break;
156 case PORT_ADDED:
157 break;
158 case PORT_REMOVED:
159 break;
160 case PORT_UPDATED:
161 break;
162 default:
163 break;
164
165 }
166
167 }
168
169 }
170
171
172}
173
174