blob: f35b8be413228d0fadcacc612ab72d61131f44e3 [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;
Marc De Leenheer49087752014-10-23 13:54:09 -070044import org.slf4j.Logger;
45
46/**
47 * Sample reactive forwarding application.
48 */
weibit253c8652014-10-23 16:30:03 -070049//@Component(immediate = true)
Marc De Leenheer49087752014-10-23 13:54:09 -070050public class LambdaForwarding {
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.fwd");
Marc De Leenheer49087752014-10-23 13:54:09 -070072
Marc De Leenheer49087752014-10-23 13:54:09 -070073 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
74 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
75 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
76
Marc De Leenheer9eb47ec2014-10-23 14:15:49 -070077 deviceService.addListener(listener);
78
79 for (Device d : deviceService.getDevices()) {
80 pushRules(d);
81 }
82
83
Marc De Leenheer49087752014-10-23 13:54:09 -070084 log.info("Started with Application ID {}", appId.id());
85 }
86
87 @Deactivate
88 public void deactivate() {
89 flowRuleService.removeFlowRulesById(appId);
90
91 log.info("Stopped");
92 }
93
94
95 private void pushRules(Device device) {
96
97 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
98 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
99 int inport;
100 int outport;
101 short lambda = 10;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700102 byte sigType = 1;
103 Integer switchNumber = uglyMap.get(device.id());
104 if (switchNumber == null) {
105 return;
106 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700107
Marc De Leenheer49087752014-10-23 13:54:09 -0700108 switch (switchNumber) {
109 case 1:
110 inport = 10;
111 outport = 20;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800112 sbuilder.matchInPort(PortNumber.portNumber(inport));
Marc De Leenheer49087752014-10-23 13:54:09 -0700113 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
114 break;
115 case 2:
116 inport = 21;
117 outport = 11;
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700118 sbuilder.add(Criteria.matchLambda(new IndexedLambda(lambda))).
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800119 matchInPort(PortNumber.portNumber(inport)); // match sigtype
Marc De Leenheer49087752014-10-23 13:54:09 -0700120 tbuilder.setOutput(PortNumber.portNumber(outport));
121 break;
122 case 3:
123 inport = 30;
124 outport = 31;
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700125 sbuilder.add(Criteria.matchLambda(new IndexedLambda(lambda))).
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800126 matchInPort(PortNumber.portNumber(inport));
Marc De Leenheer49087752014-10-23 13:54:09 -0700127 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
128 break;
129 default:
130 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700131
Ray Milkeyd13a37b2015-06-12 11:55:17 -0700132 TrafficTreatment treatment = tbuilder.build();
Marc De Leenheer49087752014-10-23 13:54:09 -0700133 TrafficSelector selector = sbuilder.build();
134
Ray Milkeyd13a37b2015-06-12 11:55:17 -0700135 FlowRule f = DefaultFlowRule.builder()
136 .forDevice(device.id())
137 .withSelector(selector)
138 .withTreatment(treatment)
139 .withPriority(100)
140 .fromApp(appId)
141 .makeTemporary(600)
142 .build();
Marc De Leenheer49087752014-10-23 13:54:09 -0700143
144 flowRuleService.applyFlowRules(f);
145
146
147
148 }
149
150 public class InternalDeviceListener implements DeviceListener {
151
152 @Override
153 public void event(DeviceEvent event) {
154 switch (event.type()) {
155 case DEVICE_ADDED:
156 pushRules(event.subject());
157 break;
158 case DEVICE_AVAILABILITY_CHANGED:
159 break;
Marc De Leenheer49087752014-10-23 13:54:09 -0700160 case DEVICE_REMOVED:
161 break;
162 case DEVICE_SUSPENDED:
163 break;
164 case DEVICE_UPDATED:
165 break;
166 case PORT_ADDED:
167 break;
168 case PORT_REMOVED:
169 break;
170 case PORT_UPDATED:
171 break;
172 default:
173 break;
174
175 }
176
177 }
178
179 }
180
181
182}
183
184