blob: c471ede9eca87ede27439aa5afa538187b68c050 [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;
25import org.onlab.util.ImmutableByteSequence;
26import 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;
32import org.onosproject.net.flowobjective.DefaultForwardingObjective;
33import org.onosproject.net.flowobjective.ForwardingObjective;
34import org.onosproject.net.group.GroupDescription;
35import org.onosproject.net.pi.model.PiTableId;
36import org.onosproject.net.pi.runtime.PiAction;
37import org.onosproject.net.pi.runtime.PiActionParam;
38import org.onosproject.pipelines.fabric.FabricConstants;
39
40import java.util.List;
41
42import static org.junit.Assert.assertEquals;
43import static org.junit.Assert.assertTrue;
44
45/**
46 * Test cases for fabric.p4 pipeline forwarding control block.
47 */
48public class FabricForwardingPipelineTest extends FabricPipelinerTest {
49
50 /**
51 * Test versatile flag of forwarding objective with ARP match.
52 */
53 @Test
54 public void testAclArp() {
55 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
56 .wipeDeferred()
57 .punt()
58 .build();
59 // ARP
60 TrafficSelector selector = DefaultTrafficSelector.builder()
61 .matchEthType(Ethernet.TYPE_ARP)
62 .build();
63 ForwardingObjective fwd = DefaultForwardingObjective.builder()
64 .withSelector(selector)
65 .withPriority(PRIORITY)
66 .fromApp(APP_ID)
67 .makePermanent()
68 .withFlag(ForwardingObjective.Flag.VERSATILE)
69 .withTreatment(treatment)
70 .add();
71
72 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
73
74 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
75 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
76 assertEquals(1, flowRulesInstalled.size());
77 assertTrue(groupsInstalled.isEmpty());
78
79 FlowRule actualFlowRule = flowRulesInstalled.get(0);
80 FlowRule expectedFlowRule = DefaultFlowRule.builder()
81 .forDevice(DEVICE_ID)
82 .forTable(FabricConstants.TBL_ACL_ID)
83 .withPriority(PRIORITY)
84 .makePermanent()
85 .withSelector(selector)
86 .withTreatment(treatment)
87 .fromApp(APP_ID)
88 .build();
89
90 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
91 }
92
93 /**
94 * Test versatile flag of forwarding objective with DHCP match.
95 */
96 @Test
97 public void testAclDhcp() {
98 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
99 .wipeDeferred()
100 .punt()
101 .build();
102 // DHCP
103 TrafficSelector selector = DefaultTrafficSelector.builder()
104 .matchEthType(Ethernet.TYPE_IPV4)
105 .matchIPProtocol(IPv4.PROTOCOL_UDP)
106 .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
107 .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
108 .build();
109 ForwardingObjective fwd = DefaultForwardingObjective.builder()
110 .withSelector(selector)
111 .withPriority(PRIORITY)
112 .fromApp(APP_ID)
113 .makePermanent()
114 .withFlag(ForwardingObjective.Flag.VERSATILE)
115 .withTreatment(treatment)
116 .add();
117
118 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
119
120 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
121 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
122 assertEquals(1, flowRulesInstalled.size());
123 assertTrue(groupsInstalled.isEmpty());
124
125 FlowRule actualFlowRule = flowRulesInstalled.get(0);
126 FlowRule expectedFlowRule = DefaultFlowRule.builder()
127 .forDevice(DEVICE_ID)
128 .forTable(FabricConstants.TBL_ACL_ID)
129 .withPriority(PRIORITY)
130 .makePermanent()
131 .withSelector(selector)
132 .withTreatment(treatment)
133 .fromApp(APP_ID)
134 .build();
135
136 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
137 }
138
139 /**
140 * Test programming L2 unicast rule to bridging table.
141 */
142 @Test
143 public void testL2Unicast() {
144 TrafficSelector selector = DefaultTrafficSelector.builder()
145 .matchVlanId(VLAN_100)
146 .matchEthDst(HOST_MAC)
147 .build();
148 testSpecificForward(FabricConstants.TBL_BRIDGING_ID, selector, selector, NEXT_ID_1);
149 }
150
151 @Test
152 public void testL2Broadcast() {
153 TrafficSelector selector = DefaultTrafficSelector.builder()
154 .matchVlanId(VLAN_100)
155 .build();
156 testSpecificForward(FabricConstants.TBL_BRIDGING_ID, selector, selector, NEXT_ID_1);
157 }
158
159 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700160 public void testIPv4Unicast() {
161 TrafficSelector selector = DefaultTrafficSelector.builder()
162 .matchEthType(Ethernet.TYPE_IPV4)
163 .matchIPDst(IPV4_UNICAST_ADDR)
164 .build();
165 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
166 .matchIPDst(IPV4_UNICAST_ADDR)
167 .build();
168 testSpecificForward(FabricConstants.TBL_UNICAST_V4_ID, expectedSelector, selector, NEXT_ID_1);
169 }
170
171 @Test
Yi Tsengdf3eec52018-02-15 14:56:02 -0800172 public void testIPv4UnicastWithNoNextId() {
173 TrafficSelector selector = DefaultTrafficSelector.builder()
174 .matchEthType(Ethernet.TYPE_IPV4)
175 .matchIPDst(IPV4_UNICAST_ADDR)
176 .build();
177 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
178 .matchIPDst(IPV4_UNICAST_ADDR)
179 .build();
180 testSpecificForward(FabricConstants.TBL_UNICAST_V4_ID, expectedSelector, selector, null);
181 }
182
183 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700184 @Ignore
185 public void testIPv4Multicast() {
186 TrafficSelector selector = DefaultTrafficSelector.builder()
187 .matchEthType(Ethernet.TYPE_IPV4)
188 .matchVlanId(VLAN_100)
189 .matchIPDst(IPV4_MCAST_ADDR)
190 .build();
191 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
192 .matchIPDst(IPV4_MCAST_ADDR)
193 .build();
194 testSpecificForward(FabricConstants.TBL_MULTICAST_V4_ID, expectedSelector, selector, NEXT_ID_1);
195 }
196
197 @Test
198 @Ignore
199 public void testIPv6Unicast() {
200 TrafficSelector selector = DefaultTrafficSelector.builder()
201 .matchEthType(Ethernet.TYPE_IPV6)
202 .matchIPDst(IPV6_UNICAST_ADDR)
203 .build();
204 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
205 .matchIPDst(IPV6_UNICAST_ADDR)
206 .build();
207 testSpecificForward(FabricConstants.TBL_UNICAST_V6_ID, expectedSelector, selector, NEXT_ID_1);
208 }
209
210 @Test
211 @Ignore
212 public void testIPv6Multicast() {
213 TrafficSelector selector = DefaultTrafficSelector.builder()
214 .matchEthType(Ethernet.TYPE_IPV6)
215 .matchVlanId(VLAN_100)
216 .matchIPDst(IPV6_MCAST_ADDR)
217 .build();
218 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
219 .matchIPDst(IPV6_MCAST_ADDR)
220 .build();
221 testSpecificForward(FabricConstants.TBL_MULTICAST_V6_ID, expectedSelector, selector, NEXT_ID_1);
222 }
223
224 @Test
Yi Tseng0b809722017-11-03 10:23:26 -0700225 public void testMpls() {
Yi Tseng1b154bd2017-11-20 17:48:19 -0800226 TrafficSelector selector = DefaultTrafficSelector.builder()
227 .matchEthType(Ethernet.MPLS_UNICAST)
228 .matchMplsLabel(MPLS_10)
229 .matchMplsBos(true)
230 .build();
231 TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
232 .matchMplsLabel(MPLS_10)
233 .build();
Yi Tseng0b809722017-11-03 10:23:26 -0700234
Yi Tseng1b154bd2017-11-20 17:48:19 -0800235 PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
236 ImmutableByteSequence.copyFrom(NEXT_ID_1.byteValue()));
237 PiAction setNextIdAction = PiAction.builder()
Yi Tseng27b9bc02018-04-12 14:52:40 +0800238 .withId(FabricConstants.ACT_FABRICINGRESS_FORWARDING_POP_MPLS_AND_NEXT_ID)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800239 .withParameter(nextIdParam)
240 .build();
241 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
242 .piTableAction(setNextIdAction)
243 .build();
244 testSpecificForward(FabricConstants.TBL_MPLS_ID, expectedSelector, selector, NEXT_ID_1, treatment);
Yi Tseng0b809722017-11-03 10:23:26 -0700245 }
246
247 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
248 TrafficSelector selector, Integer nextId) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800249 TrafficTreatment setNextIdTreatment;
250 if (nextId == null) {
251 // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
252 setNextIdTreatment = DefaultTrafficTreatment.builder().build();
253 } else {
254 PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
255 ImmutableByteSequence.copyFrom(nextId.byteValue()));
256 PiAction setNextIdAction = PiAction.builder()
Yi Tseng27b9bc02018-04-12 14:52:40 +0800257 .withId(FabricConstants.ACT_FABRICINGRESS_FORWARDING_SET_NEXT_ID_ID)
Yi Tsengdf3eec52018-02-15 14:56:02 -0800258 .withParameter(nextIdParam)
259 .build();
260 setNextIdTreatment = DefaultTrafficTreatment.builder()
261 .piTableAction(setNextIdAction)
262 .build();
263 }
Yi Tseng1b154bd2017-11-20 17:48:19 -0800264
265 testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
266
267 }
268
269 private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
270 TrafficSelector selector, Integer nextId, TrafficTreatment treatment) {
Yi Tsengdf3eec52018-02-15 14:56:02 -0800271 ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
Yi Tseng0b809722017-11-03 10:23:26 -0700272 .withSelector(selector)
273 .withPriority(PRIORITY)
274 .fromApp(APP_ID)
275 .makePermanent()
Yi Tsengdf3eec52018-02-15 14:56:02 -0800276 .withTreatment(treatment)
277 .withFlag(ForwardingObjective.Flag.SPECIFIC);
Yi Tseng0b809722017-11-03 10:23:26 -0700278
Yi Tsengdf3eec52018-02-15 14:56:02 -0800279 if (nextId != null) {
280 fwd.nextStep(nextId);
281 }
282
283 PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd.add());
Yi Tseng0b809722017-11-03 10:23:26 -0700284
285 List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
286 List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();
287 assertEquals(1, flowRulesInstalled.size());
288 assertTrue(groupsInstalled.isEmpty());
289
290 FlowRule actualFlowRule = flowRulesInstalled.get(0);
Yi Tseng0b809722017-11-03 10:23:26 -0700291
292 FlowRule expectedFlowRule = DefaultFlowRule.builder()
293 .forDevice(DEVICE_ID)
294 .forTable(expectedTableId)
295 .withPriority(PRIORITY)
296 .makePermanent()
297 .withSelector(expectedSelector)
Yi Tseng1b154bd2017-11-20 17:48:19 -0800298 .withTreatment(treatment)
Yi Tseng0b809722017-11-03 10:23:26 -0700299 .fromApp(APP_ID)
300 .build();
301
302 assertTrue(expectedFlowRule.exactMatch(actualFlowRule));
303 }
304}