blob: bb06dd31c6e2db8da3f1ac2b8ad0a44be44dfdb5 [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
17package org.onosproject.pipelines.fabric.pipeliner;
18
19import org.junit.Ignore;
20import org.junit.Test;
21import org.onlab.packet.Ethernet;
22import org.onlab.packet.IPv4;
Charles Chan384aea22018-08-23 22:08:02 -070023import org.onlab.packet.MacAddress;
Yi Tseng0b809722017-11-03 10:23:26 -070024import org.onlab.packet.TpPort;
25import org.onlab.packet.UDP;
Yi Tseng0b809722017-11-03 10:23:26 -070026import org.onosproject.net.flow.DefaultFlowRule;
27import org.onosproject.net.flow.DefaultTrafficSelector;
28import org.onosproject.net.flow.DefaultTrafficTreatment;
29import org.onosproject.net.flow.FlowRule;
30import org.onosproject.net.flow.TrafficSelector;
31import org.onosproject.net.flow.TrafficTreatment;
Charles Chan384aea22018-08-23 22:08:02 -070032import org.onosproject.net.flow.criteria.Criterion;
33import org.onosproject.net.flow.criteria.EthCriterion;
Yi Tseng0b809722017-11-03 10:23:26 -070034import org.onosproject.net.flowobjective.DefaultForwardingObjective;
35import org.onosproject.net.flowobjective.ForwardingObjective;
36import org.onosproject.net.group.GroupDescription;
37import org.onosproject.net.pi.model.PiTableId;
38import org.onosproject.net.pi.runtime.PiAction;
39import org.onosproject.net.pi.runtime.PiActionParam;
40import org.onosproject.pipelines.fabric.FabricConstants;
41
42import java.util.List;
43
44import static org.junit.Assert.assertEquals;
45import static org.junit.Assert.assertTrue;
46
47/**
48 * Test cases for fabric.p4 pipeline forwarding control block.
49 */
50public class FabricForwardingPipelineTest extends FabricPipelinerTest {
51
52 /**
53 * Test versatile flag of forwarding objective with ARP match.
54 */
55 @Test
56 public void testAclArp() {
57 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
58 .wipeDeferred()
59 .punt()
60 .build();
61 // ARP
62 TrafficSelector selector = DefaultTrafficSelector.builder()
63 .matchEthType(Ethernet.TYPE_ARP)
64 .build();
65 ForwardingObjective fwd = DefaultForwardingObjective.builder()
66 .withSelector(selector)
67 .withPriority(PRIORITY)
68 .fromApp(APP_ID)
69 .makePermanent()
70 .withFlag(ForwardingObjective.Flag.VERSATILE)
71 .withTreatment(treatment)
72 .add();
73
74 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
75
76 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
77 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
78 assertEquals(1, flowRulesInstalled.size());
79 assertTrue(groupsInstalled.isEmpty());
80
81 FlowRule actualFlowRule = flowRulesInstalled.get(0);
82 FlowRule expectedFlowRule = DefaultFlowRule.builder()
83 .forDevice(DEVICE_ID)
Yi Tseng43ee7e82018-04-12 16:37:34 +080084 .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -070085 .withPriority(PRIORITY)
86 .makePermanent()
87 .withSelector(selector)
88 .withTreatment(treatment)
89 .fromApp(APP_ID)
90 .build();
91
92 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
93 }
94
95 /**
96 * Test versatile flag of forwarding objective with DHCP match.
97 */
98 @Test
99 public void testAclDhcp() {
100 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
101 .wipeDeferred()
102 .punt()
103 .build();
104 // DHCP
105 TrafficSelector selector = DefaultTrafficSelector.builder()
106 .matchEthType(Ethernet.TYPE_IPV4)
107 .matchIPProtocol(IPv4.PROTOCOL_UDP)
108 .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
109 .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
110 .build();
111 ForwardingObjective fwd = DefaultForwardingObjective.builder()
112 .withSelector(selector)
113 .withPriority(PRIORITY)
114 .fromApp(APP_ID)
115 .makePermanent()
116 .withFlag(ForwardingObjective.Flag.VERSATILE)
117 .withTreatment(treatment)
118 .add();
119
120 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
121
122 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
123 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
124 assertEquals(1, flowRulesInstalled.size());
125 assertTrue(groupsInstalled.isEmpty());
126
127 FlowRule actualFlowRule = flowRulesInstalled.get(0);
128 FlowRule expectedFlowRule = DefaultFlowRule.builder()
129 .forDevice(DEVICE_ID)
Yi Tseng43ee7e82018-04-12 16:37:34 +0800130 .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -0700131 .withPriority(PRIORITY)
132 .makePermanent()
133 .withSelector(selector)
134 .withTreatment(treatment)
135 .fromApp(APP_ID)
136 .build();
137
138 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
139 }
140
141 /**
142 * Test programming L2 unicast rule to bridging table.
143 */
144 @Test
145 public void testL2Unicast() {
146 TrafficSelector selector = DefaultTrafficSelector.builder()
147 .matchVlanId(VLAN_100)
148 .matchEthDst(HOST_MAC)
149 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800150 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
Charles Chan384aea22018-08-23 22:08:02 -0700151 buildExpectedSelector(selector), selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700152 }
153
154 @Test
155 public void testL2Broadcast() {
156 TrafficSelector selector = DefaultTrafficSelector.builder()
157 .matchVlanId(VLAN_100)
158 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800159 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
160 selector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700161 }
162
163 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700164 public void testIPv4Unicast() {
165 TrafficSelector selector = DefaultTrafficSelector.builder()
166 .matchEthType(Ethernet.TYPE_IPV4)
167 .matchIPDst(IPV4_UNICAST_ADDR)
168 .build();
169 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
170 .matchIPDst(IPV4_UNICAST_ADDR)
171 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700172 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800173 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700174 }
175
176 @Test
Yi Tsengdf3eec52018-02-15 14:56:02 -0800177 public void testIPv4UnicastWithNoNextId() {
178 TrafficSelector selector = DefaultTrafficSelector.builder()
179 .matchEthType(Ethernet.TYPE_IPV4)
180 .matchIPDst(IPV4_UNICAST_ADDR)
181 .build();
182 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
183 .matchIPDst(IPV4_UNICAST_ADDR)
184 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700185 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800186 expectedSelector, selector, null);
Yi Tsengdf3eec52018-02-15 14:56:02 -0800187 }
188
189 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700190 @Ignore
191 public void testIPv4Multicast() {
192 TrafficSelector selector = DefaultTrafficSelector.builder()
193 .matchEthType(Ethernet.TYPE_IPV4)
194 .matchVlanId(VLAN_100)
195 .matchIPDst(IPV4_MCAST_ADDR)
196 .build();
197 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
198 .matchIPDst(IPV4_MCAST_ADDR)
199 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700200 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800201 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700202 }
203
204 @Test
205 @Ignore
206 public void testIPv6Unicast() {
207 TrafficSelector selector = DefaultTrafficSelector.builder()
208 .matchEthType(Ethernet.TYPE_IPV6)
209 .matchIPDst(IPV6_UNICAST_ADDR)
210 .build();
211 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
212 .matchIPDst(IPV6_UNICAST_ADDR)
213 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700214 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800215 expectedSelector, selector, NEXT_ID_1);
216
Yi Tseng0b809722017-11-03 10:23:26 -0700217 }
218
219 @Test
220 @Ignore
221 public void testIPv6Multicast() {
222 TrafficSelector selector = DefaultTrafficSelector.builder()
223 .matchEthType(Ethernet.TYPE_IPV6)
224 .matchVlanId(VLAN_100)
225 .matchIPDst(IPV6_MCAST_ADDR)
226 .build();
227 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
228 .matchIPDst(IPV6_MCAST_ADDR)
229 .build();
Charles Chan384aea22018-08-23 22:08:02 -0700230 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6,
Yi Tseng43ee7e82018-04-12 16:37:34 +0800231 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700232 }
233
234 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700235 public void testMpls() {
Yi Tseng1b154bd2017-11-20 17:48:19 -0800236 TrafficSelector selector = DefaultTrafficSelector.builder()
237 .matchEthType(Ethernet.MPLS_UNICAST)
238 .matchMplsLabel(MPLS_10)
239 .matchMplsBos(true)
240 .build();
241 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
242 .matchMplsLabel(MPLS_10)
243 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700244
Charles Chanea89a1c2018-08-13 13:14:18 -0700245 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, NEXT_ID_1);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800246 PiAction setNextIdAction = PiAction.builder()
Yi Tseng43ee7e82018-04-12 16:37:34 +0800247 .withId(FabricConstants.FABRIC_INGRESS_FORWARDING_POP_MPLS_AND_NEXT)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800248 .withParameter(nextIdParam)
249 .build();
250 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
251 .piTableAction(setNextIdAction)
252 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800253 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_MPLS,
254 expectedSelector, selector, NEXT_ID_1, treatment);
Yi Tseng0b809722017-11-03 10:23:26 -0700255 }
256
257 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
258 TrafficSelector selector, Integer nextId) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800259 TrafficTreatment setNextIdTreatment;
260 if (nextId == null) {
261 // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
262 setNextIdTreatment = DefaultTrafficTreatment.builder().build();
263 } else {
Charles Chanea89a1c2018-08-13 13:14:18 -0700264 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, nextId);
Yi Tseng47eac892018-07-11 02:17:04 +0800265 PiAction.Builder setNextIdAction = PiAction.builder()
266 .withParameter(nextIdParam);
267
268 if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING)) {
269 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_BRIDGING);
Charles Chan384aea22018-08-23 22:08:02 -0700270 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4)) {
271 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ROUTING_V4);
272 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V6)) {
273 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ROUTING_V6);
Yi Tseng47eac892018-07-11 02:17:04 +0800274 }
275
Yi Tsengdf3eec52018-02-15 14:56:02 -0800276 setNextIdTreatment = DefaultTrafficTreatment.builder()
Yi Tseng47eac892018-07-11 02:17:04 +0800277 .piTableAction(setNextIdAction.build())
Yi Tsengdf3eec52018-02-15 14:56:02 -0800278 .build();
279 }
Yi Tseng1b154bd2017-11-20 17:48:19 -0800280
281 testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
282
283 }
284
285 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
286 TrafficSelector selector, Integer nextId, TrafficTreatment treatment) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800287 ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
Yi Tseng0b809722017-11-03 10:23:26 -0700288 .withSelector(selector)
289 .withPriority(PRIORITY)
290 .fromApp(APP_ID)
291 .makePermanent()
Yi Tsengdf3eec52018-02-15 14:56:02 -0800292 .withTreatment(treatment)
293 .withFlag(ForwardingObjective.Flag.SPECIFIC);
Yi Tseng0b809722017-11-03 10:23:26 -0700294
Yi Tsengdf3eec52018-02-15 14:56:02 -0800295 if (nextId != null) {
296 fwd.nextStep(nextId);
297 }
298
299 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd.add());
Yi Tseng0b809722017-11-03 10:23:26 -0700300
301 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
302 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
303 assertEquals(1, flowRulesInstalled.size());
304 assertTrue(groupsInstalled.isEmpty());
305
306 FlowRule actualFlowRule = flowRulesInstalled.get(0);
Yi Tseng0b809722017-11-03 10:23:26 -0700307
308 FlowRule expectedFlowRule = DefaultFlowRule.builder()
309 .forDevice(DEVICE_ID)
310 .forTable(expectedTableId)
311 .withPriority(PRIORITY)
312 .makePermanent()
313 .withSelector(expectedSelector)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800314 .withTreatment(treatment)
Yi Tseng0b809722017-11-03 10:23:26 -0700315 .fromApp(APP_ID)
316 .build();
317
318 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
319 }
Charles Chan384aea22018-08-23 22:08:02 -0700320
321 private TrafficSelector buildExpectedSelector(TrafficSelector selector) {
322 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
323 selector.criteria().forEach(c -> {
324 if (c.type() == Criterion.Type.ETH_DST) {
325 sbuilder.matchEthDstMasked(((EthCriterion) c).mac(), MacAddress.EXACT_MASK);
326 } else {
327 sbuilder.add(c);
328 }
329 });
330 return sbuilder.build();
331 }
Yi Tseng0b809722017-11-03 10:23:26 -0700332}