blob: 77bb0351db9f232bfb98dc8db2198d43e1768b73 [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;
23import org.onlab.packet.TpPort;
24import org.onlab.packet.UDP;
Yi Tseng0b809722017-11-03 10:23:26 -070025import org.onosproject.net.flow.DefaultFlowRule;
26import org.onosproject.net.flow.DefaultTrafficSelector;
27import org.onosproject.net.flow.DefaultTrafficTreatment;
28import org.onosproject.net.flow.FlowRule;
29import org.onosproject.net.flow.TrafficSelector;
30import org.onosproject.net.flow.TrafficTreatment;
31import org.onosproject.net.flowobjective.DefaultForwardingObjective;
32import org.onosproject.net.flowobjective.ForwardingObjective;
33import org.onosproject.net.group.GroupDescription;
34import org.onosproject.net.pi.model.PiTableId;
35import org.onosproject.net.pi.runtime.PiAction;
36import org.onosproject.net.pi.runtime.PiActionParam;
37import org.onosproject.pipelines.fabric.FabricConstants;
38
39import java.util.List;
40
41import static org.junit.Assert.assertEquals;
42import static org.junit.Assert.assertTrue;
43
44/**
45 * Test cases for fabric.p4 pipeline forwarding control block.
46 */
47public class FabricForwardingPipelineTest extends FabricPipelinerTest {
48
49 /**
50 * Test versatile flag of forwarding objective with ARP match.
51 */
52 @Test
53 public void testAclArp() {
54 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
55 .wipeDeferred()
56 .punt()
57 .build();
58 // ARP
59 TrafficSelector selector = DefaultTrafficSelector.builder()
60 .matchEthType(Ethernet.TYPE_ARP)
61 .build();
62 ForwardingObjective fwd = DefaultForwardingObjective.builder()
63 .withSelector(selector)
64 .withPriority(PRIORITY)
65 .fromApp(APP_ID)
66 .makePermanent()
67 .withFlag(ForwardingObjective.Flag.VERSATILE)
68 .withTreatment(treatment)
69 .add();
70
71 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
72
73 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
74 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
75 assertEquals(1, flowRulesInstalled.size());
76 assertTrue(groupsInstalled.isEmpty());
77
78 FlowRule actualFlowRule = flowRulesInstalled.get(0);
79 FlowRule expectedFlowRule = DefaultFlowRule.builder()
80 .forDevice(DEVICE_ID)
Yi Tseng43ee7e82018-04-12 16:37:34 +080081 .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -070082 .withPriority(PRIORITY)
83 .makePermanent()
84 .withSelector(selector)
85 .withTreatment(treatment)
86 .fromApp(APP_ID)
87 .build();
88
89 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
90 }
91
92 /**
93 * Test versatile flag of forwarding objective with DHCP match.
94 */
95 @Test
96 public void testAclDhcp() {
97 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
98 .wipeDeferred()
99 .punt()
100 .build();
101 // DHCP
102 TrafficSelector selector = DefaultTrafficSelector.builder()
103 .matchEthType(Ethernet.TYPE_IPV4)
104 .matchIPProtocol(IPv4.PROTOCOL_UDP)
105 .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
106 .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
107 .build();
108 ForwardingObjective fwd = DefaultForwardingObjective.builder()
109 .withSelector(selector)
110 .withPriority(PRIORITY)
111 .fromApp(APP_ID)
112 .makePermanent()
113 .withFlag(ForwardingObjective.Flag.VERSATILE)
114 .withTreatment(treatment)
115 .add();
116
117 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
118
119 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
120 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
121 assertEquals(1, flowRulesInstalled.size());
122 assertTrue(groupsInstalled.isEmpty());
123
124 FlowRule actualFlowRule = flowRulesInstalled.get(0);
125 FlowRule expectedFlowRule = DefaultFlowRule.builder()
126 .forDevice(DEVICE_ID)
Yi Tseng43ee7e82018-04-12 16:37:34 +0800127 .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_ACL)
Yi Tseng0b809722017-11-03 10:23:26 -0700128 .withPriority(PRIORITY)
129 .makePermanent()
130 .withSelector(selector)
131 .withTreatment(treatment)
132 .fromApp(APP_ID)
133 .build();
134
135 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
136 }
137
138 /**
139 * Test programming L2 unicast rule to bridging table.
140 */
141 @Test
142 public void testL2Unicast() {
143 TrafficSelector selector = DefaultTrafficSelector.builder()
144 .matchVlanId(VLAN_100)
145 .matchEthDst(HOST_MAC)
146 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800147 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
148 selector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700149 }
150
151 @Test
152 public void testL2Broadcast() {
153 TrafficSelector selector = DefaultTrafficSelector.builder()
154 .matchVlanId(VLAN_100)
155 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800156 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING,
157 selector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700158 }
159
160 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700161 public void testIPv4Unicast() {
162 TrafficSelector selector = DefaultTrafficSelector.builder()
163 .matchEthType(Ethernet.TYPE_IPV4)
164 .matchIPDst(IPV4_UNICAST_ADDR)
165 .build();
166 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
167 .matchIPDst(IPV4_UNICAST_ADDR)
168 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800169 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V4,
170 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700171 }
172
173 @Test
Yi Tsengdf3eec52018-02-15 14:56:02 -0800174 public void testIPv4UnicastWithNoNextId() {
175 TrafficSelector selector = DefaultTrafficSelector.builder()
176 .matchEthType(Ethernet.TYPE_IPV4)
177 .matchIPDst(IPV4_UNICAST_ADDR)
178 .build();
179 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
180 .matchIPDst(IPV4_UNICAST_ADDR)
181 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800182 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V4,
183 expectedSelector, selector, null);
Yi Tsengdf3eec52018-02-15 14:56:02 -0800184 }
185
186 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700187 @Ignore
188 public void testIPv4Multicast() {
189 TrafficSelector selector = DefaultTrafficSelector.builder()
190 .matchEthType(Ethernet.TYPE_IPV4)
191 .matchVlanId(VLAN_100)
192 .matchIPDst(IPV4_MCAST_ADDR)
193 .build();
194 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
195 .matchIPDst(IPV4_MCAST_ADDR)
196 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800197 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V4,
198 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700199 }
200
201 @Test
202 @Ignore
203 public void testIPv6Unicast() {
204 TrafficSelector selector = DefaultTrafficSelector.builder()
205 .matchEthType(Ethernet.TYPE_IPV6)
206 .matchIPDst(IPV6_UNICAST_ADDR)
207 .build();
208 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
209 .matchIPDst(IPV6_UNICAST_ADDR)
210 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800211 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V6,
212 expectedSelector, selector, NEXT_ID_1);
213
Yi Tseng0b809722017-11-03 10:23:26 -0700214 }
215
216 @Test
217 @Ignore
218 public void testIPv6Multicast() {
219 TrafficSelector selector = DefaultTrafficSelector.builder()
220 .matchEthType(Ethernet.TYPE_IPV6)
221 .matchVlanId(VLAN_100)
222 .matchIPDst(IPV6_MCAST_ADDR)
223 .build();
224 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
225 .matchIPDst(IPV6_MCAST_ADDR)
226 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800227 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V6,
228 expectedSelector, selector, NEXT_ID_1);
Yi Tseng0b809722017-11-03 10:23:26 -0700229 }
230
231 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700232 public void testMpls() {
Yi Tseng1b154bd2017-11-20 17:48:19 -0800233 TrafficSelector selector = DefaultTrafficSelector.builder()
234 .matchEthType(Ethernet.MPLS_UNICAST)
235 .matchMplsLabel(MPLS_10)
236 .matchMplsBos(true)
237 .build();
238 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
239 .matchMplsLabel(MPLS_10)
240 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700241
Charles Chanea89a1c2018-08-13 13:14:18 -0700242 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, NEXT_ID_1);
Yi Tseng1b154bd2017-11-20 17:48:19 -0800243 PiAction setNextIdAction = PiAction.builder()
Yi Tseng43ee7e82018-04-12 16:37:34 +0800244 .withId(FabricConstants.FABRIC_INGRESS_FORWARDING_POP_MPLS_AND_NEXT)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800245 .withParameter(nextIdParam)
246 .build();
247 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
248 .piTableAction(setNextIdAction)
249 .build();
Yi Tseng43ee7e82018-04-12 16:37:34 +0800250 testSpecificForward(FabricConstants.FABRIC_INGRESS_FORWARDING_MPLS,
251 expectedSelector, selector, NEXT_ID_1, treatment);
Yi Tseng0b809722017-11-03 10:23:26 -0700252 }
253
254 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
255 TrafficSelector selector, Integer nextId) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800256 TrafficTreatment setNextIdTreatment;
257 if (nextId == null) {
258 // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
259 setNextIdTreatment = DefaultTrafficTreatment.builder().build();
260 } else {
Charles Chanea89a1c2018-08-13 13:14:18 -0700261 PiActionParam nextIdParam = new PiActionParam(FabricConstants.NEXT_ID, nextId);
Yi Tseng47eac892018-07-11 02:17:04 +0800262 PiAction.Builder setNextIdAction = PiAction.builder()
263 .withParameter(nextIdParam);
264
265 if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING)) {
266 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_BRIDGING);
267 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V4)) {
268 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_UNICAST_V4);
269 } else if (expectedTableId.equals(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V6)) {
270 setNextIdAction.withId(FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_UNICAST_V6);
271 }
272
Yi Tsengdf3eec52018-02-15 14:56:02 -0800273 setNextIdTreatment = DefaultTrafficTreatment.builder()
Yi Tseng47eac892018-07-11 02:17:04 +0800274 .piTableAction(setNextIdAction.build())
Yi Tsengdf3eec52018-02-15 14:56:02 -0800275 .build();
276 }
Yi Tseng1b154bd2017-11-20 17:48:19 -0800277
278 testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
279
280 }
281
282 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
283 TrafficSelector selector, Integer nextId, TrafficTreatment treatment) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800284 ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
Yi Tseng0b809722017-11-03 10:23:26 -0700285 .withSelector(selector)
286 .withPriority(PRIORITY)
287 .fromApp(APP_ID)
288 .makePermanent()
Yi Tsengdf3eec52018-02-15 14:56:02 -0800289 .withTreatment(treatment)
290 .withFlag(ForwardingObjective.Flag.SPECIFIC);
Yi Tseng0b809722017-11-03 10:23:26 -0700291
Yi Tsengdf3eec52018-02-15 14:56:02 -0800292 if (nextId != null) {
293 fwd.nextStep(nextId);
294 }
295
296 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd.add());
Yi Tseng0b809722017-11-03 10:23:26 -0700297
298 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
299 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
300 assertEquals(1, flowRulesInstalled.size());
301 assertTrue(groupsInstalled.isEmpty());
302
303 FlowRule actualFlowRule = flowRulesInstalled.get(0);
Yi Tseng0b809722017-11-03 10:23:26 -0700304
305 FlowRule expectedFlowRule = DefaultFlowRule.builder()
306 .forDevice(DEVICE_ID)
307 .forTable(expectedTableId)
308 .withPriority(PRIORITY)
309 .makePermanent()
310 .withSelector(expectedSelector)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800311 .withTreatment(treatment)
Yi Tseng0b809722017-11-03 10:23:26 -0700312 .fromApp(APP_ID)
313 .build();
314
315 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
316 }
317}