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