blob: 62148c85d917366ff9e61910af8421c99d3905eb [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
57 deviceService.addListener(listener);
58
59 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
60 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
61 uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
62
63 log.info("Started with Application ID {}", appId.id());
64 }
65
66 @Deactivate
67 public void deactivate() {
68 flowRuleService.removeFlowRulesById(appId);
69
70 log.info("Stopped");
71 }
72
73
74 private void pushRules(Device device) {
75
76 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
77 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
78 int inport;
79 int outport;
80 short lambda = 10;
81
82 int switchNumber = uglyMap.get(device.id());
83 switch (switchNumber) {
84 case 1:
85 inport = 10;
86 outport = 20;
87 sbuilder.matchInport(PortNumber.portNumber(inport));
88 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
89 break;
90 case 2:
91 inport = 21;
92 outport = 11;
93 sbuilder.matchLambda(lambda).matchInport(PortNumber.portNumber(inport)); // match sigtype
94 tbuilder.setOutput(PortNumber.portNumber(outport));
95 break;
96 case 3:
97 inport = 30;
98 outport = 31;
99 sbuilder.matchLambda(lambda).matchInport(PortNumber.portNumber(inport));
100 tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
101 break;
102 default:
103 }
104 sbuilder.matchLambda((short) 25).matchInport(PortNumber.portNumber(5));
105
106 tbuilder.setOutput(PortNumber.portNumber(5));
107
108 TrafficTreatment treatement = tbuilder.build();
109 TrafficSelector selector = sbuilder.build();
110
111 FlowRule f = new DefaultFlowRule(device.id(), selector,
112 treatement, 100, appId, 600, false);
113
114 flowRuleService.applyFlowRules(f);
115
116
117
118 }
119
120 public class InternalDeviceListener implements DeviceListener {
121
122 @Override
123 public void event(DeviceEvent event) {
124 switch (event.type()) {
125 case DEVICE_ADDED:
126 pushRules(event.subject());
127 break;
128 case DEVICE_AVAILABILITY_CHANGED:
129 break;
130 case DEVICE_MASTERSHIP_CHANGED:
131 break;
132 case DEVICE_REMOVED:
133 break;
134 case DEVICE_SUSPENDED:
135 break;
136 case DEVICE_UPDATED:
137 break;
138 case PORT_ADDED:
139 break;
140 case PORT_REMOVED:
141 break;
142 case PORT_UPDATED:
143 break;
144 default:
145 break;
146
147 }
148
149 }
150
151 }
152
153
154}
155
156