blob: f88ad5e708c2286f6425293b469c9f6e5aa5bb7d [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 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;
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;
Marc De Leenheer49087752014-10-23 13:54:09 -070042import org.slf4j.Logger;
43
44/**
45 * Sample reactive forwarding application.
46 */
weibit253c8652014-10-23 16:30:03 -070047//@Component(immediate = true)
Marc De Leenheer49087752014-10-23 13:54:09 -070048public class LambdaForwarding {
49
50 private final Logger log = getLogger(getClass());
51
52 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
53 protected FlowRuleService flowRuleService;
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected CoreService coreService;
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected DeviceService deviceService;
60
61 private ApplicationId appId;
62
63 private final InternalDeviceListener listener = new InternalDeviceListener();
64
65 private final Map<DeviceId, Integer> uglyMap = new HashMap<>();
66
67 @Activate
68 public void activate() {
Brian O'Connorabafb502014-12-02 22:26:20 -080069 appId = coreService.registerApplication("org.onosproject.fwd");
Marc De Leenheer49087752014-10-23 13:54:09 -070070
Marc De Leenheer49087752014-10-23 13:54:09 -070071 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
72 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
73 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
74
Marc De Leenheer9eb47ec2014-10-23 14:15:49 -070075 deviceService.addListener(listener);
76
77 for (Device d : deviceService.getDevices()) {
78 pushRules(d);
79 }
80
81
Marc De Leenheer49087752014-10-23 13:54:09 -070082 log.info("Started with Application ID {}", appId.id());
83 }
84
85 @Deactivate
86 public void deactivate() {
87 flowRuleService.removeFlowRulesById(appId);
88
89 log.info("Stopped");
90 }
91
92
93 private void pushRules(Device device) {
94
95 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
96 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
97 int inport;
98 int outport;
99 short lambda = 10;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700100 byte sigType = 1;
101 Integer switchNumber = uglyMap.get(device.id());
102 if (switchNumber == null) {
103 return;
104 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700105
Marc De Leenheer49087752014-10-23 13:54:09 -0700106 switch (switchNumber) {
107 case 1:
108 inport = 10;
109 outport = 20;
110 sbuilder.matchInport(PortNumber.portNumber(inport));
111 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
112 break;
113 case 2:
114 inport = 21;
115 outport = 11;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700116 sbuilder.matchLambda(lambda).
117 matchInport(PortNumber.portNumber(inport)); // match sigtype
Marc De Leenheer49087752014-10-23 13:54:09 -0700118 tbuilder.setOutput(PortNumber.portNumber(outport));
119 break;
120 case 3:
121 inport = 30;
122 outport = 31;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700123 sbuilder.matchLambda(lambda).
124 matchInport(PortNumber.portNumber(inport));
Marc De Leenheer49087752014-10-23 13:54:09 -0700125 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
126 break;
127 default:
128 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700129
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 }
141
142 public class InternalDeviceListener implements DeviceListener {
143
144 @Override
145 public void event(DeviceEvent event) {
146 switch (event.type()) {
147 case DEVICE_ADDED:
148 pushRules(event.subject());
149 break;
150 case DEVICE_AVAILABILITY_CHANGED:
151 break;
Marc De Leenheer49087752014-10-23 13:54:09 -0700152 case DEVICE_REMOVED:
153 break;
154 case DEVICE_SUSPENDED:
155 break;
156 case DEVICE_UPDATED:
157 break;
158 case PORT_ADDED:
159 break;
160 case PORT_REMOVED:
161 break;
162 case PORT_UPDATED:
163 break;
164 default:
165 break;
166
167 }
168
169 }
170
171 }
172
173
174}
175
176