blob: 05d6f12be0ca0efc3e054014472637a87d8e5ac7 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.optical.testapp;
Marc De Leenheer49087752014-10-23 13:54:09 -070017
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.util.HashMap;
21import java.util.Map;
22
23import org.apache.felix.scr.annotations.Activate;
Marc De Leenheer49087752014-10-23 13:54:09 -070024import 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;
Sho SHIMIZU260439d2015-06-30 16:35:34 -070031import org.onosproject.net.IndexedLambda;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.PortNumber;
33import org.onosproject.net.device.DeviceEvent;
34import org.onosproject.net.device.DeviceListener;
35import org.onosproject.net.device.DeviceService;
36import org.onosproject.net.flow.DefaultFlowRule;
37import org.onosproject.net.flow.DefaultTrafficSelector;
38import org.onosproject.net.flow.DefaultTrafficTreatment;
39import org.onosproject.net.flow.FlowRule;
40import org.onosproject.net.flow.FlowRuleService;
41import org.onosproject.net.flow.TrafficSelector;
42import org.onosproject.net.flow.TrafficTreatment;
Sho SHIMIZU260439d2015-06-30 16:35:34 -070043import org.onosproject.net.flow.criteria.Criteria;
Sho SHIMIZU9553bb82015-06-30 16:02:45 -070044import org.onosproject.net.flow.instructions.Instructions;
Marc De Leenheer49087752014-10-23 13:54:09 -070045import org.slf4j.Logger;
46
47/**
48 * Sample reactive forwarding application.
49 */
weibit253c8652014-10-23 16:30:03 -070050//@Component(immediate = true)
Marc De Leenheer49087752014-10-23 13:54:09 -070051public class LambdaForwarding {
52
53 private final Logger log = getLogger(getClass());
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected FlowRuleService flowRuleService;
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected CoreService coreService;
60
61 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
62 protected DeviceService deviceService;
63
64 private ApplicationId appId;
65
66 private final InternalDeviceListener listener = new InternalDeviceListener();
67
68 private final Map<DeviceId, Integer> uglyMap = new HashMap<>();
69
70 @Activate
71 public void activate() {
Brian O'Connorabafb502014-12-02 22:26:20 -080072 appId = coreService.registerApplication("org.onosproject.fwd");
Marc De Leenheer49087752014-10-23 13:54:09 -070073
Marc De Leenheer49087752014-10-23 13:54:09 -070074 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
75 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
76 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
77
Marc De Leenheer9eb47ec2014-10-23 14:15:49 -070078 deviceService.addListener(listener);
79
80 for (Device d : deviceService.getDevices()) {
81 pushRules(d);
82 }
83
84
Marc De Leenheer49087752014-10-23 13:54:09 -070085 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;
101 int outport;
102 short lambda = 10;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700103 byte sigType = 1;
104 Integer switchNumber = uglyMap.get(device.id());
105 if (switchNumber == null) {
106 return;
107 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700108
Marc De Leenheer49087752014-10-23 13:54:09 -0700109 switch (switchNumber) {
110 case 1:
111 inport = 10;
112 outport = 20;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800113 sbuilder.matchInPort(PortNumber.portNumber(inport));
Sho SHIMIZU9553bb82015-06-30 16:02:45 -0700114 tbuilder.setOutput(PortNumber.portNumber(outport))
115 .add(Instructions.modL0Lambda(new IndexedLambda(lambda)));
Marc De Leenheer49087752014-10-23 13:54:09 -0700116 break;
117 case 2:
118 inport = 21;
119 outport = 11;
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700120 sbuilder.add(Criteria.matchLambda(new IndexedLambda(lambda))).
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800121 matchInPort(PortNumber.portNumber(inport)); // match sigtype
Marc De Leenheer49087752014-10-23 13:54:09 -0700122 tbuilder.setOutput(PortNumber.portNumber(outport));
123 break;
124 case 3:
125 inport = 30;
126 outport = 31;
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700127 sbuilder.add(Criteria.matchLambda(new IndexedLambda(lambda))).
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800128 matchInPort(PortNumber.portNumber(inport));
Sho SHIMIZU9553bb82015-06-30 16:02:45 -0700129 tbuilder.setOutput(PortNumber.portNumber(outport))
130 .add(Instructions.modL0Lambda(new IndexedLambda(lambda)));
Marc De Leenheer49087752014-10-23 13:54:09 -0700131 break;
132 default:
133 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700134
Ray Milkeyd13a37b2015-06-12 11:55:17 -0700135 TrafficTreatment treatment = tbuilder.build();
Marc De Leenheer49087752014-10-23 13:54:09 -0700136 TrafficSelector selector = sbuilder.build();
137
Ray Milkeyd13a37b2015-06-12 11:55:17 -0700138 FlowRule f = DefaultFlowRule.builder()
139 .forDevice(device.id())
140 .withSelector(selector)
141 .withTreatment(treatment)
142 .withPriority(100)
143 .fromApp(appId)
144 .makeTemporary(600)
145 .build();
Marc De Leenheer49087752014-10-23 13:54:09 -0700146
147 flowRuleService.applyFlowRules(f);
148
149
150
151 }
152
153 public class InternalDeviceListener implements DeviceListener {
154
155 @Override
156 public void event(DeviceEvent event) {
157 switch (event.type()) {
158 case DEVICE_ADDED:
159 pushRules(event.subject());
160 break;
161 case DEVICE_AVAILABILITY_CHANGED:
162 break;
Marc De Leenheer49087752014-10-23 13:54:09 -0700163 case DEVICE_REMOVED:
164 break;
165 case DEVICE_SUSPENDED:
166 break;
167 case DEVICE_UPDATED:
168 break;
169 case PORT_ADDED:
170 break;
171 case PORT_REMOVED:
172 break;
173 case PORT_UPDATED:
174 break;
175 default:
176 break;
177
178 }
179
180 }
181
182 }
183
184
185}
186
187