blob: 94517bf62fb049d30f9c7056a15d0f3513e4a336 [file] [log] [blame]
Yi Tseng0b809722017-11-03 10:23:26 -07001/*
2 * Copyright 2017-present Open Networking Foundation
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
Carmelo Cascone356ab8b2019-09-25 01:02:53 -070017package org.onosproject.pipelines.fabric.impl.behaviour.pipeliner;
Yi Tseng0b809722017-11-03 10:23:26 -070018
Daniele Moro01ca2ab2019-06-25 11:48:48 -070019import com.google.common.collect.ImmutableList;
Carmelo Casconeb5324e72018-11-25 02:26:32 -080020import org.junit.Before;
Yi Tseng0b809722017-11-03 10:23:26 -070021import org.junit.Ignore;
22import org.junit.Test;
23import org.onlab.packet.Ethernet;
24import org.onlab.packet.IPv4;
Charles Chan384aea22018-08-23 22:08:02 -070025import org.onlab.packet.MacAddress;
Yi Tseng0b809722017-11-03 10:23:26 -070026import org.onlab.packet.TpPort;
27import org.onlab.packet.UDP;
Daniele Moro01ca2ab2019-06-25 11:48:48 -070028import org.onosproject.net.PortNumber;
Yi Tseng0b809722017-11-03 10:23:26 -070029import org.onosproject.net.flow.DefaultFlowRule;
30import org.onosproject.net.flow.DefaultTrafficSelector;
31import org.onosproject.net.flow.DefaultTrafficTreatment;
32import org.onosproject.net.flow.FlowRule;
33import org.onosproject.net.flow.TrafficSelector;
34import org.onosproject.net.flow.TrafficTreatment;
Charles Chan384aea22018-08-23 22:08:02 -070035import org.onosproject.net.flow.criteria.Criterion;
36import org.onosproject.net.flow.criteria.EthCriterion;
Wailok Shumfb7e7872021-06-18 17:30:08 +080037import org.onosproject.net.flow.criteria.PiCriterion;
Yi Tseng0b809722017-11-03 10:23:26 -070038import org.onosproject.net.flowobjective.DefaultForwardingObjective;
39import org.onosproject.net.flowobjective.ForwardingObjective;
Daniele Moro01ca2ab2019-06-25 11:48:48 -070040import org.onosproject.net.group.DefaultGroupBucket;
41import org.onosproject.net.group.DefaultGroupDescription;
42import org.onosproject.net.group.DefaultGroupKey;
43import org.onosproject.net.group.GroupBucket;
44import org.onosproject.net.group.GroupBuckets;
Yi Tseng0b809722017-11-03 10:23:26 -070045import org.onosproject.net.group.GroupDescription;
Daniele Moro01ca2ab2019-06-25 11:48:48 -070046import org.onosproject.net.group.GroupKey;
Yi Tseng0b809722017-11-03 10:23:26 -070047import org.onosproject.net.pi.model.PiTableId;
48import org.onosproject.net.pi.runtime.PiAction;
49import org.onosproject.net.pi.runtime.PiActionParam;
Carmelo Cascone2102bfb2020-12-04 16:54:24 -080050import org.onosproject.pipelines.fabric.FabricConstants;
Yi Tseng0b809722017-11-03 10:23:26 -070051
52import java.util.List;
53
54import static org.junit.Assert.assertEquals;
55import static org.junit.Assert.assertTrue;
pierventre4d29d3c2021-08-27 17:20:00 +020056import static org.onosproject.pipelines.fabric.impl.behaviour.Constants.EDGE_PORT;
57import static org.onosproject.pipelines.fabric.impl.behaviour.Constants.INFRA_PORT;
Wailok Shumfb7e7872021-06-18 17:30:08 +080058import static org.onosproject.pipelines.fabric.impl.behaviour.Constants.PORT_TYPE_EDGE;
59import static org.onosproject.pipelines.fabric.impl.behaviour.Constants.PORT_TYPE_INFRA;
60import static org.onosproject.pipelines.fabric.impl.behaviour.Constants.PORT_TYPE_MASK;
Yi Tseng0b809722017-11-03 10:23:26 -070061
62/**
63 * Test cases for fabric.p4 pipeline forwarding control block.
64 */
Carmelo Cascone2388cc12021-05-26 19:30:30 +020065public class ForwardingObjectiveTranslatorTest extends BaseObjectiveTranslatorTest {
Yi Tseng0b809722017-11-03 10:23:26 -070066
Carmelo Casconeb5324e72018-11-25 02:26:32 -080067 private ForwardingObjectiveTranslator translator;
68
69 @Before
70 public void setup() {
71 super.doSetup();
72 translator = new ForwardingObjectiveTranslator(DEVICE_ID, capabilitiesHashed);
73 }
74
Yi Tseng0b809722017-11-03 10:23:26 -070075 /**
76 * Test versatile flag of forwarding objective with ARP match.
77 */
78 @Test
79 public void testAclArp() {
80 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
Yi Tseng0b809722017-11-03 10:23:26 -070081 .punt()
82 .build();
83 // ARP
84 TrafficSelector selector = DefaultTrafficSelector.builder()
85 .matchEthType(Ethernet.TYPE_ARP)
86 .build();
87 ForwardingObjective fwd = DefaultForwardingObjective.builder()
88 .withSelector(selector)
89 .withPriority(PRIORITY)
90 .fromApp(APP_ID)
91 .makePermanent()
92 .withFlag(ForwardingObjective.Flag.VERSATILE)
93 .withTreatment(treatment)
94 .add();
95
Carmelo Casconeb5324e72018-11-25 02:26:32 -080096 ObjectiveTranslation result = translator.translate(fwd);
Yi Tseng0b809722017-11-03 10:23:26 -070097
98 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
99 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
100 assertEquals(1, flowRulesInstalled.size());
Daniele Moro01ca2ab2019-06-25 11:48:48 -0700101 assertEquals(1, groupsInstalled.size());
Yi Tseng0b809722017-11-03 10:23:26 -0700102
103 FlowRule actualFlowRule = flowRulesInstalled.get(0);
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800104 PiAction piAction = PiAction.builder()
Daniele Moro01ca2ab2019-06-25 11:48:48 -0700105 .withId(FabricConstants.FABRIC_INGRESS_ACL_SET_CLONE_SESSION_ID)
106 .withParameter(new PiActionParam(
107 FabricConstants.CLONE_ID,
108 ForwardingObjectiveTranslator.CLONE_TO_CPU_ID))
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800109 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700110 FlowRule expectedFlowRule = DefaultFlowRule.builder()
111 .forDevice(DEVICE_ID)
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800112 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -0700113 .withPriority(PRIORITY)
114 .makePermanent()
115 .withSelector(selector)
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800116 .withTreatment(DefaultTrafficTreatment.builder()
117 .piTableAction(piAction).build())
Yi Tseng0b809722017-11-03 10:23:26 -0700118 .fromApp(APP_ID)
119 .build();
120
Daniele Moro01ca2ab2019-06-25 11:48:48 -0700121 GroupDescription actualCloneGroup = groupsInstalled.get(0);
122 TrafficTreatment cloneGroupTreatment = DefaultTrafficTreatment.builder()
123 .setOutput(PortNumber.CONTROLLER)
124 .build();
125
126 List<GroupBucket> cloneBuckets = ImmutableList.of(
127 DefaultGroupBucket.createCloneGroupBucket(cloneGroupTreatment));
128
129 GroupBuckets cloneGroupBuckets = new GroupBuckets(cloneBuckets);
130 GroupKey cloneGroupKey = new DefaultGroupKey(
131 FabricPipeliner.KRYO.serialize(ForwardingObjectiveTranslator.CLONE_TO_CPU_ID));
132 GroupDescription expectedCloneGroup = new DefaultGroupDescription(
133 DEVICE_ID,
134 GroupDescription.Type.CLONE,
135 cloneGroupBuckets,
136 cloneGroupKey,
137 ForwardingObjectiveTranslator.CLONE_TO_CPU_ID,
138 APP_ID
139 );
140
Yi Tseng0b809722017-11-03 10:23:26 -0700141 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
Daniele Moro01ca2ab2019-06-25 11:48:48 -0700142 assertTrue(expectedCloneGroup.equals(actualCloneGroup));
Yi Tseng0b809722017-11-03 10:23:26 -0700143 }
144
145 /**
146 * Test versatile flag of forwarding objective with DHCP match.
147 */
148 @Test
149 public void testAclDhcp() {
150 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
151 .wipeDeferred()
152 .punt()
153 .build();
154 // DHCP
155 TrafficSelector selector = DefaultTrafficSelector.builder()
156 .matchEthType(Ethernet.TYPE_IPV4)
157 .matchIPProtocol(IPv4.PROTOCOL_UDP)
158 .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
159 .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
160 .build();
161 ForwardingObjective fwd = DefaultForwardingObjective.builder()
162 .withSelector(selector)
163 .withPriority(PRIORITY)
164 .fromApp(APP_ID)
165 .makePermanent()
166 .withFlag(ForwardingObjective.Flag.VERSATILE)
167 .withTreatment(treatment)
168 .add();
169
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800170 ObjectiveTranslation result = translator.translate(fwd);
Yi Tseng0b809722017-11-03 10:23:26 -0700171
172 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
173 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
174 assertEquals(1, flowRulesInstalled.size());
175 assertTrue(groupsInstalled.isEmpty());
176
177 FlowRule actualFlowRule = flowRulesInstalled.get(0);
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800178 PiAction piAction = PiAction.builder()
179 .withId(FabricConstants.FABRIC_INGRESS_ACL_PUNT_TO_CPU)
180 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700181 FlowRule expectedFlowRule = DefaultFlowRule.builder()
182 .forDevice(DEVICE_ID)
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800183 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -0700184 .withPriority(PRIORITY)
185 .makePermanent()
186 .withSelector(selector)
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800187 .withTreatment(DefaultTrafficTreatment.builder()
188 .piTableAction(piAction).build())
Yi Tseng0b809722017-11-03 10:23:26 -0700189 .fromApp(APP_ID)
190 .build();
191
192 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
193 }
Wailok Shumfb7e7872021-06-18 17:30:08 +0800194
195 /**
196 * Test versatile flag of forwarding objective with next step.
197 */
198 @Test
199 public void testAclNext() {
200 // ACL 8-tuples
201 TrafficSelector selector = DefaultTrafficSelector.builder()
202 .matchEthType(Ethernet.TYPE_IPV4)
203 .matchIPDst(IPV4_UNICAST_ADDR)
204 .build();
205 ForwardingObjective fwd = DefaultForwardingObjective.builder()
206 .withSelector(selector)
207 .withPriority(PRIORITY)
208 .fromApp(APP_ID)
209 .makePermanent()
210 .withFlag(ForwardingObjective.Flag.VERSATILE)
211 .nextStep(NEXT_ID_1)
212 .add();
213
214 ObjectiveTranslation result = translator.translate(fwd);
215
216 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
217 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
218 assertEquals(1, flowRulesInstalled.size());
219 assertTrue(groupsInstalled.isEmpty());
220
221 FlowRule actualFlowRule = flowRulesInstalled.get(0);
222 PiAction piAction = PiAction.builder()
223 .withId(FabricConstants.FABRIC_INGRESS_ACL_SET_NEXT_ID_ACL)
224 .withParameter(new PiActionParam(FabricConstants.NEXT_ID, NEXT_ID_1))
225 .build();
226 FlowRule expectedFlowRule = DefaultFlowRule.builder()
227 .forDevice(DEVICE_ID)
228 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
229 .withPriority(PRIORITY)
230 .makePermanent()
231 .withSelector(selector)
232 .withTreatment(DefaultTrafficTreatment.builder()
233 .piTableAction(piAction).build())
234 .fromApp(APP_ID)
235 .build();
236
237 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
238 }
239
240 /**
241 * Test versatile flag of forwarding objective with next step and port type.
242 */
243 @Test
244 public void testAclNextWithPortType() {
245 // ACL 8-tuples
246 TrafficSelector selector = DefaultTrafficSelector.builder()
247 .matchEthType(Ethernet.TYPE_IPV4)
248 .matchIPDst(IPV4_UNICAST_ADDR)
249 .build();
250 TrafficSelector metaSelector = DefaultTrafficSelector.builder()
pierventre4d29d3c2021-08-27 17:20:00 +0200251 .matchMetadata(EDGE_PORT)
Wailok Shumfb7e7872021-06-18 17:30:08 +0800252 .build();
253 ForwardingObjective fwd = DefaultForwardingObjective.builder()
254 .withSelector(selector)
255 .withPriority(PRIORITY)
256 .fromApp(APP_ID)
257 .makePermanent()
258 .withFlag(ForwardingObjective.Flag.VERSATILE)
259 .nextStep(NEXT_ID_1)
260 .withMeta(metaSelector)
261 .add();
262
263 ObjectiveTranslation result = translator.translate(fwd);
264
265 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
266 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
267 assertEquals(1, flowRulesInstalled.size());
268 assertTrue(groupsInstalled.isEmpty());
269
270 FlowRule actualFlowRule = flowRulesInstalled.get(0);
271 PiAction piAction = PiAction.builder()
272 .withId(FabricConstants.FABRIC_INGRESS_ACL_SET_NEXT_ID_ACL)
273 .withParameter(new PiActionParam(FabricConstants.NEXT_ID, NEXT_ID_1))
274 .build();
275 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
276 .matchEthType(Ethernet.TYPE_IPV4)
277 .matchIPDst(IPV4_UNICAST_ADDR)
278 .matchPi(PiCriterion.builder()
279 .matchTernary(FabricConstants.HDR_PORT_TYPE, PORT_TYPE_EDGE, PORT_TYPE_MASK)
280 .build())
281 .build();
282 FlowRule expectedFlowRule = DefaultFlowRule.builder()
283 .forDevice(DEVICE_ID)
284 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
285 .withPriority(PRIORITY)
286 .makePermanent()
287 .withSelector(expectedSelector)
288 .withTreatment(DefaultTrafficTreatment.builder()
289 .piTableAction(piAction).build())
290 .fromApp(APP_ID)
291 .build();
292
293 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
294
295 metaSelector = DefaultTrafficSelector.builder()
pierventre4d29d3c2021-08-27 17:20:00 +0200296 .matchMetadata(INFRA_PORT)
Wailok Shumfb7e7872021-06-18 17:30:08 +0800297 .build();
298 fwd = DefaultForwardingObjective.builder()
299 .withSelector(selector)
300 .withPriority(PRIORITY)
301 .fromApp(APP_ID)
302 .makePermanent()
303 .withFlag(ForwardingObjective.Flag.VERSATILE)
304 .nextStep(NEXT_ID_1)
305 .withMeta(metaSelector)
306 .add();
307
308 result = translator.translate(fwd);
309
310 flowRulesInstalled = (List<FlowRule>) result.flowRules();
311 groupsInstalled = (List<GroupDescription>) result.groups();
312 assertEquals(1, flowRulesInstalled.size());
313 assertTrue(groupsInstalled.isEmpty());
314
315 actualFlowRule = flowRulesInstalled.get(0);
316 expectedSelector = DefaultTrafficSelector.builder()
317 .matchEthType(Ethernet.TYPE_IPV4)
318 .matchIPDst(IPV4_UNICAST_ADDR)
319 .matchPi(PiCriterion.builder()
320 .matchTernary(FabricConstants.HDR_PORT_TYPE, PORT_TYPE_INFRA, PORT_TYPE_MASK)
321 .build())
322 .build();
323 expectedFlowRule = DefaultFlowRule.builder()
324 .forDevice(DEVICE_ID)
325 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
326 .withPriority(PRIORITY)
327 .makePermanent()
328 .withSelector(expectedSelector)
329 .withTreatment(DefaultTrafficTreatment.builder()
330 .piTableAction(piAction).build())
331 .fromApp(APP_ID)
332 .build();
333
334 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
335 }
336
337 /**
Wailok Shum4f51bde2021-06-11 22:48:41 +0800338 * Test versatile flag of forwarding objective with acl drop.
339 */
340 @Test
341 public void testAclDrop() {
342 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
343 .wipeDeferred()
344 .build();
345 // ACL 8-tuples like
346 TrafficSelector selector = DefaultTrafficSelector.builder()
347 .matchIPDst(IPV4_UNICAST_ADDR)
348 .build();
349 ForwardingObjective fwd = DefaultForwardingObjective.builder()
350 .withSelector(selector)
351 .withPriority(PRIORITY)
352 .fromApp(APP_ID)
353 .makePermanent()
354 .withFlag(ForwardingObjective.Flag.VERSATILE)
355 .withTreatment(treatment)
356 .add();
357
358 ObjectiveTranslation result = translator.translate(fwd);
359
360 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
361 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
362 assertEquals(1, flowRulesInstalled.size());
363 assertTrue(groupsInstalled.isEmpty());
364
365 FlowRule actualFlowRule = flowRulesInstalled.get(0);
366 PiAction piAction = PiAction.builder()
367 .withId(FabricConstants.FABRIC_INGRESS_ACL_DROP)
368 .build();
369 FlowRule expectedFlowRule = DefaultFlowRule.builder()
370 .forDevice(DEVICE_ID)
371 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
372 .withPriority(PRIORITY)
373 .makePermanent()
374 .withSelector(selector)
375 .withTreatment(DefaultTrafficTreatment.builder()
376 .piTableAction(piAction).build())
377 .fromApp(APP_ID)
378 .build();
379
380 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
381 }
382
383 /**
384 * Test versatile flag of forwarding objective with acl nop.
385 */
386 @Test
387 public void testAclNop() {
388 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
389 .build();
390 // ACL 8-tuples like
391 TrafficSelector selector = DefaultTrafficSelector.builder()
392 .matchIPDst(IPV4_UNICAST_ADDR)
393 .build();
394 ForwardingObjective fwd = DefaultForwardingObjective.builder()
395 .withSelector(selector)
396 .withPriority(PRIORITY)
397 .fromApp(APP_ID)
398 .makePermanent()
399 .withFlag(ForwardingObjective.Flag.VERSATILE)
400 .withTreatment(treatment)
401 .add();
402
403 ObjectiveTranslation result = translator.translate(fwd);
404
405 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
406 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
407 assertEquals(1, flowRulesInstalled.size());
408 assertTrue(groupsInstalled.isEmpty());
409
410 FlowRule actualFlowRule = flowRulesInstalled.get(0);
411 PiAction piAction = PiAction.builder()
412 .withId(FabricConstants.FABRIC_INGRESS_ACL_NOP_ACL)
413 .build();
414 FlowRule expectedFlowRule = DefaultFlowRule.builder()
415 .forDevice(DEVICE_ID)
416 .forTable(FabricConstants.FABRIC_INGRESS_ACL_ACL)
417 .withPriority(PRIORITY)
418 .makePermanent()
419 .withSelector(selector)
420 .withTreatment(DefaultTrafficTreatment.builder()
421 .piTableAction(piAction).build())
422 .fromApp(APP_ID)
423 .build();
424
425 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
426 }
Yi Tseng0b809722017-11-03 10:23:26 -0700427
428 /**
429 * Test programming L2 unicast rule to bridging table.
430 */
431 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800432 public void testL2Unicast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700433 TrafficSelector selector = DefaultTrafficSelector.builder()
434 .matchVlanId(VLAN_100)
435 .matchEthDst(HOST_MAC)
436 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800437 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
Charles Chan384aea22018-08-23 22:08:02 -0700438 buildExpectedSelector(selector), selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700439 }
440
441 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800442 public void testL2Broadcast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700443 TrafficSelector selector = DefaultTrafficSelector.builder()
444 .matchVlanId(VLAN_100)
445 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800446 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
447 selector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700448 }
449
450 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800451 public void testIPv4Unicast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700452 TrafficSelector selector = DefaultTrafficSelector.builder()
453 .matchEthType(Ethernet.TYPE_IPV4)
454 .matchIPDst(IPV4_UNICAST_ADDR)
455 .build();
456 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
457 .matchIPDst(IPV4_UNICAST_ADDR)
458 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700459 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800460 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700461 }
462
463 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800464 public void testIPv4UnicastWithNoNextId() throws FabricPipelinerException {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800465 TrafficSelector selector = DefaultTrafficSelector.builder()
466 .matchEthType(Ethernet.TYPE_IPV4)
467 .matchIPDst(IPV4_UNICAST_ADDR)
468 .build();
469 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
470 .matchIPDst(IPV4_UNICAST_ADDR)
471 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700472 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800473 expectedSelector, selector, null);
Yi Tsengdf3eec52018-02-15 14:56:02 -0800474 }
475
476 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700477 @Ignore
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800478 public void testIPv4Multicast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700479 TrafficSelector selector = DefaultTrafficSelector.builder()
480 .matchEthType(Ethernet.TYPE_IPV4)
481 .matchVlanId(VLAN_100)
482 .matchIPDst(IPV4_MCAST_ADDR)
483 .build();
484 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
485 .matchIPDst(IPV4_MCAST_ADDR)
486 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700487 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800488 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700489 }
490
491 @Test
492 @Ignore
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800493 public void testIPv6Unicast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700494 TrafficSelector selector = DefaultTrafficSelector.builder()
495 .matchEthType(Ethernet.TYPE_IPV6)
496 .matchIPDst(IPV6_UNICAST_ADDR)
497 .build();
498 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
499 .matchIPDst(IPV6_UNICAST_ADDR)
500 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700501 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800502 expectedSelector, selector, NEXT_ID_1);
503
Yi Tseng0b809722017-11-03 10:23:26 -0700504 }
505
506 @Test
507 @Ignore
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800508 public void testIPv6Multicast() throws FabricPipelinerException {
Yi Tseng0b809722017-11-03 10:23:26 -0700509 TrafficSelector selector = DefaultTrafficSelector.builder()
510 .matchEthType(Ethernet.TYPE_IPV6)
511 .matchVlanId(VLAN_100)
512 .matchIPDst(IPV6_MCAST_ADDR)
513 .build();
514 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
515 .matchIPDst(IPV6_MCAST_ADDR)
516 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700517 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800518 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700519 }
520
521 @Test
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800522 public void testMpls() throws FabricPipelinerException {
Yi Tseng1b154bd2017-11-20 17:48:19 -0800523 TrafficSelector selector = DefaultTrafficSelector.builder()
524 .matchEthType(Ethernet.MPLS_UNICAST)
525 .matchMplsLabel(MPLS_10)
526 .matchMplsBos(true)
527 .build();
528 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
529 .matchMplsLabel(MPLS_10)
530 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700531
Charles Chanea89a1c2018-08-13 13:14:18 -0700532 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, NEXT_ID_1);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800533 PiAction setNextIdAction = PiAction.builder()
Yi Tseng43ee7e82018-04-12 16:37:34 +0800534 .withId(FabricConstants.FABRIC_INGRESS_FORWARDING_POP_MPLS_AND_NEXT)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800535 .withParameter(nextIdParam)
536 .build();
537 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
538 .piTableAction(setNextIdAction)
539 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800540 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_MPLS,
541 expectedSelector, selector, NEXT_ID_1, treatment);
Yi Tseng0b809722017-11-03 10:23:26 -0700542 }
543
544 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800545 TrafficSelector selector, Integer nextId) throws FabricPipelinerException {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800546 TrafficTreatment setNextIdTreatment;
547 if (nextId == null) {
548 // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800549
550 setNextIdTreatment = DefaultTrafficTreatment.builder().
551 piTableAction(PiAction.builder()
552 .withId(FabricConstants.FABRIC_INGRESS_FORWARDING_NOP_ROUTING_V4)
553 .build())
554 .build();
Yi Tsengdf3eec52018-02-15 14:56:02 -0800555 } else {
Charles Chanea89a1c2018-08-13 13:14:18 -0700556 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, nextId);
Yi Tseng47eac892018-07-11 02:17:04 +0800557 PiAction.Builder setNextIdAction = PiAction.builder()
558 .withParameter(nextIdParam);
559
560 if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING)) {
561 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_BRIDGING);
Charles Chan384aea22018-08-23 22:08:02 -0700562 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4)) {
563 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ROUTING_V4);
564 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6)) {
565 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ROUTING_V6);
Yi Tseng47eac892018-07-11 02:17:04 +0800566 }
567
Yi Tsengdf3eec52018-02-15 14:56:02 -0800568 setNextIdTreatment = DefaultTrafficTreatment.builder()
Yi Tseng47eac892018-07-11 02:17:04 +0800569 .piTableAction(setNextIdAction.build())
Yi Tsengdf3eec52018-02-15 14:56:02 -0800570 .build();
571 }
Yi Tseng1b154bd2017-11-20 17:48:19 -0800572
573 testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
574
575 }
576
577 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800578 TrafficSelector selector, Integer nextId, TrafficTreatment treatment)
579 throws FabricPipelinerException {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800580 ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
Yi Tseng0b809722017-11-03 10:23:26 -0700581 .withSelector(selector)
582 .withPriority(PRIORITY)
583 .fromApp(APP_ID)
584 .makePermanent()
Yi Tsengdf3eec52018-02-15 14:56:02 -0800585 .withTreatment(treatment)
586 .withFlag(ForwardingObjective.Flag.SPECIFIC);
Yi Tseng0b809722017-11-03 10:23:26 -0700587
Yi Tsengdf3eec52018-02-15 14:56:02 -0800588 if (nextId != null) {
589 fwd.nextStep(nextId);
590 }
591
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800592 ObjectiveTranslation actualTranslation = translator.translate(fwd.add());
Yi Tseng0b809722017-11-03 10:23:26 -0700593
594 FlowRule expectedFlowRule = DefaultFlowRule.builder()
595 .forDevice(DEVICE_ID)
596 .forTable(expectedTableId)
597 .withPriority(PRIORITY)
598 .makePermanent()
599 .withSelector(expectedSelector)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800600 .withTreatment(treatment)
Yi Tseng0b809722017-11-03 10:23:26 -0700601 .fromApp(APP_ID)
602 .build();
603
Carmelo Casconeb5324e72018-11-25 02:26:32 -0800604 ObjectiveTranslation expectedTranslation = ObjectiveTranslation.builder()
605 .addFlowRule(expectedFlowRule)
606 .build();
607
608 assertEquals(expectedTranslation, actualTranslation);
Yi Tseng0b809722017-11-03 10:23:26 -0700609 }
Charles Chan384aea22018-08-23 22:08:02 -0700610
611 private TrafficSelector buildExpectedSelector(TrafficSelector selector) {
612 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
613 selector.criteria().forEach(c -> {
614 if (c.type() == Criterion.Type.ETH_DST) {
615 sbuilder.matchEthDstMasked(((EthCriterion) c).mac(), MacAddress.EXACT_MASK);
616 } else {
617 sbuilder.add(c);
618 }
619 });
620 return sbuilder.build();
621 }
Yi Tseng0b809722017-11-03 10:23:26 -0700622}