blob: 20138c87043ad7f285c7e860234511b4e4ef67cd [file] [log] [blame]
Marc De Leenheer49087752014-10-23 13:54:09 -07001package org.onlab.onos.optical.testapp;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.HashMap;
6import java.util.Map;
7
8import org.apache.felix.scr.annotations.Activate;
Marc De Leenheer49087752014-10-23 13:54:09 -07009import org.apache.felix.scr.annotations.Deactivate;
10import org.apache.felix.scr.annotations.Reference;
11import org.apache.felix.scr.annotations.ReferenceCardinality;
12import org.onlab.onos.ApplicationId;
13import org.onlab.onos.CoreService;
14import org.onlab.onos.net.Device;
15import org.onlab.onos.net.DeviceId;
16import org.onlab.onos.net.PortNumber;
17import org.onlab.onos.net.device.DeviceEvent;
18import org.onlab.onos.net.device.DeviceListener;
19import org.onlab.onos.net.device.DeviceService;
20import org.onlab.onos.net.flow.DefaultFlowRule;
21import org.onlab.onos.net.flow.DefaultTrafficSelector;
22import org.onlab.onos.net.flow.DefaultTrafficTreatment;
23import org.onlab.onos.net.flow.FlowRule;
24import org.onlab.onos.net.flow.FlowRuleService;
25import org.onlab.onos.net.flow.TrafficSelector;
26import org.onlab.onos.net.flow.TrafficTreatment;
27import org.slf4j.Logger;
28
29/**
30 * Sample reactive forwarding application.
31 */
weibit253c8652014-10-23 16:30:03 -070032//@Component(immediate = true)
Marc De Leenheer49087752014-10-23 13:54:09 -070033public class LambdaForwarding {
34
35 private final Logger log = getLogger(getClass());
36
37 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
38 protected FlowRuleService flowRuleService;
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
41 protected CoreService coreService;
42
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
44 protected DeviceService deviceService;
45
46 private ApplicationId appId;
47
48 private final InternalDeviceListener listener = new InternalDeviceListener();
49
50 private final Map<DeviceId, Integer> uglyMap = new HashMap<>();
51
52 @Activate
53 public void activate() {
54 appId = coreService.registerApplication("org.onlab.onos.fwd");
55
Marc De Leenheer49087752014-10-23 13:54:09 -070056 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
57 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
58 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
59
Marc De Leenheer9eb47ec2014-10-23 14:15:49 -070060 deviceService.addListener(listener);
61
62 for (Device d : deviceService.getDevices()) {
63 pushRules(d);
64 }
65
66
Marc De Leenheer49087752014-10-23 13:54:09 -070067 log.info("Started with Application ID {}", appId.id());
68 }
69
70 @Deactivate
71 public void deactivate() {
72 flowRuleService.removeFlowRulesById(appId);
73
74 log.info("Stopped");
75 }
76
77
78 private void pushRules(Device device) {
79
80 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
81 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
82 int inport;
83 int outport;
84 short lambda = 10;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -070085 byte sigType = 1;
86 Integer switchNumber = uglyMap.get(device.id());
87 if (switchNumber == null) {
88 return;
89 }
Marc De Leenheer49087752014-10-23 13:54:09 -070090
Marc De Leenheer49087752014-10-23 13:54:09 -070091 switch (switchNumber) {
92 case 1:
93 inport = 10;
94 outport = 20;
95 sbuilder.matchInport(PortNumber.portNumber(inport));
96 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
97 break;
98 case 2:
99 inport = 21;
100 outport = 11;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700101 sbuilder.matchLambda(lambda).
102 matchInport(PortNumber.portNumber(inport)); // match sigtype
Marc De Leenheer49087752014-10-23 13:54:09 -0700103 tbuilder.setOutput(PortNumber.portNumber(outport));
104 break;
105 case 3:
106 inport = 30;
107 outport = 31;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700108 sbuilder.matchLambda(lambda).
109 matchInport(PortNumber.portNumber(inport));
Marc De Leenheer49087752014-10-23 13:54:09 -0700110 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
111 break;
112 default:
113 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700114
115 TrafficTreatment treatement = tbuilder.build();
116 TrafficSelector selector = sbuilder.build();
117
118 FlowRule f = new DefaultFlowRule(device.id(), selector,
119 treatement, 100, appId, 600, false);
120
121 flowRuleService.applyFlowRules(f);
122
123
124
125 }
126
127 public class InternalDeviceListener implements DeviceListener {
128
129 @Override
130 public void event(DeviceEvent event) {
131 switch (event.type()) {
132 case DEVICE_ADDED:
133 pushRules(event.subject());
134 break;
135 case DEVICE_AVAILABILITY_CHANGED:
136 break;
137 case DEVICE_MASTERSHIP_CHANGED:
138 break;
139 case DEVICE_REMOVED:
140 break;
141 case DEVICE_SUSPENDED:
142 break;
143 case DEVICE_UPDATED:
144 break;
145 case PORT_ADDED:
146 break;
147 case PORT_REMOVED:
148 break;
149 case PORT_UPDATED:
150 break;
151 default:
152 break;
153
154 }
155
156 }
157
158 }
159
160
161}
162
163