Committed by
Gerrit Code Review
Minor bug fixes to bgprouter and ofdpadriver
Cleaned up some handshakers that are not needed Change-Id: I87fc202c39a9b4646d61321cdc488059f39c120b
Showing
6 changed files
with
14 additions
and
1299 deletions
... | @@ -358,7 +358,8 @@ public class BgpRouter { | ... | @@ -358,7 +358,8 @@ public class BgpRouter { |
358 | .addCondition(Criteria.matchVlanId(intf.vlan())); | 358 | .addCondition(Criteria.matchVlanId(intf.vlan())); |
359 | intf.ipAddresses().stream() | 359 | intf.ipAddresses().stream() |
360 | .forEach(ipaddr -> fob.addCondition( | 360 | .forEach(ipaddr -> fob.addCondition( |
361 | - Criteria.matchIPDst(ipaddr.subnetAddress()))); | 361 | + Criteria.matchIPDst( |
362 | + IpPrefix.valueOf(ipaddr.ipAddress(), 32)))); | ||
362 | fob.permit().fromApp(appId); | 363 | fob.permit().fromApp(appId); |
363 | flowObjectiveService.filter( | 364 | flowObjectiveService.filter( |
364 | deviceId, | 365 | deviceId, |
... | @@ -366,7 +367,7 @@ public class BgpRouter { | ... | @@ -366,7 +367,7 @@ public class BgpRouter { |
366 | @Override | 367 | @Override |
367 | public void onSuccess(Objective objective) { | 368 | public void onSuccess(Objective objective) { |
368 | log.info("Successfully installed interface based " | 369 | log.info("Successfully installed interface based " |
369 | - + "filtering objcetives for intf {}", intf); | 370 | + + "filtering objectives for intf {}", intf); |
370 | } | 371 | } |
371 | 372 | ||
372 | @Override | 373 | @Override | ... | ... |
1 | -/* | ||
2 | - * Copyright 2015 Open Networking Laboratory | ||
3 | - * | ||
4 | - * 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 | ||
7 | - * | ||
8 | - * 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. | ||
15 | - */ | ||
16 | -package org.onosproject.driver.handshaker; | ||
17 | - | ||
18 | -public class OFOVSSwitchCorsaTTP extends OFCorsaSwitchDriver { | ||
19 | - | ||
20 | -} |
1 | -/* | ||
2 | - * Copyright 2015 Open Networking Laboratory | ||
3 | - * | ||
4 | - * 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 | ||
7 | - * | ||
8 | - * 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. | ||
15 | - */ | ||
16 | -package org.onosproject.driver.handshaker; | ||
17 | - | ||
18 | -import org.onosproject.openflow.controller.RoleState; | ||
19 | -import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; | ||
20 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted; | ||
21 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted; | ||
22 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted; | ||
23 | -import org.projectfloodlight.openflow.protocol.OFAsyncGetReply; | ||
24 | -import org.projectfloodlight.openflow.protocol.OFBarrierRequest; | ||
25 | -import org.projectfloodlight.openflow.protocol.OFBucket; | ||
26 | -import org.projectfloodlight.openflow.protocol.OFFactory; | ||
27 | -import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply; | ||
28 | -import org.projectfloodlight.openflow.protocol.OFGroupFeaturesStatsReply; | ||
29 | -import org.projectfloodlight.openflow.protocol.OFGroupType; | ||
30 | -import org.projectfloodlight.openflow.protocol.OFMatchV3; | ||
31 | -import org.projectfloodlight.openflow.protocol.OFMessage; | ||
32 | -import org.projectfloodlight.openflow.protocol.OFOxmList; | ||
33 | -import org.projectfloodlight.openflow.protocol.OFPortDesc; | ||
34 | -import org.projectfloodlight.openflow.protocol.OFStatsReply; | ||
35 | -import org.projectfloodlight.openflow.protocol.action.OFAction; | ||
36 | -import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; | ||
37 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthDst; | ||
38 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthSrc; | ||
39 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthType; | ||
40 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmInPort; | ||
41 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmIpv4DstMasked; | ||
42 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmMetadataMasked; | ||
43 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmMplsLabel; | ||
44 | -import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVid; | ||
45 | -import org.projectfloodlight.openflow.types.EthType; | ||
46 | -import org.projectfloodlight.openflow.types.IPv4Address; | ||
47 | -import org.projectfloodlight.openflow.types.MacAddress; | ||
48 | -import org.projectfloodlight.openflow.types.OFBufferId; | ||
49 | -import org.projectfloodlight.openflow.types.OFGroup; | ||
50 | -import org.projectfloodlight.openflow.types.OFMetadata; | ||
51 | -import org.projectfloodlight.openflow.types.OFPort; | ||
52 | -import org.projectfloodlight.openflow.types.OFVlanVidMatch; | ||
53 | -import org.projectfloodlight.openflow.types.TableId; | ||
54 | -import org.projectfloodlight.openflow.types.U32; | ||
55 | -import org.projectfloodlight.openflow.types.U64; | ||
56 | -import org.projectfloodlight.openflow.util.HexString; | ||
57 | - | ||
58 | -import java.io.IOException; | ||
59 | -import java.util.ArrayList; | ||
60 | -import java.util.Collections; | ||
61 | -import java.util.List; | ||
62 | -import java.util.Map; | ||
63 | -import java.util.concurrent.ConcurrentHashMap; | ||
64 | -import java.util.concurrent.atomic.AtomicBoolean; | ||
65 | - | ||
66 | -/** | ||
67 | - * OFDescriptionStatistics Vendor (Manufacturer Desc.): Stanford University, | ||
68 | - * Ericsson Research and CPqD Research. Make (Hardware Desc.) : OpenFlow 1.3 | ||
69 | - * Reference Userspace Switch Model (Datapath Desc.) : None Software : Serial : | ||
70 | - * None | ||
71 | - */ | ||
72 | -public class OFSwitchImplCPqD13 extends AbstractOpenFlowSwitch { | ||
73 | - | ||
74 | - private static final int VLAN_ID_OFFSET = 16; | ||
75 | - private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false); | ||
76 | - private OFFactory factory; | ||
77 | - private static final int OFPCML_NO_BUFFER = 0xffff; | ||
78 | - // Configuration of asynch messages to controller. We need different | ||
79 | - // asynch messages depending on role-equal or role-master. | ||
80 | - // We don't want to get anything if we are slave. | ||
81 | - private static final long SET_FLOW_REMOVED_MASK_MASTER = 0xf; | ||
82 | - private static final long SET_PACKET_IN_MASK_MASTER = 0x7; | ||
83 | - private static final long SET_PORT_STATUS_MASK_MASTER = 0x7; | ||
84 | - private static final long SET_FLOW_REMOVED_MASK_EQUAL = 0x0; | ||
85 | - private static final long SET_PACKET_IN_MASK_EQUAL = 0x0; | ||
86 | - private static final long SET_PORT_STATUS_MASK_EQUAL = 0x7; | ||
87 | - private static final long SET_ALL_SLAVE = 0x0; | ||
88 | - | ||
89 | - private static final long TEST_FLOW_REMOVED_MASK = 0xf; | ||
90 | - private static final long TEST_PACKET_IN_MASK = 0x7; | ||
91 | - private static final long TEST_PORT_STATUS_MASK = 0x7; | ||
92 | - private long barrierXidToWaitFor = -1; | ||
93 | - | ||
94 | - private static final int TABLE_VLAN = 0; | ||
95 | - private static final int TABLE_TMAC = 1; | ||
96 | - private static final int TABLE_IPV4_UNICAST = 2; | ||
97 | - private static final int TABLE_MPLS = 3; | ||
98 | - private static final int TABLE_META = 4; | ||
99 | - private static final int TABLE_ACL = 5; | ||
100 | - | ||
101 | - private static final short MAX_PRIORITY = (short) 0xffff; | ||
102 | - private static final short SLASH_24_PRIORITY = (short) 0xfff0; | ||
103 | - private static final short MIN_PRIORITY = 0x0; | ||
104 | - private static final U64 METADATA_MASK = U64.of(Long.MAX_VALUE << 1 | 0x1); | ||
105 | - | ||
106 | - private final Map<Integer, OFGroup> l2groups = new ConcurrentHashMap<>(); | ||
107 | - | ||
108 | - | ||
109 | - @Override | ||
110 | - public void startDriverHandshake() { | ||
111 | - log.debug("Starting driver handshake for sw {}", getStringId()); | ||
112 | - if (startDriverHandshakeCalled) { | ||
113 | - throw new SwitchDriverSubHandshakeAlreadyStarted(); | ||
114 | - } | ||
115 | - startDriverHandshakeCalled = true; | ||
116 | - factory = this.factory(); | ||
117 | - | ||
118 | - sendBarrier(true); | ||
119 | - } | ||
120 | - | ||
121 | - @Override | ||
122 | - public boolean isDriverHandshakeComplete() { | ||
123 | - if (!startDriverHandshakeCalled) { | ||
124 | - throw new SwitchDriverSubHandshakeNotStarted(); | ||
125 | - } | ||
126 | - return driverHandshakeComplete.get(); | ||
127 | - } | ||
128 | - | ||
129 | - @Override | ||
130 | - public void processDriverHandshakeMessage(OFMessage m) { | ||
131 | - if (!startDriverHandshakeCalled) { | ||
132 | - throw new SwitchDriverSubHandshakeNotStarted(); | ||
133 | - } | ||
134 | - if (driverHandshakeComplete.get()) { | ||
135 | - throw new SwitchDriverSubHandshakeCompleted(m); | ||
136 | - } | ||
137 | - | ||
138 | - switch (m.getType()) { | ||
139 | - case BARRIER_REPLY: | ||
140 | - if (m.getXid() == barrierXidToWaitFor) { | ||
141 | - driverHandshakeComplete.set(true); | ||
142 | - } | ||
143 | - break; | ||
144 | - | ||
145 | - case ERROR: | ||
146 | - log.error("Switch {} Error {}", getStringId(), m); | ||
147 | - break; | ||
148 | - | ||
149 | - case GET_ASYNC_REPLY: | ||
150 | - OFAsyncGetReply asrep = (OFAsyncGetReply) m; | ||
151 | - decodeAsyncGetReply(asrep); | ||
152 | - break; | ||
153 | - case STATS_REPLY: | ||
154 | - processStatsReply((OFStatsReply) m); | ||
155 | - break; | ||
156 | - case PACKET_IN: | ||
157 | - case PORT_STATUS: | ||
158 | - case QUEUE_GET_CONFIG_REPLY: | ||
159 | - case ROLE_REPLY: | ||
160 | - case FEATURES_REPLY: | ||
161 | - case FLOW_REMOVED: | ||
162 | - break; | ||
163 | - | ||
164 | - default: | ||
165 | - log.debug("Received message {} during switch-driver subhandshake " | ||
166 | - + "from switch {} ... Ignoring message", m, getStringId()); | ||
167 | - | ||
168 | - } | ||
169 | - } | ||
170 | - | ||
171 | - private void configureSwitch() throws IOException { | ||
172 | - // setAsyncConfig(); | ||
173 | - // getTableFeatures(); | ||
174 | - sendGroupFeaturesRequest(); | ||
175 | - setL2Groups(); | ||
176 | - sendBarrier(false); | ||
177 | - setL3Groups(); | ||
178 | - setL25Groups(); | ||
179 | - sendGroupDescRequest(); | ||
180 | - populateTableVlan(); | ||
181 | - populateTableTMac(); | ||
182 | - populateIpTable(); | ||
183 | - populateMplsTable(); | ||
184 | - populateTableMissEntry(TABLE_ACL, false, false, false, -1); | ||
185 | - sendBarrier(true); | ||
186 | - } | ||
187 | - | ||
188 | - private void setAsyncConfig() throws IOException { | ||
189 | - List<OFMessage> msglist = new ArrayList<OFMessage>(3); | ||
190 | - OFMessage setAC = null; | ||
191 | - | ||
192 | - if (role == RoleState.MASTER) { | ||
193 | - setAC = factory.buildAsyncSet() | ||
194 | - .setFlowRemovedMaskEqualMaster(SET_FLOW_REMOVED_MASK_MASTER) | ||
195 | - .setPacketInMaskEqualMaster(SET_PACKET_IN_MASK_MASTER) | ||
196 | - .setPortStatusMaskEqualMaster(SET_PORT_STATUS_MASK_MASTER) | ||
197 | - .setFlowRemovedMaskSlave(SET_ALL_SLAVE) | ||
198 | - .setPacketInMaskSlave(SET_ALL_SLAVE) | ||
199 | - .setPortStatusMaskSlave(SET_ALL_SLAVE) | ||
200 | - .setXid(getNextTransactionId()) | ||
201 | - .build(); | ||
202 | - } else if (role == RoleState.EQUAL) { | ||
203 | - setAC = factory.buildAsyncSet() | ||
204 | - .setFlowRemovedMaskEqualMaster(SET_FLOW_REMOVED_MASK_EQUAL) | ||
205 | - .setPacketInMaskEqualMaster(SET_PACKET_IN_MASK_EQUAL) | ||
206 | - .setPortStatusMaskEqualMaster(SET_PORT_STATUS_MASK_EQUAL) | ||
207 | - .setFlowRemovedMaskSlave(SET_ALL_SLAVE) | ||
208 | - .setPacketInMaskSlave(SET_ALL_SLAVE) | ||
209 | - .setPortStatusMaskSlave(SET_ALL_SLAVE) | ||
210 | - .setXid(getNextTransactionId()) | ||
211 | - .build(); | ||
212 | - } | ||
213 | - msglist.add(setAC); | ||
214 | - | ||
215 | - OFMessage br = factory.buildBarrierRequest() | ||
216 | - .setXid(getNextTransactionId()) | ||
217 | - .build(); | ||
218 | - msglist.add(br); | ||
219 | - | ||
220 | - OFMessage getAC = factory.buildAsyncGetRequest() | ||
221 | - .setXid(getNextTransactionId()) | ||
222 | - .build(); | ||
223 | - msglist.add(getAC); | ||
224 | - | ||
225 | - msglist.stream().forEach(m -> sendHandshakeMessage(m)); | ||
226 | - } | ||
227 | - | ||
228 | - private void decodeAsyncGetReply(OFAsyncGetReply rep) { | ||
229 | - long frm = rep.getFlowRemovedMaskEqualMaster(); | ||
230 | - //long frs = rep.getFlowRemovedMaskSlave(); | ||
231 | - long pim = rep.getPacketInMaskEqualMaster(); | ||
232 | - //long pis = rep.getPacketInMaskSlave(); | ||
233 | - long psm = rep.getPortStatusMaskEqualMaster(); | ||
234 | - //long pss = rep.getPortStatusMaskSlave(); | ||
235 | - | ||
236 | - if (role == RoleState.MASTER || role == RoleState.EQUAL) { // should separate | ||
237 | - log.info("FRM:{}", HexString.toHexString((frm & TEST_FLOW_REMOVED_MASK))); | ||
238 | - log.info("PIM:{}", HexString.toHexString((pim & TEST_PACKET_IN_MASK))); | ||
239 | - log.info("PSM:{}", HexString.toHexString((psm & TEST_PORT_STATUS_MASK))); | ||
240 | - } | ||
241 | - | ||
242 | - } | ||
243 | - | ||
244 | - private void getTableFeatures() throws IOException { | ||
245 | - OFMessage gtf = factory.buildTableFeaturesStatsRequest() | ||
246 | - .setXid(getNextTransactionId()) | ||
247 | - .build(); | ||
248 | - sendHandshakeMessage(gtf); | ||
249 | - } | ||
250 | - | ||
251 | - private void sendGroupFeaturesRequest() throws IOException { | ||
252 | - OFMessage gfr = factory.buildGroupFeaturesStatsRequest() | ||
253 | - .setXid(getNextTransactionId()) | ||
254 | - .build(); | ||
255 | - sendHandshakeMessage(gfr); | ||
256 | - } | ||
257 | - | ||
258 | - private void sendGroupDescRequest() throws IOException { | ||
259 | - OFMessage gdr = factory.buildGroupDescStatsRequest() | ||
260 | - .setXid(getNextTransactionId()) | ||
261 | - .build(); | ||
262 | - sendHandshakeMessage(gdr); | ||
263 | - } | ||
264 | - | ||
265 | - /*Create L2 interface groups for all physical ports | ||
266 | - Naming convention followed is the same as OF-DPA spec | ||
267 | - eg. port 1 with allowed vlan 10, is enveloped in group with id, | ||
268 | - 0x0 00a 0001, where the uppermost 4 bits identify an L2 interface, | ||
269 | - the next 12 bits identify the vlan-id, and the lowermost 16 bits | ||
270 | - identify the port number.*/ | ||
271 | - private void setL2Groups() throws IOException { | ||
272 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
273 | - for (OFPortDesc p : getPorts()) { | ||
274 | - int pnum = p.getPortNo().getPortNumber(); | ||
275 | - int portVlan = getVlanConfig(pnum); | ||
276 | - if (U32.of(pnum).compareTo(U32.of(OFPort.MAX.getPortNumber())) < 1) { | ||
277 | - OFGroup gl2 = OFGroup.of(pnum | (portVlan << VLAN_ID_OFFSET)); | ||
278 | - OFAction out = factory.actions().buildOutput() | ||
279 | - .setPort(p.getPortNo()).build(); | ||
280 | - OFAction popVlan = factory.actions().popVlan(); | ||
281 | - List<OFAction> actions = new ArrayList<OFAction>(); | ||
282 | - actions.add(popVlan); | ||
283 | - actions.add(out); | ||
284 | - OFBucket bucket = factory.buildBucket() | ||
285 | - .setActions(actions).build(); | ||
286 | - List<OFBucket> buckets = Collections.singletonList(bucket); | ||
287 | - OFMessage gmAdd = factory.buildGroupAdd() | ||
288 | - .setGroup(gl2) | ||
289 | - .setBuckets(buckets) | ||
290 | - .setGroupType(OFGroupType.INDIRECT) | ||
291 | - .setXid(getNextTransactionId()) | ||
292 | - .build(); | ||
293 | - sendHandshakeMessage(gmAdd); | ||
294 | - msglist.add(gmAdd); | ||
295 | - l2groups.put(pnum, gl2); | ||
296 | - } | ||
297 | - } | ||
298 | - log.debug("Creating {} L2 groups in sw {}", msglist.size(), getStringId()); | ||
299 | - } | ||
300 | - | ||
301 | - private int getVlanConfig(int portnum) { | ||
302 | - int portVlan = 10 * portnum; | ||
303 | - if ((getId() == 0x1 && portnum == 6) || | ||
304 | - (getId() == 0x2) || | ||
305 | - (getId() == 0x3 && portnum == 2)) { | ||
306 | - portVlan = 192; // 0xc0 | ||
307 | - } | ||
308 | - return portVlan; | ||
309 | - } | ||
310 | - | ||
311 | - private MacAddress getRouterMacAddr() { | ||
312 | - if (getId() == 0x3) { | ||
313 | - return MacAddress.of("00:00:07:07:07:80"); // router mac | ||
314 | - } | ||
315 | - if (getId() == 0x1) { | ||
316 | - return MacAddress.of("00:00:01:01:01:80"); | ||
317 | - } | ||
318 | - // switch 0x2 | ||
319 | - return MacAddress.of("00:00:02:02:02:80"); | ||
320 | - } | ||
321 | - | ||
322 | - // only for ports connected to other routers | ||
323 | - private OFAction getDestAction(int portnum) { | ||
324 | - OFAction setDA = null; | ||
325 | - MacAddress dAddr = null; | ||
326 | - if (getId() == 0x1 && portnum == 6) { // connected to switch 2 | ||
327 | - dAddr = MacAddress.of("00:00:02:02:02:80"); | ||
328 | - } | ||
329 | - if (getId() == 0x2) { | ||
330 | - if (portnum == 1) { // connected to sw 1 | ||
331 | - dAddr = MacAddress.of("00:00:01:01:01:80"); | ||
332 | - } else if (portnum == 2) { // connected to sw 3 | ||
333 | - dAddr = MacAddress.of("00:00:07:07:07:80"); | ||
334 | - } | ||
335 | - } | ||
336 | - if (getId() == 0x3) { | ||
337 | - if (portnum == 2) { // connected to switch 2 | ||
338 | - dAddr = MacAddress.of("00:00:02:02:02:80"); | ||
339 | - } | ||
340 | - } | ||
341 | - | ||
342 | - if (dAddr != null) { | ||
343 | - OFOxmEthDst dstAddr = factory.oxms().ethDst(dAddr); | ||
344 | - setDA = factory.actions().buildSetField() | ||
345 | - .setField(dstAddr).build(); | ||
346 | - } | ||
347 | - return setDA; | ||
348 | - } | ||
349 | - | ||
350 | - /* | ||
351 | - * L3 groups are created for all router ports and they all point to corresponding | ||
352 | - * L2 groups. Only the ports that connect to other routers will have the | ||
353 | - * DA set. | ||
354 | - */ | ||
355 | - private void setL3Groups() throws IOException { | ||
356 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
357 | - for (OFGroup gl2 : l2groups.values()) { | ||
358 | - int gnum = gl2.getGroupNumber(); | ||
359 | - int portnum = gnum & 0x0000ffff; | ||
360 | - int vlanid = ((gnum & 0x0fff0000) >> VLAN_ID_OFFSET); | ||
361 | - MacAddress sAddr = getRouterMacAddr(); | ||
362 | - | ||
363 | - OFGroup gl3 = OFGroup.of(0x20000000 | portnum); | ||
364 | - OFAction group = factory.actions().buildGroup() | ||
365 | - .setGroup(gl2).build(); | ||
366 | - OFOxmEthSrc srcAddr = factory.oxms().ethSrc(sAddr); | ||
367 | - OFAction setSA = factory.actions().buildSetField() | ||
368 | - .setField(srcAddr).build(); | ||
369 | - OFOxmVlanVid vid = factory.oxms().vlanVid(OFVlanVidMatch.ofVlan(vlanid)); | ||
370 | - OFAction setVlan = factory.actions().buildSetField() | ||
371 | - .setField(vid).build(); | ||
372 | - OFAction decTtl = factory.actions().decNwTtl(); | ||
373 | - | ||
374 | - List<OFAction> actions = new ArrayList<OFAction>(); | ||
375 | - actions.add(decTtl); // decrement the IP TTL/do-checksum/check TTL | ||
376 | - // and MTU | ||
377 | - actions.add(setVlan); // set the vlan-id of the exit-port (and | ||
378 | - // l2group) | ||
379 | - actions.add(setSA); // set this routers mac address | ||
380 | - // make L3Unicast group setDA for known (configured) ports | ||
381 | - // that connect to other routers | ||
382 | - OFAction setDA = getDestAction(portnum); | ||
383 | - if (setDA != null) { | ||
384 | - actions.add(setDA); | ||
385 | - } | ||
386 | - actions.add(group); | ||
387 | - | ||
388 | - OFBucket bucket = factory.buildBucket() | ||
389 | - .setActions(actions).build(); | ||
390 | - List<OFBucket> buckets = Collections.singletonList(bucket); | ||
391 | - OFMessage gmAdd = factory.buildGroupAdd() | ||
392 | - .setGroup(gl3) | ||
393 | - .setBuckets(buckets) | ||
394 | - .setGroupType(OFGroupType.INDIRECT) | ||
395 | - .setXid(getNextTransactionId()) | ||
396 | - .build(); | ||
397 | - sendHandshakeMessage(gmAdd); | ||
398 | - | ||
399 | - } | ||
400 | - | ||
401 | - log.debug("Creating {} L3 groups in sw {}", msglist.size(), getStringId()); | ||
402 | - } | ||
403 | - | ||
404 | - /* | ||
405 | - * L2.5 or mpls-unicast groups are only created for those router ports | ||
406 | - * connected to other router ports. They differ from the corresponding | ||
407 | - * L3-unicast group only by the fact that they decrement the MPLS TTL | ||
408 | - * instead of the IP ttl | ||
409 | - */ | ||
410 | - private void setL25Groups() throws IOException { | ||
411 | - | ||
412 | - for (OFGroup gl2 : l2groups.values()) { | ||
413 | - int gnum = gl2.getGroupNumber(); | ||
414 | - int portnum = gnum & 0x0000ffff; | ||
415 | - int vlanid = ((gnum & 0x0fff0000) >> VLAN_ID_OFFSET); | ||
416 | - MacAddress sAddr = getRouterMacAddr(); | ||
417 | - OFAction setDA = getDestAction(portnum); | ||
418 | - // setDA will only be non-null for ports connected to routers | ||
419 | - if (setDA != null) { | ||
420 | - OFGroup gl3 = OFGroup.of(0xa0000000 | portnum); // different id | ||
421 | - // for mpls | ||
422 | - // group | ||
423 | - OFAction group = factory.actions().buildGroup() | ||
424 | - .setGroup(gl2).build(); | ||
425 | - OFOxmEthSrc srcAddr = factory.oxms().ethSrc(sAddr); | ||
426 | - OFAction setSA = factory.actions().buildSetField() | ||
427 | - .setField(srcAddr).build(); | ||
428 | - OFOxmVlanVid vid = factory.oxms().vlanVid(OFVlanVidMatch.ofVlan(vlanid)); | ||
429 | - OFAction setVlan = factory.actions().buildSetField() | ||
430 | - .setField(vid).build(); | ||
431 | - OFAction decMplsTtl = factory.actions().decMplsTtl(); | ||
432 | - List<OFAction> actions = new ArrayList<OFAction>(); | ||
433 | - actions.add(decMplsTtl); // decrement the MPLS | ||
434 | - // TTL/do-checksum/check TTL and MTU | ||
435 | - actions.add(setVlan); // set the vlan-id of the exit-port (and | ||
436 | - // l2group) | ||
437 | - actions.add(setSA); // set this routers mac address | ||
438 | - actions.add(setDA); | ||
439 | - actions.add(group); | ||
440 | - OFBucket bucket = factory.buildBucket() | ||
441 | - .setActions(actions).build(); | ||
442 | - List<OFBucket> buckets = Collections.singletonList(bucket); | ||
443 | - OFMessage gmAdd = factory.buildGroupAdd() | ||
444 | - .setGroup(gl3) | ||
445 | - .setBuckets(buckets) | ||
446 | - .setGroupType(OFGroupType.INDIRECT) | ||
447 | - .setXid(getNextTransactionId()) | ||
448 | - .build(); | ||
449 | - sendHandshakeMessage(gmAdd); | ||
450 | - | ||
451 | - } | ||
452 | - } | ||
453 | - | ||
454 | - log.debug("Created MPLS groups in sw {}", getStringId()); | ||
455 | - } | ||
456 | - | ||
457 | - /* Using ECMP groups | ||
458 | - * | ||
459 | - * OFGroup group47 = OFGroup.of(47); | ||
460 | - OFAction outgroup1 = factory.actions() | ||
461 | - .buildGroup() | ||
462 | - .setGroup(group61) | ||
463 | - .build(); | ||
464 | - OFBucket buc47_1 = factory.buildBucket() | ||
465 | - .setWeight(1) | ||
466 | - .setActions(Collections.singletonList(outgroup1)) | ||
467 | - .build(); | ||
468 | - OFAction outgroup2 = factory.actions() | ||
469 | - .buildGroup() | ||
470 | - .setGroup(group62) | ||
471 | - .build(); | ||
472 | - OFBucket buc47_2 = factory.buildBucket() | ||
473 | - .setWeight(1) | ||
474 | - .setActions(Collections.singletonList(outgroup2)) | ||
475 | - .build(); | ||
476 | - List<OFBucket> buckets47 = new ArrayList<OFBucket>(); | ||
477 | - buckets47.add(buc47_1); | ||
478 | - buckets47.add(buc47_2); | ||
479 | - OFMessage gmS12 = factory.buildGroupAdd() | ||
480 | - .setGroup(group47) | ||
481 | - .setBuckets(buckets47) | ||
482 | - .setGroupType(OFGroupType.SELECT) | ||
483 | - .setXid(getNextTransactionId()) | ||
484 | - .build(); | ||
485 | - write(gmS12, null); */ | ||
486 | - | ||
487 | - private void processStatsReply(OFStatsReply sr) { | ||
488 | - switch (sr.getStatsType()) { | ||
489 | - case AGGREGATE: | ||
490 | - break; | ||
491 | - case DESC: | ||
492 | - break; | ||
493 | - case EXPERIMENTER: | ||
494 | - break; | ||
495 | - case FLOW: | ||
496 | - break; | ||
497 | - case GROUP_DESC: | ||
498 | - processGroupDesc((OFGroupDescStatsReply) sr); | ||
499 | - break; | ||
500 | - case GROUP_FEATURES: | ||
501 | - processGroupFeatures((OFGroupFeaturesStatsReply) sr); | ||
502 | - break; | ||
503 | - case METER_CONFIG: | ||
504 | - break; | ||
505 | - case METER_FEATURES: | ||
506 | - break; | ||
507 | - case PORT_DESC: | ||
508 | - break; | ||
509 | - case TABLE_FEATURES: | ||
510 | - break; | ||
511 | - default: | ||
512 | - break; | ||
513 | - | ||
514 | - } | ||
515 | - } | ||
516 | - | ||
517 | - private void processGroupFeatures(OFGroupFeaturesStatsReply gfsr) { | ||
518 | - log.info("Sw: {} Group Features {}", getStringId(), gfsr); | ||
519 | - } | ||
520 | - | ||
521 | - private void processGroupDesc(OFGroupDescStatsReply gdsr) { | ||
522 | - log.info("Sw: {} Group Desc {}", getStringId(), gdsr); | ||
523 | - } | ||
524 | - | ||
525 | - private void populateTableVlan() throws IOException { | ||
526 | - // for all incoming ports assign configured port-vlans | ||
527 | - // currently assign portnum*10 -> vlanid to access ports | ||
528 | - // and vlan 192 to router to router ports | ||
529 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
530 | - for (OFPortDesc p : getPorts()) { | ||
531 | - int pnum = p.getPortNo().getPortNumber(); | ||
532 | - if (U32.of(pnum).compareTo(U32.of(OFPort.MAX.getPortNumber())) < 1) { | ||
533 | - int vlanid = getVlanConfig(pnum); | ||
534 | - OFOxmInPort oxp = factory.oxms().inPort(p.getPortNo()); | ||
535 | - OFOxmVlanVid oxv = factory.oxms() | ||
536 | - .vlanVid(OFVlanVidMatch.UNTAGGED); | ||
537 | - OFOxmList oxmList = OFOxmList.of(oxp, oxv); | ||
538 | - OFMatchV3 match = factory.buildMatchV3() | ||
539 | - .setOxmList(oxmList).build(); | ||
540 | - OFOxmVlanVid vidToSet = factory.oxms() | ||
541 | - .vlanVid(OFVlanVidMatch.ofVlan(vlanid)); | ||
542 | - OFAction pushVlan = factory.actions().pushVlan(EthType.VLAN_FRAME); | ||
543 | - OFAction setVlan = factory.actions().setField(vidToSet); | ||
544 | - List<OFAction> actionlist = new ArrayList<OFAction>(); | ||
545 | - actionlist.add(pushVlan); | ||
546 | - actionlist.add(setVlan); | ||
547 | - OFInstruction appAction = factory.instructions().buildApplyActions() | ||
548 | - .setActions(actionlist).build(); | ||
549 | - OFInstruction gotoTbl = factory.instructions().buildGotoTable() | ||
550 | - .setTableId(TableId.of(TABLE_TMAC)).build(); | ||
551 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
552 | - instructions.add(appAction); | ||
553 | - instructions.add(gotoTbl); | ||
554 | - OFMessage flowEntry = factory.buildFlowAdd() | ||
555 | - .setTableId(TableId.of(TABLE_VLAN)) | ||
556 | - .setMatch(match) | ||
557 | - .setInstructions(instructions) | ||
558 | - .setPriority(1000) // does not matter - all rules | ||
559 | - // exclusive | ||
560 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
561 | - .setIdleTimeout(0) | ||
562 | - .setHardTimeout(0) | ||
563 | - .setXid(getNextTransactionId()) | ||
564 | - .build(); | ||
565 | - sendHandshakeMessage(flowEntry); | ||
566 | - | ||
567 | - } | ||
568 | - } | ||
569 | - // table-vlan has no table-miss entry, and so packets that miss are | ||
570 | - // essentially dropped | ||
571 | - | ||
572 | - log.debug("Added vlan-rules in sw {}", getStringId()); | ||
573 | - } | ||
574 | - | ||
575 | - private void populateTableTMac() throws IOException { | ||
576 | - // match for ip packets | ||
577 | - OFOxmEthType oxe = factory.oxms().ethType(EthType.IPv4); | ||
578 | - OFOxmList oxmListIp = OFOxmList.of(oxe); | ||
579 | - OFMatchV3 matchIp = factory.buildMatchV3() | ||
580 | - .setOxmList(oxmListIp).build(); | ||
581 | - OFInstruction gotoTblIp = factory.instructions().buildGotoTable() | ||
582 | - .setTableId(TableId.of(TABLE_IPV4_UNICAST)).build(); | ||
583 | - List<OFInstruction> instructionsIp = Collections.singletonList(gotoTblIp); | ||
584 | - OFMessage ipEntry = factory.buildFlowAdd() | ||
585 | - .setTableId(TableId.of(TABLE_TMAC)) | ||
586 | - .setMatch(matchIp) | ||
587 | - .setInstructions(instructionsIp) | ||
588 | - .setPriority(1000) // strict priority required lower than | ||
589 | - // multicastMac | ||
590 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
591 | - .setIdleTimeout(0) | ||
592 | - .setHardTimeout(0) | ||
593 | - .setXid(getNextTransactionId()) | ||
594 | - .build(); | ||
595 | - | ||
596 | - // match for mpls packets | ||
597 | - OFOxmEthType oxmpls = factory.oxms().ethType(EthType.MPLS_UNICAST); | ||
598 | - OFOxmList oxmListMpls = OFOxmList.of(oxmpls); | ||
599 | - OFMatchV3 matchMpls = factory.buildMatchV3() | ||
600 | - .setOxmList(oxmListMpls).build(); | ||
601 | - OFInstruction gotoTblMpls = factory.instructions().buildGotoTable() | ||
602 | - .setTableId(TableId.of(TABLE_MPLS)).build(); | ||
603 | - List<OFInstruction> instructionsMpls = Collections.singletonList(gotoTblMpls); | ||
604 | - OFMessage mplsEntry = factory.buildFlowAdd() | ||
605 | - .setTableId(TableId.of(TABLE_TMAC)) | ||
606 | - .setMatch(matchMpls) | ||
607 | - .setInstructions(instructionsMpls) | ||
608 | - .setPriority(1001) // strict priority required lower than | ||
609 | - // multicastMac | ||
610 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
611 | - .setIdleTimeout(0) | ||
612 | - .setHardTimeout(0) | ||
613 | - .setXid(getNextTransactionId()) | ||
614 | - .build(); | ||
615 | - | ||
616 | - // match for everything else to send to controller. Essentially | ||
617 | - // the table miss flow entry | ||
618 | - populateTableMissEntry(TABLE_TMAC, true, false, false, -1); | ||
619 | - log.debug("Adding termination-mac-rules in sw {}", getStringId()); | ||
620 | - List<OFMessage> msglist = new ArrayList<OFMessage>(2); | ||
621 | - msglist.add(ipEntry); | ||
622 | - msglist.add(mplsEntry); | ||
623 | - msglist.stream().forEach(m -> sendHandshakeMessage(m)); | ||
624 | - } | ||
625 | - | ||
626 | - private List<String> getMyIps() { // send to controller | ||
627 | - List<String> myIps = new ArrayList<String>(); | ||
628 | - if (getId() == 0x1) { | ||
629 | - myIps.add("10.0.2.128"); | ||
630 | - myIps.add("10.0.3.128"); | ||
631 | - myIps.add("10.0.1.128"); | ||
632 | - myIps.add("192.168.0.1"); | ||
633 | - } | ||
634 | - if (getId() == 0x2) { | ||
635 | - myIps.add("192.168.0.2"); | ||
636 | - } | ||
637 | - if (getId() == 0x3) { | ||
638 | - myIps.add("192.168.0.3"); | ||
639 | - myIps.add("7.7.7.128"); | ||
640 | - } | ||
641 | - return myIps; | ||
642 | - } | ||
643 | - | ||
644 | - private List<String> getMySubnetIps() { // send to controller | ||
645 | - List<String> subnetIps = new ArrayList<String>(); | ||
646 | - if (getId() == 0x1) { | ||
647 | - subnetIps.add("10.0.2.0"); | ||
648 | - subnetIps.add("10.0.3.0"); | ||
649 | - subnetIps.add("10.0.1.0"); | ||
650 | - } | ||
651 | - | ||
652 | - if (getId() == 0x3) { | ||
653 | - subnetIps.add("7.7.7.0"); | ||
654 | - } | ||
655 | - return subnetIps; | ||
656 | - } | ||
657 | - private static class RouteEntry { | ||
658 | - String prefix; | ||
659 | - String mask; | ||
660 | - int nextHopPort; | ||
661 | - String dstMac; | ||
662 | - int label; | ||
663 | - | ||
664 | - public RouteEntry(String prefix, String mask, int nextHopPort, int label) { | ||
665 | - this.prefix = prefix; | ||
666 | - this.mask = mask; | ||
667 | - this.nextHopPort = nextHopPort; | ||
668 | - this.label = label; | ||
669 | - } | ||
670 | - | ||
671 | - public RouteEntry(String prefix, int nextHopPort, String dstMac) { | ||
672 | - this.prefix = prefix; | ||
673 | - this.nextHopPort = nextHopPort; | ||
674 | - this.dstMac = dstMac; | ||
675 | - } | ||
676 | - } | ||
677 | - | ||
678 | - // send out of mpls-group where the next-hop mac-da is already set | ||
679 | - private List<RouteEntry> getRouterNextHopIps() { | ||
680 | - List<RouteEntry> routerNextHopIps = new ArrayList<RouteEntry>(); | ||
681 | - if (getId() == 0x1) { | ||
682 | - routerNextHopIps | ||
683 | - .add(new RouteEntry("192.168.0.2", "255.255.255.255", 6, 102)); | ||
684 | - routerNextHopIps | ||
685 | - .add(new RouteEntry("192.168.0.3", "255.255.255.255", 6, 103)); | ||
686 | - routerNextHopIps.add(new RouteEntry("7.7.7.0", "255.255.255.0", 6, 103)); | ||
687 | - } | ||
688 | - //if (getId() == 0x2) { | ||
689 | - /* These are required for normal IP routing without labels. | ||
690 | - routerNextHopIps.add(new RouteEntry("192.168.0.1","255.255.255.255",1)); | ||
691 | - routerNextHopIps.add(new RouteEntry("192.168.0.3","255.255.255.255",2)); | ||
692 | - routerNextHopIps.add(new RouteEntry("10.0.1.0","255.255.255.0",1)); | ||
693 | - routerNextHopIps.add(new RouteEntry("10.0.2.0","255.255.255.0",1)); | ||
694 | - routerNextHopIps.add(new RouteEntry("10.0.3.0","255.255.255.0",1)); | ||
695 | - routerNextHopIps.add(new RouteEntry("7.7.7.0","255.255.255.0",2));*/ | ||
696 | - //} | ||
697 | - if (getId() == 0x3) { | ||
698 | - routerNextHopIps | ||
699 | - .add(new RouteEntry("192.168.0.2", "255.255.255.255", 2, 102)); | ||
700 | - routerNextHopIps | ||
701 | - .add(new RouteEntry("192.168.0.1", "255.255.255.255", 2, 101)); | ||
702 | - routerNextHopIps.add(new RouteEntry("10.0.1.0", "255.255.255.0", 2, 101)); | ||
703 | - routerNextHopIps.add(new RouteEntry("10.0.2.0", "255.255.255.0", 2, 101)); | ||
704 | - routerNextHopIps.add(new RouteEntry("10.0.3.0", "255.255.255.0", 2, 101)); | ||
705 | - } | ||
706 | - return routerNextHopIps; | ||
707 | - } | ||
708 | - | ||
709 | - // known host mac-addr, setDA/send out of l3group | ||
710 | - private List<RouteEntry> getHostNextHopIps() { | ||
711 | - List<RouteEntry> hostNextHopIps = new ArrayList<RouteEntry>(); | ||
712 | - if (getId() == 0x1) { | ||
713 | - hostNextHopIps.add(new RouteEntry("10.0.2.1", 4, "00:00:00:00:02:01")); | ||
714 | - hostNextHopIps.add(new RouteEntry("10.0.3.1", 5, "00:00:00:00:03:01")); | ||
715 | - } | ||
716 | - if (getId() == 0x3) { | ||
717 | - hostNextHopIps.add(new RouteEntry("7.7.7.7", 1, "00:00:07:07:07:07")); | ||
718 | - } | ||
719 | - return hostNextHopIps; | ||
720 | - } | ||
721 | - | ||
722 | - private void populateIpTable() throws IOException { | ||
723 | - populateMyIps(); | ||
724 | - populateMySubnets(); | ||
725 | - populateRoutes(); | ||
726 | - populateHostRoutes(); | ||
727 | - | ||
728 | - // match for everything else to send to ACL table. Essentially | ||
729 | - // the table miss flow entry | ||
730 | - populateTableMissEntry(TABLE_IPV4_UNICAST, false, true, | ||
731 | - true, TABLE_ACL); | ||
732 | - } | ||
733 | - | ||
734 | - private void populateMyIps() throws IOException { | ||
735 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
736 | - // first all my ip's as exact-matches | ||
737 | - // write-action instruction to send to controller | ||
738 | - List<String> myIps = getMyIps(); | ||
739 | - for (int i = 0; i < myIps.size(); i++) { | ||
740 | - OFOxmEthType ethTypeIp = factory.oxms() | ||
741 | - .ethType(EthType.IPv4); | ||
742 | - OFOxmIpv4DstMasked ipPrefix = factory.oxms() | ||
743 | - .ipv4DstMasked(IPv4Address.of(myIps.get(i)), IPv4Address.NO_MASK); | ||
744 | - OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix); | ||
745 | - OFMatchV3 match = factory.buildMatchV3() | ||
746 | - .setOxmList(oxmListSlash32).build(); | ||
747 | - OFAction outc = factory.actions().buildOutput() | ||
748 | - .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER) | ||
749 | - .build(); | ||
750 | - OFInstruction writeInstr = factory.instructions().buildWriteActions() | ||
751 | - .setActions(Collections.singletonList(outc)).build(); | ||
752 | - OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
753 | - .setTableId(TableId.of(TABLE_ACL)).build(); | ||
754 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
755 | - instructions.add(writeInstr); | ||
756 | - instructions.add(gotoInstr); | ||
757 | - OFMessage myIpEntry = factory.buildFlowAdd() | ||
758 | - .setTableId(TableId.of(TABLE_IPV4_UNICAST)) | ||
759 | - .setMatch(match) | ||
760 | - .setInstructions(instructions) | ||
761 | - .setPriority(MAX_PRIORITY) // highest priority for exact | ||
762 | - // match | ||
763 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
764 | - .setIdleTimeout(0) | ||
765 | - .setHardTimeout(0) | ||
766 | - .setXid(getNextTransactionId()) | ||
767 | - .build(); | ||
768 | - sendHandshakeMessage(myIpEntry); | ||
769 | - | ||
770 | - } | ||
771 | - log.debug("Added {} my-ip-rules in sw {}", getStringId()); | ||
772 | - } | ||
773 | - | ||
774 | - private void populateMySubnets() throws IOException { | ||
775 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
776 | - // next prefix-based subnet-IP's configured on my interfaces | ||
777 | - // need to ARP for exact-IP, so write-action instruction to send to | ||
778 | - // controller | ||
779 | - // this has different mask and priority than earlier case | ||
780 | - List<String> subnetIps = getMySubnetIps(); | ||
781 | - for (int i = 0; i < subnetIps.size(); i++) { | ||
782 | - OFOxmEthType ethTypeIp = factory.oxms() | ||
783 | - .ethType(EthType.IPv4); | ||
784 | - OFOxmIpv4DstMasked ipPrefix = factory.oxms().ipv4DstMasked( | ||
785 | - IPv4Address.of(subnetIps.get(i)), | ||
786 | - IPv4Address.of(0xffffff00)); // '/24' mask | ||
787 | - OFOxmList oxmListSlash24 = OFOxmList.of(ethTypeIp, ipPrefix); | ||
788 | - OFMatchV3 match = factory.buildMatchV3() | ||
789 | - .setOxmList(oxmListSlash24).build(); | ||
790 | - OFAction outc = factory.actions().buildOutput() | ||
791 | - .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER) | ||
792 | - .build(); | ||
793 | - OFInstruction writeInstr = factory.instructions().buildWriteActions() | ||
794 | - .setActions(Collections.singletonList(outc)).build(); | ||
795 | - OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
796 | - .setTableId(TableId.of(TABLE_ACL)).build(); | ||
797 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
798 | - instructions.add(writeInstr); | ||
799 | - instructions.add(gotoInstr); | ||
800 | - OFMessage myIpEntry = factory.buildFlowAdd() | ||
801 | - .setTableId(TableId.of(TABLE_IPV4_UNICAST)) | ||
802 | - .setMatch(match) | ||
803 | - .setInstructions(instructions) | ||
804 | - .setPriority(SLASH_24_PRIORITY) | ||
805 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
806 | - .setIdleTimeout(0) | ||
807 | - .setHardTimeout(0) | ||
808 | - .setXid(getNextTransactionId()) | ||
809 | - .build(); | ||
810 | - sendHandshakeMessage(myIpEntry); | ||
811 | - | ||
812 | - } | ||
813 | - log.debug("Added subnet-ip-rules in sw {}", getStringId()); | ||
814 | - } | ||
815 | - | ||
816 | - private void populateRoutes() throws IOException { | ||
817 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
818 | - // addresses where I know the next-hop's mac-address because it is a | ||
819 | - // router port - so I have an L3 interface to it (and an MPLS interface) | ||
820 | - List<RouteEntry> routerNextHopIps = getRouterNextHopIps(); | ||
821 | - for (int i = 0; i < routerNextHopIps.size(); i++) { | ||
822 | - OFOxmEthType ethTypeIp = factory.oxms() | ||
823 | - .ethType(EthType.IPv4); | ||
824 | - OFOxmIpv4DstMasked ipPrefix = factory.oxms() | ||
825 | - .ipv4DstMasked( | ||
826 | - IPv4Address.of(routerNextHopIps.get(i).prefix), | ||
827 | - IPv4Address.of(routerNextHopIps.get(i).mask) | ||
828 | - ); | ||
829 | - OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix); | ||
830 | - OFMatchV3 match = factory.buildMatchV3() | ||
831 | - .setOxmList(oxmListSlash32).build(); | ||
832 | - OFAction outg = factory.actions().buildGroup() | ||
833 | - .setGroup(OFGroup.of(0xa0000000 | // mpls group id | ||
834 | - routerNextHopIps.get(i).nextHopPort)) | ||
835 | - .build(); | ||
836 | - // lots of actions before forwarding to mpls group, and | ||
837 | - // unfortunately | ||
838 | - // they need to be apply-actions | ||
839 | - | ||
840 | - OFAction pushlabel = factory.actions().pushMpls(EthType.MPLS_UNICAST); | ||
841 | - OFOxmMplsLabel l = factory.oxms() | ||
842 | - .mplsLabel(U32.of(routerNextHopIps.get(i).label)); | ||
843 | - OFAction setlabelid = factory.actions().buildSetField() | ||
844 | - .setField(l).build(); | ||
845 | - OFAction copyTtlOut = factory.actions().copyTtlOut(); | ||
846 | - // OFAction setBos = | ||
847 | - // factory.actions().buildSetField().setField(bos).build(); | ||
848 | - | ||
849 | - /* | ||
850 | - writeActions.add(pushlabel); // need to be apply actions so can be | ||
851 | - writeActions.add(copyTtlOut); // matched in pseudo-table | ||
852 | - //writeActions.add(setlabelid); // bad support in cpqd | ||
853 | - //writeActions.add(setBos); no support in loxigen | ||
854 | - */ | ||
855 | - | ||
856 | - List<OFAction> applyActions = new ArrayList<OFAction>(); | ||
857 | - applyActions.add(pushlabel); | ||
858 | - applyActions.add(copyTtlOut); | ||
859 | - OFInstruction applyInstr = factory.instructions().buildApplyActions() | ||
860 | - .setActions(applyActions).build(); | ||
861 | - List<OFAction> writeActions = new ArrayList<OFAction>(); | ||
862 | - writeActions.add(outg); // group will decr mpls-ttl, set mac-sa/da, | ||
863 | - // vlan | ||
864 | - OFInstruction writeInstr = factory.instructions().buildWriteActions() | ||
865 | - .setActions(writeActions).build(); | ||
866 | - | ||
867 | - // necessary to match in pseudo-table to overcome cpqd 1.3 flaw | ||
868 | - OFInstruction writeMeta = factory.instructions().buildWriteMetadata() | ||
869 | - .setMetadata(U64.of(routerNextHopIps.get(i).label)) | ||
870 | - .setMetadataMask(METADATA_MASK).build(); | ||
871 | - /*OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
872 | - .setTableId(TableId.of(TABLE_ACL)).build();*/ | ||
873 | - OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
874 | - .setTableId(TableId.of(TABLE_META)).build(); | ||
875 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
876 | - instructions.add(applyInstr); | ||
877 | - // instructions.add(writeInstr);// cannot write here - causes switch | ||
878 | - // to crash | ||
879 | - instructions.add(writeMeta); | ||
880 | - instructions.add(gotoInstr); | ||
881 | - | ||
882 | - int priority = -1; | ||
883 | - if (routerNextHopIps.get(i).mask.equals("255.255.255.255")) { | ||
884 | - priority = MAX_PRIORITY; | ||
885 | - } else { | ||
886 | - priority = SLASH_24_PRIORITY; | ||
887 | - } | ||
888 | - OFMessage myIpEntry = factory.buildFlowAdd() | ||
889 | - .setTableId(TableId.of(TABLE_IPV4_UNICAST)) | ||
890 | - .setMatch(match) | ||
891 | - .setInstructions(instructions) | ||
892 | - .setPriority(priority) | ||
893 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
894 | - .setIdleTimeout(0) | ||
895 | - .setHardTimeout(0) | ||
896 | - .setXid(getNextTransactionId()) | ||
897 | - .build(); | ||
898 | - msglist.add(myIpEntry); | ||
899 | - | ||
900 | - // need to also handle psuedo-table entries to match-metadata and | ||
901 | - // set mpls | ||
902 | - // label-id | ||
903 | - OFOxmEthType ethTypeMpls = factory.oxms() | ||
904 | - .ethType(EthType.MPLS_UNICAST); | ||
905 | - OFOxmMetadataMasked meta = factory.oxms() | ||
906 | - .metadataMasked( | ||
907 | - OFMetadata.ofRaw(routerNextHopIps.get(i).label), | ||
908 | - OFMetadata.NO_MASK); | ||
909 | - OFOxmList oxmListMeta = OFOxmList.of(ethTypeMpls, meta); | ||
910 | - OFMatchV3 matchMeta = factory.buildMatchV3() | ||
911 | - .setOxmList(oxmListMeta).build(); | ||
912 | - List<OFAction> writeActions2 = new ArrayList<OFAction>(); | ||
913 | - writeActions2.add(setlabelid); | ||
914 | - OFAction outg2 = factory.actions().buildGroup() | ||
915 | - .setGroup(OFGroup.of(routerNextHopIps.get(i).nextHopPort | | ||
916 | - (192 << VLAN_ID_OFFSET))) | ||
917 | - .build(); | ||
918 | - writeActions2.add(outg2); | ||
919 | - OFInstruction writeInstr2 = factory.instructions().buildWriteActions() | ||
920 | - .setActions(writeActions2).build(); | ||
921 | - OFInstruction gotoInstr2 = factory.instructions().buildGotoTable() | ||
922 | - .setTableId(TableId.of(TABLE_ACL)).build(); | ||
923 | - List<OFInstruction> instructions2 = new ArrayList<OFInstruction>(); | ||
924 | - // unfortunately have to apply this action too | ||
925 | - OFInstruction applyInstr2 = factory.instructions().buildApplyActions() | ||
926 | - .setActions(writeActions2).build(); | ||
927 | - instructions2.add(applyInstr2); | ||
928 | - // instructions2.add(writeInstr2); | ||
929 | - // instructions2.add(gotoInstr2); | ||
930 | - | ||
931 | - /*OFMatchV3 match3 = factory.buildMatchV3() | ||
932 | - .setOxmList(OFOxmList.of(meta)).build(); | ||
933 | - OFInstruction clearInstruction = factory.instructions().clearActions(); | ||
934 | - List<OFInstruction> instructions3 = new ArrayList<OFInstruction>(); | ||
935 | - OFAction outc = factory.actions().buildOutput() | ||
936 | - .setPort(OFPort.CONTROLLER).setMaxLen(OFPCML_NO_BUFFER) | ||
937 | - .build(); | ||
938 | - OFInstruction writec = factory.instructions() | ||
939 | - .writeActions(Collections.singletonList(outc)); | ||
940 | - instructions3.add(clearInstruction); | ||
941 | - instructions3.add(writec); | ||
942 | - instructions3.add(gotoInstr2); */ | ||
943 | - OFMessage myMetaEntry = factory.buildFlowAdd() | ||
944 | - .setTableId(TableId.of(TABLE_META)) | ||
945 | - .setMatch(matchMeta) | ||
946 | - .setInstructions(instructions2) | ||
947 | - .setPriority(MAX_PRIORITY) | ||
948 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
949 | - .setIdleTimeout(0) | ||
950 | - .setHardTimeout(0) | ||
951 | - .setXid(getNextTransactionId()) | ||
952 | - .build(); | ||
953 | - sendHandshakeMessage(myMetaEntry); | ||
954 | - msglist.add(myMetaEntry); | ||
955 | - | ||
956 | - } | ||
957 | - log.debug("Adding {} next-hop-router-rules in sw {}", msglist.size(), | ||
958 | - getStringId()); | ||
959 | - | ||
960 | - // add a table-miss entry to table 4 for debugging - leave it out | ||
961 | - // unclear packet state - causes switch to crash | ||
962 | - // populateTableMissEntry(TABLE_META, false, true, | ||
963 | - // true, TABLE_ACL); | ||
964 | - } | ||
965 | - | ||
966 | - private void populateHostRoutes() throws IOException { | ||
967 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
968 | - // addresses where I know the next hop's mac-address and I can set the | ||
969 | - // destination mac in the match-instruction.write-action | ||
970 | - // either I sent out arp-request or I got an arp-request from this host | ||
971 | - List<RouteEntry> hostNextHopIps = getHostNextHopIps(); | ||
972 | - for (int i = 0; i < hostNextHopIps.size(); i++) { | ||
973 | - OFOxmEthType ethTypeIp = factory.oxms() | ||
974 | - .ethType(EthType.IPv4); | ||
975 | - OFOxmIpv4DstMasked ipPrefix = factory.oxms() | ||
976 | - .ipv4DstMasked( | ||
977 | - IPv4Address.of(hostNextHopIps.get(i).prefix), | ||
978 | - IPv4Address.NO_MASK); // host addr should be /32 | ||
979 | - OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix); | ||
980 | - OFMatchV3 match = factory.buildMatchV3() | ||
981 | - .setOxmList(oxmListSlash32).build(); | ||
982 | - OFAction setDmac = null, outg = null; | ||
983 | - OFOxmEthDst dmac = factory.oxms() | ||
984 | - .ethDst(MacAddress.of(hostNextHopIps.get(i).dstMac)); | ||
985 | - setDmac = factory.actions().buildSetField() | ||
986 | - .setField(dmac).build(); | ||
987 | - outg = factory.actions().buildGroup() | ||
988 | - .setGroup(OFGroup.of(0x20000000 | hostNextHopIps.get(i).nextHopPort)) // l3group | ||
989 | - // id | ||
990 | - .build(); | ||
991 | - List<OFAction> writeActions = new ArrayList<OFAction>(); | ||
992 | - writeActions.add(setDmac); | ||
993 | - writeActions.add(outg); | ||
994 | - OFInstruction writeInstr = factory.instructions().buildWriteActions() | ||
995 | - .setActions(writeActions).build(); | ||
996 | - OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
997 | - .setTableId(TableId.of(TABLE_ACL)).build(); | ||
998 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
999 | - instructions.add(writeInstr); | ||
1000 | - instructions.add(gotoInstr); | ||
1001 | - OFMessage myIpEntry = factory.buildFlowAdd() | ||
1002 | - .setTableId(TableId.of(TABLE_IPV4_UNICAST)) | ||
1003 | - .setMatch(match) | ||
1004 | - .setInstructions(instructions) | ||
1005 | - .setPriority(MAX_PRIORITY) // highest priority for exact | ||
1006 | - // match | ||
1007 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
1008 | - .setIdleTimeout(0) | ||
1009 | - .setHardTimeout(0) | ||
1010 | - .setXid(getNextTransactionId()) | ||
1011 | - .build(); | ||
1012 | - sendHandshakeMessage(myIpEntry); | ||
1013 | - } | ||
1014 | - | ||
1015 | - log.debug("Adding {} next-hop-host-rules in sw {}", msglist.size(), getStringId()); | ||
1016 | - } | ||
1017 | - | ||
1018 | - private static class MplsEntry { | ||
1019 | - int labelid; | ||
1020 | - int portnum; | ||
1021 | - | ||
1022 | - public MplsEntry(int labelid, int portnum) { | ||
1023 | - this.labelid = labelid; | ||
1024 | - this.portnum = portnum; | ||
1025 | - } | ||
1026 | - } | ||
1027 | - | ||
1028 | - private List<MplsEntry> getMplsEntries() { | ||
1029 | - List<MplsEntry> myLabels = new ArrayList<MplsEntry>(); | ||
1030 | - if (getId() == 0x1) { | ||
1031 | - myLabels.add(new MplsEntry(101, OFPort.CONTROLLER.getPortNumber())); | ||
1032 | - myLabels.add(new MplsEntry(103, 6)); | ||
1033 | - } | ||
1034 | - if (getId() == 0x2) { | ||
1035 | - myLabels.add(new MplsEntry(103, 2)); | ||
1036 | - myLabels.add(new MplsEntry(102, OFPort.CONTROLLER.getPortNumber())); | ||
1037 | - myLabels.add(new MplsEntry(101, 1)); | ||
1038 | - } | ||
1039 | - if (getId() == 0x3) { | ||
1040 | - myLabels.add(new MplsEntry(103, OFPort.CONTROLLER.getPortNumber())); | ||
1041 | - myLabels.add(new MplsEntry(101, 2)); | ||
1042 | - } | ||
1043 | - return myLabels; | ||
1044 | - } | ||
1045 | - | ||
1046 | - private void populateMplsTable() throws IOException { | ||
1047 | - List<OFMessage> msglist = new ArrayList<OFMessage>(); | ||
1048 | - List<MplsEntry> lfibEntries = getMplsEntries(); | ||
1049 | - for (int i = 0; i < lfibEntries.size(); i++) { | ||
1050 | - OFOxmEthType ethTypeMpls = factory.oxms() | ||
1051 | - .ethType(EthType.MPLS_UNICAST); | ||
1052 | - OFOxmMplsLabel labelid = factory.oxms() | ||
1053 | - .mplsLabel(U32.of(lfibEntries.get(i).labelid)); | ||
1054 | - OFOxmList oxmList = OFOxmList.of(ethTypeMpls, labelid); | ||
1055 | - OFMatchV3 matchlabel = factory.buildMatchV3() | ||
1056 | - .setOxmList(oxmList).build(); | ||
1057 | - OFAction poplabel = factory.actions().popMpls(EthType.IPv4); | ||
1058 | - OFAction sendTo = null; | ||
1059 | - if (lfibEntries.get(i).portnum == OFPort.CONTROLLER.getPortNumber()) { | ||
1060 | - sendTo = factory.actions().output(OFPort.CONTROLLER, | ||
1061 | - OFPCML_NO_BUFFER); | ||
1062 | - } else { | ||
1063 | - sendTo = factory.actions().group(OFGroup.of( | ||
1064 | - 0xa0000000 | lfibEntries.get(i).portnum)); | ||
1065 | - } | ||
1066 | - List<OFAction> writeActions = new ArrayList<OFAction>(); | ||
1067 | - writeActions.add(poplabel); | ||
1068 | - writeActions.add(sendTo); | ||
1069 | - OFInstruction writeInstr = factory.instructions().buildWriteActions() | ||
1070 | - .setActions(writeActions).build(); | ||
1071 | - OFInstruction gotoInstr = factory.instructions().buildGotoTable() | ||
1072 | - .setTableId(TableId.of(TABLE_ACL)).build(); | ||
1073 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
1074 | - instructions.add(writeInstr); | ||
1075 | - instructions.add(gotoInstr); | ||
1076 | - OFMessage myMplsEntry = factory.buildFlowAdd() | ||
1077 | - .setTableId(TableId.of(TABLE_MPLS)) | ||
1078 | - .setMatch(matchlabel) | ||
1079 | - .setInstructions(instructions) | ||
1080 | - .setPriority(MAX_PRIORITY) // exact match and exclusive | ||
1081 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
1082 | - .setIdleTimeout(0) | ||
1083 | - .setHardTimeout(0) | ||
1084 | - .setXid(getNextTransactionId()) | ||
1085 | - .build(); | ||
1086 | - sendHandshakeMessage(myMplsEntry); | ||
1087 | - msglist.add(myMplsEntry); | ||
1088 | - } | ||
1089 | - | ||
1090 | - log.debug("Adding {} mpls-forwarding-rules in sw {}", msglist.size(), | ||
1091 | - getStringId()); | ||
1092 | - | ||
1093 | - // match for everything else to send to ACL table. Essentially | ||
1094 | - // the table miss flow entry | ||
1095 | - populateTableMissEntry(TABLE_MPLS, false, true, | ||
1096 | - true, TABLE_ACL); | ||
1097 | - | ||
1098 | - } | ||
1099 | - | ||
1100 | - /** | ||
1101 | - * By default if none of the booleans in the call are set, then the | ||
1102 | - * table-miss entry is added with no instructions, which means that pipeline | ||
1103 | - * execution will stop, and the action set associated with the packet will | ||
1104 | - * be executed. | ||
1105 | - * | ||
1106 | - * @param tableToAdd | ||
1107 | - * @param toControllerNow as an APPLY_ACTION instruction | ||
1108 | - * @param toControllerWrite as a WRITE_ACITION instruction | ||
1109 | - * @param toTable as a GOTO_TABLE instruction | ||
1110 | - * @param tableToSend | ||
1111 | - * @throws java.io.IOException | ||
1112 | - */ | ||
1113 | - @SuppressWarnings("unchecked") | ||
1114 | - private void populateTableMissEntry(int tableToAdd, boolean toControllerNow, | ||
1115 | - boolean toControllerWrite, | ||
1116 | - boolean toTable, int tableToSend) { | ||
1117 | - OFOxmList oxmList = OFOxmList.EMPTY; | ||
1118 | - OFMatchV3 match = factory.buildMatchV3() | ||
1119 | - .setOxmList(oxmList) | ||
1120 | - .build(); | ||
1121 | - OFAction outc = factory.actions() | ||
1122 | - .buildOutput() | ||
1123 | - .setPort(OFPort.CONTROLLER) | ||
1124 | - .setMaxLen(OFPCML_NO_BUFFER) | ||
1125 | - .build(); | ||
1126 | - List<OFInstruction> instructions = new ArrayList<OFInstruction>(); | ||
1127 | - if (toControllerNow) { | ||
1128 | - // table-miss instruction to send to controller immediately | ||
1129 | - OFInstruction instr = factory.instructions() | ||
1130 | - .buildApplyActions() | ||
1131 | - .setActions(Collections.singletonList(outc)) | ||
1132 | - .build(); | ||
1133 | - instructions.add(instr); | ||
1134 | - } | ||
1135 | - | ||
1136 | - if (toControllerWrite) { | ||
1137 | - // table-miss instruction to write-action to send to controller | ||
1138 | - // this will be executed whenever the action-set gets executed | ||
1139 | - OFInstruction instr = factory.instructions() | ||
1140 | - .buildWriteActions() | ||
1141 | - .setActions(Collections.singletonList(outc)) | ||
1142 | - .build(); | ||
1143 | - instructions.add(instr); | ||
1144 | - } | ||
1145 | - | ||
1146 | - if (toTable) { | ||
1147 | - // table-miss instruction to goto-table x | ||
1148 | - OFInstruction instr = factory.instructions() | ||
1149 | - .gotoTable(TableId.of(tableToSend)); | ||
1150 | - instructions.add(instr); | ||
1151 | - } | ||
1152 | - | ||
1153 | - if (!toControllerNow && !toControllerWrite && !toTable) { | ||
1154 | - // table-miss has no instruction - at which point action-set will be | ||
1155 | - // executed - if there is an action to output/group in the action | ||
1156 | - // set | ||
1157 | - // the packet will be sent there, otherwise it will be dropped. | ||
1158 | - instructions = Collections.EMPTY_LIST; | ||
1159 | - } | ||
1160 | - | ||
1161 | - OFMessage tableMissEntry = factory.buildFlowAdd() | ||
1162 | - .setTableId(TableId.of(tableToAdd)) | ||
1163 | - .setMatch(match) // match everything | ||
1164 | - .setInstructions(instructions) | ||
1165 | - .setPriority(MIN_PRIORITY) | ||
1166 | - .setBufferId(OFBufferId.NO_BUFFER) | ||
1167 | - .setIdleTimeout(0) | ||
1168 | - .setHardTimeout(0) | ||
1169 | - .setXid(getNextTransactionId()) | ||
1170 | - .build(); | ||
1171 | - | ||
1172 | - sendHandshakeMessage(tableMissEntry); | ||
1173 | - } | ||
1174 | - | ||
1175 | - private void sendBarrier(boolean finalBarrier) { | ||
1176 | - int xid = getNextTransactionId(); | ||
1177 | - if (finalBarrier) { | ||
1178 | - barrierXidToWaitFor = xid; | ||
1179 | - } | ||
1180 | - OFBarrierRequest br = factory | ||
1181 | - .buildBarrierRequest() | ||
1182 | - .setXid(xid) | ||
1183 | - .build(); | ||
1184 | - | ||
1185 | - sendHandshakeMessage(br); | ||
1186 | - } | ||
1187 | - | ||
1188 | - @Override | ||
1189 | - public Boolean supportNxRole() { | ||
1190 | - return false; | ||
1191 | - } | ||
1192 | -} |
drivers/src/main/java/org/onosproject/driver/handshaker/OFSwitchImplSpringOpenTTP.java
deleted
100644 → 0
1 | -/* | ||
2 | - * Copyright 2015 Open Networking Laboratory | ||
3 | - * | ||
4 | - * 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 | ||
7 | - * | ||
8 | - * 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. | ||
15 | - */ | ||
16 | -package org.onosproject.driver.handshaker; | ||
17 | - | ||
18 | -import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; | ||
19 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted; | ||
20 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted; | ||
21 | -import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted; | ||
22 | -import org.projectfloodlight.openflow.protocol.OFFactory; | ||
23 | -import org.projectfloodlight.openflow.protocol.OFMessage; | ||
24 | - | ||
25 | -import java.util.concurrent.atomic.AtomicBoolean; | ||
26 | - | ||
27 | -public class OFSwitchImplSpringOpenTTP extends AbstractOpenFlowSwitch { | ||
28 | - | ||
29 | - private OFFactory factory; | ||
30 | - | ||
31 | - private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false); | ||
32 | - | ||
33 | - @Override | ||
34 | - public Boolean supportNxRole() { | ||
35 | - return false; | ||
36 | - } | ||
37 | - | ||
38 | - | ||
39 | - @Override | ||
40 | - public void startDriverHandshake() { | ||
41 | - log.debug("Starting driver handshake for sw {}", getStringId()); | ||
42 | - if (startDriverHandshakeCalled) { | ||
43 | - throw new SwitchDriverSubHandshakeAlreadyStarted(); | ||
44 | - } | ||
45 | - startDriverHandshakeCalled = true; | ||
46 | - factory = this.factory(); | ||
47 | - | ||
48 | - driverHandshakeComplete.set(true); | ||
49 | - log.debug("Driver handshake is complete"); | ||
50 | - | ||
51 | - } | ||
52 | - | ||
53 | - @Override | ||
54 | - public boolean isDriverHandshakeComplete() { | ||
55 | - if (!startDriverHandshakeCalled) { | ||
56 | - throw new SwitchDriverSubHandshakeNotStarted(); | ||
57 | - } | ||
58 | - return driverHandshakeComplete.get(); | ||
59 | - } | ||
60 | - | ||
61 | - | ||
62 | - | ||
63 | - @Override | ||
64 | - public void processDriverHandshakeMessage(OFMessage m) { | ||
65 | - if (!startDriverHandshakeCalled) { | ||
66 | - throw new SwitchDriverSubHandshakeNotStarted(); | ||
67 | - } | ||
68 | - if (driverHandshakeComplete.get()) { | ||
69 | - throw new SwitchDriverSubHandshakeCompleted(m); | ||
70 | - } | ||
71 | - } | ||
72 | - | ||
73 | -} |
... | @@ -135,7 +135,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -135,7 +135,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
135 | private GroupService groupService; | 135 | private GroupService groupService; |
136 | private FlowObjectiveStore flowObjectiveStore; | 136 | private FlowObjectiveStore flowObjectiveStore; |
137 | private DeviceId deviceId; | 137 | private DeviceId deviceId; |
138 | - private ApplicationId appId; | 138 | + private ApplicationId driverId; |
139 | 139 | ||
140 | private KryoNamespace appKryo = new KryoNamespace.Builder() | 140 | private KryoNamespace appKryo = new KryoNamespace.Builder() |
141 | .register(GroupKey.class) | 141 | .register(GroupKey.class) |
... | @@ -175,7 +175,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -175,7 +175,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
175 | 175 | ||
176 | groupService.addListener(new InnerGroupListener()); | 176 | groupService.addListener(new InnerGroupListener()); |
177 | 177 | ||
178 | - appId = coreService.registerApplication( | 178 | + driverId = coreService.registerApplication( |
179 | "org.onosproject.driver.OFDPA1Pipeline"); | 179 | "org.onosproject.driver.OFDPA1Pipeline"); |
180 | 180 | ||
181 | initializePipeline(); | 181 | initializePipeline(); |
... | @@ -307,7 +307,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -307,7 +307,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
307 | .withSelector(selector.build()) | 307 | .withSelector(selector.build()) |
308 | .withTreatment(treatment.build()) | 308 | .withTreatment(treatment.build()) |
309 | .withPriority(DEFAULT_PRIORITY) | 309 | .withPriority(DEFAULT_PRIORITY) |
310 | - .fromApp(appId) | 310 | + .fromApp(applicationId) |
311 | .makePermanent() | 311 | .makePermanent() |
312 | .forTable(VLAN_TABLE).build(); | 312 | .forTable(VLAN_TABLE).build(); |
313 | ops = ops.add(rule); | 313 | ops = ops.add(rule); |
... | @@ -325,7 +325,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -325,7 +325,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
325 | .withSelector(selector.build()) | 325 | .withSelector(selector.build()) |
326 | .withTreatment(treatment.build()) | 326 | .withTreatment(treatment.build()) |
327 | .withPriority(DEFAULT_PRIORITY) | 327 | .withPriority(DEFAULT_PRIORITY) |
328 | - .fromApp(appId) | 328 | + .fromApp(applicationId) |
329 | .makePermanent() | 329 | .makePermanent() |
330 | .forTable(TMAC_TABLE).build(); | 330 | .forTable(TMAC_TABLE).build(); |
331 | ops = ops.add(rule); | 331 | ops = ops.add(rule); |
... | @@ -341,8 +341,8 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -341,8 +341,8 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
341 | .forDevice(deviceId) | 341 | .forDevice(deviceId) |
342 | .withSelector(selector.build()) | 342 | .withSelector(selector.build()) |
343 | .withTreatment(treatment.build()) | 343 | .withTreatment(treatment.build()) |
344 | - .withPriority(DEFAULT_PRIORITY) | 344 | + .withPriority(HIGHEST_PRIORITY) |
345 | - .fromApp(appId) | 345 | + .fromApp(applicationId) |
346 | .makePermanent() | 346 | .makePermanent() |
347 | .forTable(ACL_TABLE).build(); | 347 | .forTable(ACL_TABLE).build(); |
348 | ops = ops.add(rule); | 348 | ops = ops.add(rule); |
... | @@ -632,7 +632,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -632,7 +632,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
632 | .withSelector(selector.build()) | 632 | .withSelector(selector.build()) |
633 | .withTreatment(treatment.build()) | 633 | .withTreatment(treatment.build()) |
634 | .withPriority(LOWEST_PRIORITY) | 634 | .withPriority(LOWEST_PRIORITY) |
635 | - .fromApp(appId) | 635 | + .fromApp(driverId) |
636 | .makePermanent() | 636 | .makePermanent() |
637 | .forTable(PORT_TABLE).build(); | 637 | .forTable(PORT_TABLE).build(); |
638 | ops = ops.add(tmisse); | 638 | ops = ops.add(tmisse); |
... | @@ -714,7 +714,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -714,7 +714,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
714 | .withSelector(selector.build()) | 714 | .withSelector(selector.build()) |
715 | .withTreatment(treatment.build()) | 715 | .withTreatment(treatment.build()) |
716 | .withPriority(LOWEST_PRIORITY) | 716 | .withPriority(LOWEST_PRIORITY) |
717 | - .fromApp(appId) | 717 | + .fromApp(driverId) |
718 | .makePermanent() | 718 | .makePermanent() |
719 | .forTable(TMAC_TABLE).build(); | 719 | .forTable(TMAC_TABLE).build(); |
720 | ops = ops.add(rule); // XXX bug in ofdpa | 720 | ops = ops.add(rule); // XXX bug in ofdpa |
... | @@ -744,7 +744,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -744,7 +744,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
744 | .withSelector(selector.build()) | 744 | .withSelector(selector.build()) |
745 | .withTreatment(treatment.build()) | 745 | .withTreatment(treatment.build()) |
746 | .withPriority(LOWEST_PRIORITY) | 746 | .withPriority(LOWEST_PRIORITY) |
747 | - .fromApp(appId) | 747 | + .fromApp(driverId) |
748 | .makePermanent() | 748 | .makePermanent() |
749 | .forTable(UNICAST_ROUTING_TABLE).build(); | 749 | .forTable(UNICAST_ROUTING_TABLE).build(); |
750 | ops = ops.add(rule); | 750 | ops = ops.add(rule); | ... | ... |
... | @@ -21,11 +21,10 @@ | ... | @@ -21,11 +21,10 @@ |
21 | <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" | 21 | <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" |
22 | impl="org.onosproject.driver.handshaker.DefaultSwitchHandShaker"/> | 22 | impl="org.onosproject.driver.handshaker.DefaultSwitchHandShaker"/> |
23 | </driver> | 23 | </driver> |
24 | - <driver name="ovs-corsa" manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0"> | 24 | + <driver name="ovs-corsa" extends="default" |
25 | + manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0"> | ||
25 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" | 26 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" |
26 | impl="org.onosproject.driver.pipeline.OVSCorsaPipeline"/> | 27 | impl="org.onosproject.driver.pipeline.OVSCorsaPipeline"/> |
27 | - <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" | ||
28 | - impl="org.onosproject.driver.handshaker.OFOVSSwitchCorsaTTP"/> | ||
29 | </driver> | 28 | </driver> |
30 | <driver name="spring-open-cpqd" extends="default" | 29 | <driver name="spring-open-cpqd" extends="default" |
31 | manufacturer="Stanford University, Ericsson Research and CPqD Research" hwVersion="OpenFlow 1.3 Reference Userspace Switch" swVersion=".*"> | 30 | manufacturer="Stanford University, Ericsson Research and CPqD Research" hwVersion="OpenFlow 1.3 Reference Userspace Switch" swVersion=".*"> | ... | ... |
-
Please register or login to post a comment