blob: 5e52dde93a7d6af62ff45947364a82e5e6682bbb [file] [log] [blame]
pierventre4b72c472020-05-22 09:42:31 -07001/*
2 * Copyright 2020-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.driver.traceable;
18
19import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Lists;
21import org.onlab.packet.VlanId;
22import org.onosproject.core.DefaultApplicationId;
23import org.onosproject.core.GroupId;
24import org.onosproject.driver.extensions.Ofdpa3MplsType;
25import org.onosproject.driver.extensions.Ofdpa3SetMplsType;
26import org.onosproject.driver.pipeline.ofdpa.OfdpaPipelineUtility;
27import org.onosproject.driver.pipeline.ofdpa.OvsOfdpaPipeline;
28import org.onosproject.net.DataPlaneEntity;
29import org.onosproject.net.flow.DefaultFlowEntry;
30import org.onosproject.net.flow.DefaultTrafficSelector;
31import org.onosproject.net.flow.DefaultTrafficTreatment;
32import org.onosproject.net.flow.FlowEntry;
33import org.onosproject.net.flow.FlowRule;
34import org.onosproject.net.flow.TrafficSelector;
35import org.onosproject.net.flow.TrafficTreatment;
36import org.onosproject.net.group.DefaultGroup;
37import org.onosproject.net.group.DefaultGroupBucket;
38import org.onosproject.net.group.Group;
39import org.onosproject.net.group.GroupBucket;
40import org.onosproject.net.group.GroupBuckets;
41
42import java.util.List;
43
44import static org.onlab.packet.EthType.EtherType.ARP;
45import static org.onlab.packet.EthType.EtherType.IPV4;
46import static org.onlab.packet.EthType.EtherType.LLDP;
47import static org.onlab.packet.EthType.EtherType.MPLS_UNICAST;
48import static org.onosproject.driver.traceable.TraceableTestObjects.*;
49import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.ARP_OFDPA;
50import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.ARP_OVS_OFDPA;
51import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_NOT_ORDERED_OFDPA;
52import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_NOT_ORDERED_OVS_OFDPA;
53import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_UNTAG_OFDPA;
54import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_UNTAG_OVS_OFDPA;
55import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_EMPTY_OFDPA;
56import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_EMPTY_OVS_OFDPA;
57import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_UNTAG_OFDPA;
58import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_UNTAG_OVS_OFDPA;
59import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_ECMP_OFDPA;
60import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_ECMP_OVS_OFDPA;
61import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_UCAST_UNTAG_OFDPA;
62import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_UCAST_UNTAG_OVS_OFDPA;
63import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.MPLS_ECMP_OFDPA;
64import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.MPLS_ECMP_OVS_OFDPA;
65import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_IP_OFDPA;
66import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_IP_OVS_OFDPA;
67import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_LLDP_OFDPA;
68import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_LLDP_OVS_OFDPA;
69
70/**
71 * Helper class for dataplane objects related to the Traceable tests.
72 */
73final class TraceableDataPlaneObjects {
74
75 private TraceableDataPlaneObjects() {
76 // Banning construction
77 }
78
79 // Groups
80 private static final GroupId L2_FLOOD_GROUP_ID = GroupId.valueOf(0x40140000);
81
82 private static final GroupId PUNT_GROUP_ID = GroupId.valueOf(OvsOfdpaPipeline.POP_VLAN_PUNT_GROUP_ID);
83 private static final TrafficTreatment PUNT_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
84 .popVlan()
85 .punt()
86 .build();
87 private static final GroupBucket PUNT_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
88 PUNT_BUCKET_TREATMENT);
89 private static final GroupBuckets PUNT_BUCKETS = new GroupBuckets(ImmutableList.of(PUNT_BUCKET));
90 private static final Group PUNT_GROUP = new DefaultGroup(PUNT_GROUP_ID, OFDPA_DEVICE,
91 Group.Type.INDIRECT, PUNT_BUCKETS);
92
93 private static final GroupId L2_IFACE_GROUP_ID = GroupId.valueOf(0x140000 | (int) OUT_PORT.toLong());
94 private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
95 .popVlan()
96 .setOutput(OUT_PORT)
97 .build();
98 private static final GroupBucket L2_IFACE_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
99 L2_IFACE_BUCKET_TREATMENT);
100 private static final GroupBuckets L2_IFACE_BUCKETS = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET));
101 private static final Group L2_IFACE_GROUP = new DefaultGroup(L2_IFACE_GROUP_ID, OFDPA_DEVICE,
102 Group.Type.INDIRECT, L2_IFACE_BUCKETS);
103
104 private static final GroupId L2_IFACE_GROUP_ID_1 = GroupId.valueOf(0x140000 | (int) PORT.toLong());
105 private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
106 .popVlan()
107 .setOutput(PORT)
108 .build();
109 private static final GroupBucket L2_IFACE_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket(
110 L2_IFACE_BUCKET_TREATMENT_1);
111 private static final GroupBuckets L2_IFACE_BUCKETS_1 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_1));
112 private static final Group L2_IFACE_GROUP_1 = new DefaultGroup(L2_IFACE_GROUP_ID_1, OFDPA_DEVICE,
113 Group.Type.INDIRECT, L2_IFACE_BUCKETS_1);
114
115 private static final GroupId L2_IFACE_GROUP_ID_2 = GroupId.valueOf(0xffe000 | (int) UP_PORT.toLong());
116 private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_2 = DefaultTrafficTreatment.builder()
117 .popVlan()
118 .setOutput(UP_PORT)
119 .build();
120 private static final GroupBucket L2_IFACE_BUCKET_2 = DefaultGroupBucket.createIndirectGroupBucket(
121 L2_IFACE_BUCKET_TREATMENT_2);
122 private static final GroupBuckets L2_IFACE_BUCKETS_2 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_2));
123 private static final Group L2_IFACE_GROUP_2 = new DefaultGroup(L2_IFACE_GROUP_ID_2, OFDPA_DEVICE,
124 Group.Type.INDIRECT, L2_IFACE_BUCKETS_2);
125
126 private static final GroupId L2_IFACE_GROUP_ID_3 = GroupId.valueOf(0xffe000 | (int) UP_PORT_1.toLong());
127 private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_3 = DefaultTrafficTreatment.builder()
128 .popVlan()
129 .setOutput(UP_PORT_1)
130 .build();
131 private static final GroupBucket L2_IFACE_BUCKET_3 = DefaultGroupBucket.createIndirectGroupBucket(
132 L2_IFACE_BUCKET_TREATMENT_3);
133 private static final GroupBuckets L2_IFACE_BUCKETS_3 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_3));
134 private static final Group L2_IFACE_GROUP_3 = new DefaultGroup(L2_IFACE_GROUP_ID_3, OFDPA_DEVICE,
135 Group.Type.INDIRECT, L2_IFACE_BUCKETS_3);
136
137 private static final GroupId L2_IFACE_GROUP_ID_NOT_ORDERED = GroupId.valueOf(0x140000 | (int) OUT_PORT.toLong());
138 private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_NOT_ORDERED = DefaultTrafficTreatment.builder()
139 .setOutput(OUT_PORT)
140 .popVlan()
141 .build();
142 private static final GroupBucket L2_IFACE_BUCKET_NOT_ORDERED = DefaultGroupBucket.createIndirectGroupBucket(
143 L2_IFACE_BUCKET_TREATMENT_NOT_ORDERED);
144 private static final GroupBuckets L2_IFACE_BUCKETS_NOT_ORDERED = new GroupBuckets(ImmutableList.of(
145 L2_IFACE_BUCKET_NOT_ORDERED));
146 private static final Group L2_IFACE_GROUP_NOT_ORDERED = new DefaultGroup(L2_IFACE_GROUP_ID_NOT_ORDERED,
147 OFDPA_DEVICE, Group.Type.INDIRECT, L2_IFACE_BUCKETS_NOT_ORDERED);
148
149 private static final TrafficTreatment L2_FLOOD_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
150 .group(L2_IFACE_GROUP_ID)
151 .build();
152 private static final GroupBucket L2_FLOOD_BUCKET = DefaultGroupBucket.createAllGroupBucket(
153 L2_FLOOD_BUCKET_TREATMENT);
154 private static final TrafficTreatment L2_FLOOD_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
155 .group(L2_IFACE_GROUP_ID_1)
156 .build();
157 private static final GroupBucket L2_FLOOD_BUCKET_1 = DefaultGroupBucket.createAllGroupBucket(
158 L2_FLOOD_BUCKET_TREATMENT_1);
159 private static final GroupBuckets L2_FLOOD_BUCKETS = new GroupBuckets(ImmutableList.of(
160 L2_FLOOD_BUCKET, L2_FLOOD_BUCKET_1));
161 private static final Group L2_FLOOD_GROUP = new DefaultGroup(L2_FLOOD_GROUP_ID, OFDPA_DEVICE,
162 Group.Type.ALL, L2_FLOOD_BUCKETS);
163
164 private static final GroupBuckets L2_FLOOD_EMPTY_BUCKETS = new GroupBuckets(ImmutableList.of());
165 private static final Group L2_FLOOD_EMPTY_GROUP = new DefaultGroup(L2_FLOOD_GROUP_ID, OFDPA_DEVICE,
166 Group.Type.ALL, L2_FLOOD_EMPTY_BUCKETS);
167
168 private static final GroupId L3_UCAST_GROUP_ID = GroupId.valueOf(0x20000026);
169 private static final TrafficTreatment L3_UCAST_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
170 .setEthSrc(LEAF_MAC)
171 .setEthDst(HOST_MAC)
172 .setVlanId(HOST_VLAN)
173 .group(L2_IFACE_GROUP_ID)
174 .build();
175 private static final GroupBucket L3_UCAST_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
176 L3_UCAST_BUCKET_TREATMENT);
177 private static final GroupBuckets L3_UCAST_BUCKETS = new GroupBuckets(ImmutableList.of(L3_UCAST_BUCKET));
178 private static final Group L3_UCAST_GROUP = new DefaultGroup(L3_UCAST_GROUP_ID, OFDPA_DEVICE,
179 Group.Type.INDIRECT, L3_UCAST_BUCKETS);
180
181 private static final GroupId L3_UCAST_GROUP_ID_1 = GroupId.valueOf(0x20000027);
182 private static final TrafficTreatment L3_UCAST_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
183 .setEthSrc(LEAF_MAC)
184 .setEthDst(SPINE_MAC)
185 .setVlanId(DEFAULT_VLAN)
186 .group(L2_IFACE_GROUP_ID_3)
187 .build();
188 private static final GroupBucket L3_UCAST_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket(
189 L3_UCAST_BUCKET_TREATMENT_1);
190 private static final GroupBuckets L3_UCAST_BUCKETS_1 = new GroupBuckets(ImmutableList.of(L3_UCAST_BUCKET_1));
191 private static final Group L3_UCAST_GROUP_1 = new DefaultGroup(L3_UCAST_GROUP_ID_1, OFDPA_DEVICE,
192 Group.Type.INDIRECT, L3_UCAST_BUCKETS_1);
193
194 private static final GroupId MPLS_IFACE_GROUP_ID = GroupId.valueOf(0x9000000c);
195 private static final TrafficTreatment MPLS_IFACE_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
196 .setEthSrc(LEAF_MAC)
197 .setEthDst(SPINE_MAC)
198 .setVlanId(DEFAULT_VLAN)
199 .group(L2_IFACE_GROUP_ID_2)
200 .build();
201 private static final GroupBucket MPLS_IFACE_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
202 MPLS_IFACE_BUCKET_TREATMENT);
203 private static final GroupBuckets MPLS_IFACE_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_IFACE_BUCKET));
204 private static final Group MPLS_IFACE_GROUP = new DefaultGroup(MPLS_IFACE_GROUP_ID, OFDPA_DEVICE,
205 Group.Type.INDIRECT, MPLS_IFACE_BUCKETS);
206
207 private static final GroupId MPLS_IFACE_GROUP_ID_1 = GroupId.valueOf(0x9000000d);
208 private static final TrafficTreatment MPLS_IFACE_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
209 .setEthSrc(LEAF_MAC)
210 .setEthDst(SPINE_MAC_1)
211 .setVlanId(DEFAULT_VLAN)
212 .group(L2_IFACE_GROUP_ID_3)
213 .build();
214 private static final GroupBucket MPLS_IFACE_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket(
215 MPLS_IFACE_BUCKET_TREATMENT_1);
216 private static final GroupBuckets MPLS_IFACE_BUCKETS_1 = new GroupBuckets(ImmutableList.of(MPLS_IFACE_BUCKET_1));
217 private static final Group MPLS_IFACE_GROUP_1 = new DefaultGroup(MPLS_IFACE_GROUP_ID_1, OFDPA_DEVICE,
218 Group.Type.INDIRECT, MPLS_IFACE_BUCKETS_1);
219
220 private static final GroupId MPLS_L3VPN_GROUP_ID = GroupId.valueOf(0x9200000d);
221 private static final TrafficTreatment MPLS_L3VPN_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
222 .popVlan()
223 .pushMpls()
224 .setMpls(MPLS_LABEL)
225 .group(MPLS_IFACE_GROUP_ID)
226 .pushVlan()
227 .setVlanId(VlanId.vlanId(VlanId.RESERVED))
228 .build();
229 private static final GroupBucket MPLS_L3VPN_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
230 MPLS_L3VPN_BUCKET_TREATMENT);
231 private static final GroupBuckets MPLS_L3VPN_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_L3VPN_BUCKET));
232 private static final Group MPLS_L3VPN_GROUP = new DefaultGroup(MPLS_L3VPN_GROUP_ID, OFDPA_DEVICE,
233 Group.Type.INDIRECT, MPLS_L3VPN_BUCKETS);
234
235 private static final GroupId MPLS_L3VPN_GROUP_ID_1 = GroupId.valueOf(0x9200000e);
236 private static final TrafficTreatment MPLS_L3VPN_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
237 .popVlan()
238 .pushMpls()
239 .setMpls(MPLS_LABEL)
240 .group(MPLS_IFACE_GROUP_ID_1)
241 .pushVlan()
242 .setVlanId(VlanId.vlanId(VlanId.RESERVED))
243 .build();
244 private static final GroupBucket MPLS_L3VPN_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket(
245 MPLS_L3VPN_BUCKET_TREATMENT_1);
246 private static final GroupBuckets MPLS_L3VPN_BUCKETS_1 = new GroupBuckets(ImmutableList.of(MPLS_L3VPN_BUCKET_1));
247 private static final Group MPLS_L3VPN_GROUP_1 = new DefaultGroup(MPLS_L3VPN_GROUP_ID_1, OFDPA_DEVICE,
248 Group.Type.INDIRECT, MPLS_L3VPN_BUCKETS_1);
249
250 private static final TrafficTreatment MPLS_L3VPN_OFDPA_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
251 .pushMpls()
252 .setMpls(MPLS_LABEL)
253 .group(MPLS_IFACE_GROUP_ID)
254 .copyTtlOut()
255 .setMplsBos(true)
256 .build();
257 private static final GroupBucket MPLS_L3VPN_OFDPA_BUCKET = DefaultGroupBucket.createIndirectGroupBucket(
258 MPLS_L3VPN_OFDPA_BUCKET_TREATMENT);
259 private static final GroupBuckets MPLS_L3VPN_OFDPA_BUCKETS = new GroupBuckets(ImmutableList.of(
260 MPLS_L3VPN_OFDPA_BUCKET));
261 private static final Group MPLS_L3VPN_OFDPA_GROUP = new DefaultGroup(MPLS_L3VPN_GROUP_ID, OFDPA_DEVICE,
262 Group.Type.INDIRECT, MPLS_L3VPN_OFDPA_BUCKETS);
263
264 private static final TrafficTreatment MPLS_L3VPN_OFDPA_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
265 .pushMpls()
266 .setMpls(MPLS_LABEL)
267 .group(MPLS_IFACE_GROUP_ID_1)
268 .copyTtlOut()
269 .setMplsBos(true)
270 .build();
271 private static final GroupBucket MPLS_L3VPN_OFDPA_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket(
272 MPLS_L3VPN_OFDPA_BUCKET_TREATMENT_1);
273 private static final GroupBuckets MPLS_L3VPN_OFDPA_BUCKETS_1 = new GroupBuckets(ImmutableList.of(
274 MPLS_L3VPN_OFDPA_BUCKET_1));
275 private static final Group MPLS_L3VPN_OFDPA_GROUP_1 = new DefaultGroup(MPLS_L3VPN_GROUP_ID_1, OFDPA_DEVICE,
276 Group.Type.INDIRECT, MPLS_L3VPN_OFDPA_BUCKETS_1);
277
278 private static final GroupId L3_ECMP_GROUP_ID = GroupId.valueOf(0x7000000e);
279 private static final TrafficTreatment L3_ECMP_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
280 .group(MPLS_L3VPN_GROUP_ID)
281 .build();
282 private static final GroupBucket L3_ECMP_BUCKET = DefaultGroupBucket.createSelectGroupBucket(
283 L3_ECMP_BUCKET_TREATMENT);
284 private static final TrafficTreatment L3_ECMP_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
285 .group(MPLS_L3VPN_GROUP_ID_1)
286 .build();
287 private static final GroupBucket L3_ECMP_BUCKET_1 = DefaultGroupBucket.createSelectGroupBucket(
288 L3_ECMP_BUCKET_TREATMENT_1);
289 private static final GroupBuckets L3_ECMP_BUCKETS = new GroupBuckets(ImmutableList.of(L3_ECMP_BUCKET,
290 L3_ECMP_BUCKET_1));
291 private static final Group L3_ECMP_GROUP = new DefaultGroup(L3_ECMP_GROUP_ID, OFDPA_DEVICE,
292 Group.Type.SELECT, L3_ECMP_BUCKETS);
293
294 private static final TrafficTreatment L3_ECMP_OFDPA_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
295 .group(MPLS_L3VPN_GROUP_ID)
296 .build();
297 private static final GroupBucket L3_ECMP_OFDPA_BUCKET = DefaultGroupBucket.createSelectGroupBucket(
298 L3_ECMP_OFDPA_BUCKET_TREATMENT);
299 private static final TrafficTreatment L3_ECMP_OFDPA_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder()
300 .group(MPLS_L3VPN_GROUP_ID_1)
301 .build();
302 private static final GroupBucket L3_ECMP_OFDPA_BUCKET_1 = DefaultGroupBucket.createSelectGroupBucket(
303 L3_ECMP_OFDPA_BUCKET_TREATMENT_1);
304 private static final GroupBuckets L3_ECMP_OFDPA_BUCKETS = new GroupBuckets(ImmutableList.of(L3_ECMP_OFDPA_BUCKET,
305 L3_ECMP_OFDPA_BUCKET_1));
306 private static final Group L3_ECMP_OFDPA_GROUP = new DefaultGroup(L3_ECMP_GROUP_ID, OFDPA_DEVICE,
307 Group.Type.SELECT, L3_ECMP_OFDPA_BUCKETS);
308
309 private static final GroupId MPLS_ECMP_GROUP_ID = GroupId.valueOf(0x7000000f);
310 private static final TrafficTreatment MPLS_ECMP_BUCKET_TREATMENT = DefaultTrafficTreatment.builder()
311 .group(L3_UCAST_GROUP_ID_1)
312 .build();
313 private static final GroupBucket MPLS_ECMP_BUCKET = DefaultGroupBucket.createSelectGroupBucket(
314 MPLS_ECMP_BUCKET_TREATMENT);
315 private static final GroupBuckets MPLS_ECMP_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_ECMP_BUCKET));
316 private static final Group MPLS_ECMP_GROUP = new DefaultGroup(MPLS_ECMP_GROUP_ID, OFDPA_DEVICE,
317 Group.Type.SELECT, MPLS_ECMP_BUCKETS);
318
319 // Flows
320 private static final TrafficSelector EMPTY_SELECTOR = DefaultTrafficSelector.emptySelector();
321 private static final TrafficTreatment EMPTY_TREATMENT = DefaultTrafficTreatment.emptyTreatment();
322
323 private static final TrafficTreatment TABLE_0_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
324 .transition(OfdpaPipelineUtility.VLAN_TABLE)
325 .build();
326 private static final FlowRule TABLE_0_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
327 .forTable(OfdpaPipelineUtility.PORT_TABLE)
328 .withPriority(0)
329 .withSelector(EMPTY_SELECTOR)
330 .withTreatment(TABLE_0_FLOW_TREATMENT)
331 .fromApp(new DefaultApplicationId(0, "TestApp"))
332 .makePermanent()
333 .build();
334 private static final FlowEntry TABLE_0_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_0_MISS_OVS);
335
336 private static final TrafficSelector TABLE_10_FLOW_SELECTOR = DefaultTrafficSelector.builder()
337 .matchInPort(PORT)
338 .matchVlanId(VlanId.NONE)
339 .build();
340 private static final TrafficTreatment TABLE_10_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
341 .pushVlan()
342 .setVlanId(HOST_VLAN)
343 .transition(OfdpaPipelineUtility.TMAC_TABLE)
344 .build();
345 private static final FlowRule TABLE_10_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
346 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
347 .withPriority(32768)
348 .withSelector(TABLE_10_FLOW_SELECTOR)
349 .withTreatment(TABLE_10_FLOW_TREATMENT)
350 .fromApp(new DefaultApplicationId(0, "TestApp"))
351 .makePermanent()
352 .build();
353 private static final FlowEntry TABLE_10_FLOW_ENTRY = new DefaultFlowEntry(TABLE_10_FLOW);
354
355 private static final TrafficTreatment TABLE_10_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder()
356 .setVlanId(HOST_VLAN)
357 .transition(OfdpaPipelineUtility.TMAC_TABLE)
358 .build();
359 private static final FlowRule TABLE_10_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
360 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
361 .withPriority(32768)
362 .withSelector(TABLE_10_FLOW_SELECTOR)
363 .withTreatment(TABLE_10_FLOW_TREATMENT_1)
364 .fromApp(new DefaultApplicationId(0, "TestApp"))
365 .makePermanent()
366 .build();
367 private static final FlowEntry TABLE_10_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_10_FLOW_1);
368
369 private static final TrafficSelector TABLE_10_FLOW_SELECTOR_2 = DefaultTrafficSelector.builder()
370 .matchInPort(PORT)
371 .matchVlanId(HOST_VLAN)
372 .build();
373 private static final TrafficTreatment TABLE_10_FLOW_TREATMENT_2 = DefaultTrafficTreatment.builder()
374 .transition(OfdpaPipelineUtility.TMAC_TABLE)
375 .build();
376 private static final FlowRule TABLE_10_FLOW_2 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
377 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
378 .withPriority(32768)
379 .withSelector(TABLE_10_FLOW_SELECTOR_2)
380 .withTreatment(TABLE_10_FLOW_TREATMENT_2)
381 .fromApp(new DefaultApplicationId(0, "TestApp"))
382 .makePermanent()
383 .build();
384 private static final FlowEntry TABLE_10_FLOW_ENTRY_2 = new DefaultFlowEntry(TABLE_10_FLOW_2);
385
386 private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR = DefaultTrafficSelector.builder()
387 .matchInPort(UP_PORT)
388 .matchVlanId(VlanId.NONE)
389 .build();
390 private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
391 .pushVlan()
392 .setVlanId(DEFAULT_VLAN)
393 .transition(OfdpaPipelineUtility.TMAC_TABLE)
394 .build();
395 private static final FlowRule TABLE_10_DEFAULT_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
396 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
397 .withPriority(32768)
398 .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR)
399 .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT)
400 .fromApp(new DefaultApplicationId(0, "TestApp"))
401 .makePermanent()
402 .build();
403 private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW);
404
405 private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR_1 = DefaultTrafficSelector.builder()
406 .matchInPort(UP_PORT)
407 .matchVlanId(VlanId.NONE)
408 .build();
409 private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder()
410 .setVlanId(DEFAULT_VLAN)
411 .transition(OfdpaPipelineUtility.TMAC_TABLE)
412 .build();
413 private static final FlowRule TABLE_10_DEFAULT_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
414 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
415 .withPriority(32768)
416 .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR_1)
417 .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT_1)
418 .fromApp(new DefaultApplicationId(0, "TestApp"))
419 .makePermanent()
420 .build();
421 private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW_1);
422
423 private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR_2 = DefaultTrafficSelector.builder()
424 .matchInPort(UP_PORT)
425 .matchVlanId(DEFAULT_VLAN)
426 .build();
427 private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT_2 = DefaultTrafficTreatment.builder()
428 .transition(OfdpaPipelineUtility.TMAC_TABLE)
429 .build();
430 private static final FlowRule TABLE_10_DEFAULT_FLOW_2 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
431 .forTable(OfdpaPipelineUtility.VLAN_TABLE)
432 .withPriority(32768)
433 .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR_2)
434 .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT_2)
435 .fromApp(new DefaultApplicationId(0, "TestApp"))
436 .makePermanent()
437 .build();
438 private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY_2 = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW_2);
439
440 private static final TrafficTreatment TABLE_20_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
441 .transition(OfdpaPipelineUtility.BRIDGING_TABLE)
442 .build();
443 private static final FlowRule TABLE_20_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
444 .forTable(OfdpaPipelineUtility.TMAC_TABLE)
445 .withPriority(0)
446 .withSelector(EMPTY_SELECTOR)
447 .withTreatment(TABLE_20_FLOW_TREATMENT)
448 .fromApp(new DefaultApplicationId(0, "TestApp"))
449 .makePermanent()
450 .build();
451 private static final FlowEntry TABLE_20_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_20_MISS_OVS);
452
453 private static final TrafficSelector TABLE_20_IPV4_FLOW_SELECTOR = DefaultTrafficSelector.builder()
454 .matchInPort(UP_PORT)
455 .matchEthDst(LEAF_MAC)
456 .matchEthType(IPV4.ethType().toShort())
457 .matchVlanId(DEFAULT_VLAN)
458 .build();
459 private static final TrafficTreatment TABLE_20_IPV4_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
460 .transition(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE)
461 .build();
462 private static final FlowRule TABLE_20_IPV4_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
463 .forTable(OfdpaPipelineUtility.TMAC_TABLE)
464 .withPriority(32768)
465 .withSelector(TABLE_20_IPV4_FLOW_SELECTOR)
466 .withTreatment(TABLE_20_IPV4_FLOW_TREATMENT)
467 .fromApp(new DefaultApplicationId(0, "TestApp"))
468 .makePermanent()
469 .build();
470 private static final FlowEntry TABLE_20_IPV4_FLOW_ENTRY = new DefaultFlowEntry(TABLE_20_IPV4_FLOW);
471
472 private static final TrafficSelector TABLE_20_IPV4_FLOW_SELECTOR_1 = DefaultTrafficSelector.builder()
473 .matchInPort(PORT)
474 .matchEthDst(LEAF_MAC)
475 .matchEthType(IPV4.ethType().toShort())
476 .matchVlanId(HOST_VLAN)
477 .build();
478 private static final TrafficTreatment TABLE_20_IPV4_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder()
479 .transition(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE)
480 .build();
481 private static final FlowRule TABLE_20_IPV4_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
482 .forTable(OfdpaPipelineUtility.TMAC_TABLE)
483 .withPriority(32768)
484 .withSelector(TABLE_20_IPV4_FLOW_SELECTOR_1)
485 .withTreatment(TABLE_20_IPV4_FLOW_TREATMENT_1)
486 .fromApp(new DefaultApplicationId(0, "TestApp"))
487 .makePermanent()
488 .build();
489 private static final FlowEntry TABLE_20_IPV4_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_20_IPV4_FLOW_1);
490
491 private static final TrafficSelector TABLE_20_MPLS_FLOW_SELECTOR = DefaultTrafficSelector.builder()
492 .matchInPort(UP_PORT)
493 .matchEthDst(LEAF_MAC)
494 .matchEthType(MPLS_UNICAST.ethType().toShort())
495 .matchVlanId(DEFAULT_VLAN)
496 .build();
497 private static final TrafficTreatment TABLE_20_MPLS_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
498 .transition(OfdpaPipelineUtility.MPLS_TABLE_0)
499 .build();
500 private static final FlowRule TABLE_20_MPLS_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
501 .forTable(OfdpaPipelineUtility.TMAC_TABLE)
502 .withPriority(32768)
503 .withSelector(TABLE_20_MPLS_FLOW_SELECTOR)
504 .withTreatment(TABLE_20_MPLS_FLOW_TREATMENT)
505 .fromApp(new DefaultApplicationId(0, "TestApp"))
506 .makePermanent()
507 .build();
508 private static final FlowEntry TABLE_20_MPLS_FLOW_ENTRY = new DefaultFlowEntry(TABLE_20_MPLS_FLOW);
509
510 private static final TrafficTreatment TABLE_23_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
511 .transition(OfdpaPipelineUtility.MPLS_TABLE_1)
512 .build();
513 private static final FlowRule TABLE_23_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
514 .forTable(OfdpaPipelineUtility.MPLS_TABLE_0)
515 .withPriority(0)
516 .withSelector(EMPTY_SELECTOR)
517 .withTreatment(TABLE_23_FLOW_TREATMENT)
518 .fromApp(new DefaultApplicationId(0, "TestApp"))
519 .makePermanent()
520 .build();
521 private static final FlowEntry TABLE_23_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_23_MISS_OVS);
522
523 private static final TrafficSelector TABLE_24_MPLS_FLOW_SELECTOR = DefaultTrafficSelector.builder()
524 .matchEthType(MPLS_UNICAST.ethType().toShort())
525 .matchMplsLabel(MPLS_LABEL)
526 .matchMplsBos(true)
527 .build();
528 private static final TrafficTreatment TABLE_24_MPLS_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
529 .transition(OfdpaPipelineUtility.ACL_TABLE)
530 .deferred()
531 .popMpls(IPV4.ethType())
532 .decMplsTtl()
533 .group(MPLS_ECMP_GROUP_ID)
534 .build();
535 private static final FlowRule TABLE_24_MPLS_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
536 .forTable(OfdpaPipelineUtility.MPLS_TABLE_1)
537 .withPriority(100)
538 .withSelector(TABLE_24_MPLS_FLOW_SELECTOR)
539 .withTreatment(TABLE_24_MPLS_FLOW_TREATMENT)
540 .fromApp(new DefaultApplicationId(0, "TestApp"))
541 .makePermanent()
542 .build();
543 private static final FlowEntry TABLE_24_MPLS_FLOW_ENTRY = new DefaultFlowEntry(TABLE_24_MPLS_FLOW);
544
545 private static final TrafficTreatment TABLE_24_MPLS_FLOW_TREATMENT_OFDPA = DefaultTrafficTreatment.builder()
546 .transition(OfdpaPipelineUtility.MPLS_L3_TYPE_TABLE)
547 .copyTtlIn()
548 .decMplsTtl()
549 .extension(new Ofdpa3SetMplsType(Ofdpa3MplsType.L3_PHP), OFDPA_DEVICE)
550 .deferred()
551 .group(MPLS_ECMP_GROUP_ID)
552 .build();
553 private static final FlowRule TABLE_24_MPLS_FLOW_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
554 .forTable(OfdpaPipelineUtility.MPLS_TABLE_1)
555 .withPriority(100)
556 .withSelector(TABLE_24_MPLS_FLOW_SELECTOR)
557 .withTreatment(TABLE_24_MPLS_FLOW_TREATMENT_OFDPA)
558 .fromApp(new DefaultApplicationId(0, "TestApp"))
559 .makePermanent()
560 .build();
561 private static final FlowEntry TABLE_24_MPLS_FLOW_ENTRY_OFDPA = new DefaultFlowEntry(TABLE_24_MPLS_FLOW_OFDPA);
562
563 private static final TrafficSelector TABLE_30_UNI_FLOW_SELECTOR = DefaultTrafficSelector.builder()
564 .matchEthType(IPV4.ethType().toShort())
565 .matchIPDst(IP_DST)
566 .build();
567 private static final TrafficTreatment TABLE_30_UNI_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
568 .deferred()
569 .group(L3_UCAST_GROUP_ID)
570 .transition(OfdpaPipelineUtility.ACL_TABLE)
571 .build();
572 private static final FlowRule TABLE_30_UNI_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
573 .forTable(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE)
574 .withPriority(64010)
575 .withSelector(TABLE_30_UNI_FLOW_SELECTOR)
576 .withTreatment(TABLE_30_UNI_FLOW_TREATMENT)
577 .fromApp(new DefaultApplicationId(0, "TestApp"))
578 .makePermanent()
579 .build();
580 private static final FlowEntry TABLE_30_UNI_FLOW_ENTRY = new DefaultFlowEntry(TABLE_30_UNI_FLOW);
581
582 private static final TrafficSelector TABLE_30_ECMP_FLOW_SELECTOR = DefaultTrafficSelector.builder()
583 .matchEthType(IPV4.ethType().toShort())
584 .matchIPDst(PREFIX_DST)
585 .build();
586 private static final TrafficTreatment TABLE_30_ECMP_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
587 .deferred()
588 .group(L3_ECMP_GROUP_ID)
589 .transition(OfdpaPipelineUtility.ACL_TABLE)
590 .build();
591 private static final FlowRule TABLE_30_ECMP_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
592 .forTable(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE)
593 .withPriority(48010)
594 .withSelector(TABLE_30_ECMP_FLOW_SELECTOR)
595 .withTreatment(TABLE_30_ECMP_FLOW_TREATMENT)
596 .fromApp(new DefaultApplicationId(0, "TestApp"))
597 .makePermanent()
598 .build();
599 private static final FlowEntry TABLE_30_ECMP_FLOW_ENTRY = new DefaultFlowEntry(TABLE_30_ECMP_FLOW);
600
601 private static final TrafficSelector TABLE_50_FLOW_SELECTOR = DefaultTrafficSelector.builder()
602 .matchVlanId(HOST_VLAN)
603 .build();
604 private static final TrafficTreatment TABLE_50_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
605 .deferred()
606 .group(L2_FLOOD_GROUP_ID)
607 .transition(OfdpaPipelineUtility.ACL_TABLE)
608 .build();
609 private static final FlowRule TABLE_50_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
610 .forTable(OfdpaPipelineUtility.BRIDGING_TABLE)
611 .withPriority(5)
612 .withSelector(TABLE_50_FLOW_SELECTOR)
613 .withTreatment(TABLE_50_FLOW_TREATMENT)
614 .fromApp(new DefaultApplicationId(0, "TestApp"))
615 .makePermanent()
616 .build();
617 private static final FlowEntry TABLE_50_FLOW_ENTRY = new DefaultFlowEntry(TABLE_50_FLOW);
618
619 private static final TrafficSelector TABLE_50_FLOW_SELECTOR_BRIDG = DefaultTrafficSelector.builder()
620 .matchVlanId(HOST_VLAN)
621 .matchEthDst(HOST_MAC)
622 .build();
623 private static final TrafficTreatment TABLE_50_FLOW_TREATMENT_BRIDG = DefaultTrafficTreatment.builder()
624 .deferred()
625 .group(L2_IFACE_GROUP_ID)
626 .transition(OfdpaPipelineUtility.ACL_TABLE)
627 .build();
628 private static final FlowRule TABLE_50_FLOW_BRIDG = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
629 .forTable(OfdpaPipelineUtility.BRIDGING_TABLE)
630 .withPriority(100)
631 .withSelector(TABLE_50_FLOW_SELECTOR_BRIDG)
632 .withTreatment(TABLE_50_FLOW_TREATMENT_BRIDG)
633 .fromApp(new DefaultApplicationId(0, "TestApp"))
634 .makePermanent()
635 .build();
636 private static final FlowEntry TABLE_50_FLOW_ENTRY_BRIDG = new DefaultFlowEntry(TABLE_50_FLOW_BRIDG);
637
638 private static final TrafficSelector TABLE_60_FLOW_SELECTOR = DefaultTrafficSelector.builder()
639 .matchEthType(IPV4.ethType().toShort())
640 .matchIPDst(IP_PUNT)
641 .build();
642 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_OVS = DefaultTrafficTreatment.builder()
643 .wipeDeferred()
644 .transition(OvsOfdpaPipeline.PUNT_TABLE)
645 .build();
646 private static final FlowRule TABLE_60_FLOW_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
647 .forTable(OfdpaPipelineUtility.ACL_TABLE)
648 .withPriority(40000)
649 .withSelector(TABLE_60_FLOW_SELECTOR)
650 .withTreatment(TABLE_60_FLOW_TREATMENT_OVS)
651 .fromApp(new DefaultApplicationId(0, "TestApp"))
652 .makePermanent()
653 .build();
654 private static final FlowEntry TABLE_60_FLOW_ENTRY = new DefaultFlowEntry(TABLE_60_FLOW_OVS);
655
656 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_OFDPA = DefaultTrafficTreatment.builder()
657 .wipeDeferred()
658 .punt()
659 .build();
660 private static final FlowRule TABLE_60_FLOW_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
661 .forTable(OfdpaPipelineUtility.ACL_TABLE)
662 .withPriority(40000)
663 .withSelector(TABLE_60_FLOW_SELECTOR)
664 .withTreatment(TABLE_60_FLOW_TREATMENT_OFDPA)
665 .fromApp(new DefaultApplicationId(0, "TestApp"))
666 .makePermanent()
667 .build();
668 private static final FlowEntry TABLE_60_FLOW_ENTRY_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_OFDPA);
669
670 private static final FlowRule TABLE_60_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
671 .forTable(OfdpaPipelineUtility.ACL_TABLE)
672 .withPriority(0)
673 .withSelector(EMPTY_SELECTOR)
674 .withTreatment(EMPTY_TREATMENT)
675 .fromApp(new DefaultApplicationId(0, "TestApp"))
676 .makePermanent()
677 .build();
678 private static final FlowEntry TABLE_60_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_60_MISS_OVS);
679
680 private static final TrafficSelector TABLE_60_FLOW_SELECTOR_ARP = DefaultTrafficSelector.builder()
681 .matchEthType(ARP.ethType().toShort())
682 .build();
683 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_ARP_OVS = DefaultTrafficTreatment.builder()
684 .transition(OvsOfdpaPipeline.PUNT_TABLE)
685 .build();
686 private static final FlowRule TABLE_60_FLOW_ARP_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
687 .forTable(OfdpaPipelineUtility.ACL_TABLE)
688 .withPriority(30000)
689 .withSelector(TABLE_60_FLOW_SELECTOR_ARP)
690 .withTreatment(TABLE_60_FLOW_TREATMENT_ARP_OVS)
691 .fromApp(new DefaultApplicationId(0, "TestApp"))
692 .makePermanent()
693 .build();
694 private static final FlowEntry TABLE_60_FLOW_ENTRY_ARP_OVS = new DefaultFlowEntry(TABLE_60_FLOW_ARP_OVS);
695
696 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_ARP_OFDPA = DefaultTrafficTreatment.builder()
697 .punt()
698 .build();
699 private static final FlowRule TABLE_60_FLOW_ARP_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
700 .forTable(OfdpaPipelineUtility.ACL_TABLE)
701 .withPriority(30000)
702 .withSelector(TABLE_60_FLOW_SELECTOR_ARP)
703 .withTreatment(TABLE_60_FLOW_TREATMENT_ARP_OFDPA)
704 .fromApp(new DefaultApplicationId(0, "TestApp"))
705 .makePermanent()
706 .build();
707 private static final FlowEntry TABLE_60_FLOW_ENTRY_ARP_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_ARP_OFDPA);
708
709 private static final TrafficSelector TABLE_60_FLOW_SELECTOR_LLDP = DefaultTrafficSelector.builder()
710 .matchEthType(LLDP.ethType().toShort())
711 .build();
712 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_LLDP = DefaultTrafficTreatment.builder()
713 .wipeDeferred()
714 .transition(OvsOfdpaPipeline.PUNT_TABLE)
715 .build();
716 private static final FlowRule TABLE_60_FLOW_LLDP = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
717 .forTable(OfdpaPipelineUtility.ACL_TABLE)
718 .withPriority(40000)
719 .withSelector(TABLE_60_FLOW_SELECTOR_LLDP)
720 .withTreatment(TABLE_60_FLOW_TREATMENT_LLDP)
721 .fromApp(new DefaultApplicationId(0, "TestApp"))
722 .makePermanent()
723 .build();
724 private static final FlowEntry TABLE_60_FLOW_ENTRY_LLDP = new DefaultFlowEntry(TABLE_60_FLOW_LLDP);
725
726 private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_LLDP_OFDPA = DefaultTrafficTreatment.builder()
727 .wipeDeferred()
728 .punt()
729 .build();
730 private static final FlowRule TABLE_60_FLOW_LLDP_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
731 .forTable(OfdpaPipelineUtility.ACL_TABLE)
732 .withPriority(40000)
733 .withSelector(TABLE_60_FLOW_SELECTOR_LLDP)
734 .withTreatment(TABLE_60_FLOW_TREATMENT_LLDP_OFDPA)
735 .fromApp(new DefaultApplicationId(0, "TestApp"))
736 .makePermanent()
737 .build();
738 private static final FlowEntry TABLE_60_FLOW_ENTRY_LLDP_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_LLDP_OFDPA);
739
740 private static final TrafficSelector TABLE_63_FLOW_SELECTOR = DefaultTrafficSelector.builder()
741 .matchInPort(OFDPA_CP.port())
742 .matchVlanId(HOST_VLAN)
743 .build();
744 private static final TrafficTreatment TABLE_63_FLOW_TREATMENT = DefaultTrafficTreatment.builder()
745 .group(GroupId.valueOf(OvsOfdpaPipeline.POP_VLAN_PUNT_GROUP_ID))
746 .build();
747 private static final FlowRule TABLE_63_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE)
748 .forTable(OvsOfdpaPipeline.PUNT_TABLE)
749 .withPriority(40000)
750 .withSelector(TABLE_63_FLOW_SELECTOR)
751 .withTreatment(TABLE_63_FLOW_TREATMENT)
752 .fromApp(new DefaultApplicationId(0, "TestApp"))
753 .makePermanent()
754 .build();
755 private static final FlowEntry TABLE_63_FLOW_ENTRY = new DefaultFlowEntry(TABLE_63_FLOW);
756
757 // Represents the device state
758 public static List<DataPlaneEntity> getDataPlaneEntities(String driverName, TraceableTest test) {
759 List<FlowEntry> flowRules = ImmutableList.of();
760 List<Group> groups = ImmutableList.of();
761 // Flow and groups by device
762 if (driverName.equals(OFDPA_DRIVER)) {
763 flowRules = ImmutableList.of(
764 // Vlan 1 table
765 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_10_DEFAULT_FLOW_ENTRY_1,
766 TABLE_10_DEFAULT_FLOW_ENTRY_2,
767 // TMAC table
768 TABLE_20_IPV4_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1, TABLE_20_MPLS_FLOW_ENTRY,
769 // MPLS 1 table
770 TABLE_24_MPLS_FLOW_ENTRY_OFDPA,
771 // Unicast table
772 TABLE_30_UNI_FLOW_ENTRY, TABLE_30_ECMP_FLOW_ENTRY,
773 // Bridging table
774 TABLE_50_FLOW_ENTRY, TABLE_50_FLOW_ENTRY_BRIDG,
775 // ACL table
776 TABLE_60_FLOW_ENTRY_OFDPA, TABLE_60_FLOW_ENTRY_ARP_OFDPA, TABLE_60_FLOW_ENTRY_LLDP_OFDPA);
777 groups = Lists.newArrayList(
778 // L3 ECMP groups
779 L3_ECMP_OFDPA_GROUP,
780 // MPLS ECMP groups
781 MPLS_ECMP_GROUP,
782 // L3 groups
783 L3_UCAST_GROUP, L3_UCAST_GROUP_1,
784 // MPLS L3 VPN groups
785 MPLS_L3VPN_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP_1,
786 // MPLS iface groups
787 MPLS_IFACE_GROUP, MPLS_IFACE_GROUP_1,
788 // L2 groups
789 L2_FLOOD_GROUP,
790 L2_IFACE_GROUP, L2_IFACE_GROUP_1, L2_IFACE_GROUP_2, L2_IFACE_GROUP_3);
791 } else if (driverName.equals(OVS_OFDPA_DRIVER)) {
792 flowRules = ImmutableList.of(
793 // Port table
794 TABLE_0_MISS_FLOW_ENTRY_OVS,
795 // Vlan 1 table
796 TABLE_10_FLOW_ENTRY, TABLE_10_DEFAULT_FLOW_ENTRY,
797 // TMAC table
798 TABLE_20_MISS_FLOW_ENTRY_OVS, TABLE_20_IPV4_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1,
799 TABLE_20_MPLS_FLOW_ENTRY,
800 // MPLS 0 table
801 TABLE_23_MISS_FLOW_ENTRY_OVS,
802 // MPLS 1 table
803 TABLE_24_MPLS_FLOW_ENTRY,
804 // Unicast table
805 TABLE_30_UNI_FLOW_ENTRY, TABLE_30_ECMP_FLOW_ENTRY,
806 // Bridging table
807 TABLE_50_FLOW_ENTRY, TABLE_50_FLOW_ENTRY_BRIDG,
808 // ACL table
809 TABLE_60_MISS_FLOW_ENTRY_OVS, TABLE_60_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS,
810 TABLE_60_FLOW_ENTRY_LLDP,
811 // Punt table
812 TABLE_63_FLOW_ENTRY);
813 groups = Lists.newArrayList(
814 // Punt groups
815 PUNT_GROUP,
816 // L3 ECMP groups
817 L3_ECMP_GROUP,
818 // MPLS ECMP groups
819 MPLS_ECMP_GROUP,
820 // L3 groups
821 L3_UCAST_GROUP, L3_UCAST_GROUP_1,
822 // MPLS L3 VPN groups
823 MPLS_L3VPN_GROUP, MPLS_L3VPN_GROUP_1,
824 // MPLS iface groups
825 MPLS_IFACE_GROUP, MPLS_IFACE_GROUP_1,
826 // L2 groups
827 L2_FLOOD_GROUP,
828 L2_IFACE_GROUP, L2_IFACE_GROUP_1, L2_IFACE_GROUP_2, L2_IFACE_GROUP_3);
829 }
830 // Inject failure scenarios
831 if (test.equals(L2_BROAD_EMPTY_OFDPA) || test.equals(L2_BROAD_EMPTY_OVS_OFDPA)) {
832 groups.remove(L2_FLOOD_GROUP);
833 groups.add(L2_FLOOD_EMPTY_GROUP);
834 } else if (test.equals(L2_BRIDG_NOT_ORDERED_OFDPA) || test.equals(L2_BRIDG_NOT_ORDERED_OVS_OFDPA)) {
835 groups.remove(L2_IFACE_GROUP);
836 groups.add(L2_IFACE_GROUP_NOT_ORDERED);
837 }
838 List<DataPlaneEntity> dataPlaneEntities = Lists.newArrayList();
839 flowRules.forEach(flowRule -> dataPlaneEntities.add(new DataPlaneEntity(flowRule)));
840 groups.forEach(group -> dataPlaneEntities.add(new DataPlaneEntity(group)));
841 return dataPlaneEntities;
842 }
843
844 // Returns the expected hit chains (order matters!)
845 public static List<List<DataPlaneEntity>> getHitChains(TraceableTest test) {
846 List<List<FlowEntry>> flowRules = Lists.newArrayList();
847 List<List<Group>> groups = Lists.newArrayList();
848 // Flows and groups by test
849 if (test.equals(PUNT_IP_OFDPA)) {
850 flowRules.add(ImmutableList.of(
851 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
852 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY));
853 } else if (test.equals(PUNT_IP_OVS_OFDPA)) {
854 flowRules.add(ImmutableList.of(
855 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
856 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY, TABLE_63_FLOW_ENTRY));
857 groups.add(ImmutableList.of(PUNT_GROUP));
858 } else if (test.equals(ARP_OFDPA)) {
859 flowRules.add(ImmutableList.of(
860 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
861 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA));
862 groups.add(ImmutableList.of());
863 flowRules.add(ImmutableList.of(
864 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
865 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA));
866 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP));
867 flowRules.add(ImmutableList.of(
868 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
869 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA));
870 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1));
871 } else if (test.equals(ARP_OVS_OFDPA)) {
872 flowRules.add(ImmutableList.of(
873 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
874 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY));
875 groups.add(ImmutableList.of(PUNT_GROUP));
876 flowRules.add(ImmutableList.of(
877 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
878 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY));
879 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP));
880 flowRules.add(ImmutableList.of(
881 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
882 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY));
883 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1));
884 } else if (test.equals(PUNT_LLDP_OFDPA)) {
885 flowRules.add(ImmutableList.of(
886 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
887 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_LLDP_OFDPA));
888 } else if (test.equals(PUNT_LLDP_OVS_OFDPA)) {
889 flowRules.add(ImmutableList.of(
890 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
891 TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_LLDP, TABLE_63_FLOW_ENTRY));
892 groups.add(ImmutableList.of(PUNT_GROUP));
893 } else if (test.equals(L2_BRIDG_UNTAG_OFDPA)) {
894 flowRules.add(ImmutableList.of(
895 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
896 TABLE_50_FLOW_ENTRY_BRIDG));
897 groups.add(ImmutableList.of(L2_IFACE_GROUP));
898 } else if (test.equals(L2_BRIDG_UNTAG_OVS_OFDPA)) {
899 flowRules.add(ImmutableList.of(
900 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
901 TABLE_50_FLOW_ENTRY_BRIDG, TABLE_60_MISS_FLOW_ENTRY_OVS));
902 groups.add(ImmutableList.of(L2_IFACE_GROUP));
903 } else if (test.equals(L2_BROAD_UNTAG_OFDPA)) {
904 flowRules.add(ImmutableList.of(
905 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
906 TABLE_50_FLOW_ENTRY));
907 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP));
908 flowRules.add(ImmutableList.of(
909 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
910 TABLE_50_FLOW_ENTRY));
911 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1));
912 } else if (test.equals(L2_BROAD_UNTAG_OVS_OFDPA)) {
913 flowRules.add(ImmutableList.of(
914 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
915 TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
916 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP));
917 flowRules.add(ImmutableList.of(
918 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
919 TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
920 groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1));
921 } else if (test.equals(L3_UCAST_UNTAG_OFDPA)) {
922 flowRules.add(ImmutableList.of(
923 TABLE_10_DEFAULT_FLOW_ENTRY_1, TABLE_10_DEFAULT_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY,
924 TABLE_30_UNI_FLOW_ENTRY));
925 groups.add(ImmutableList.of(L3_UCAST_GROUP, L2_IFACE_GROUP));
926 } else if (test.equals(L3_UCAST_UNTAG_OVS_OFDPA)) {
927 flowRules.add(ImmutableList.of(
928 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_DEFAULT_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY,
929 TABLE_30_UNI_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
930 groups.add(ImmutableList.of(L3_UCAST_GROUP, L2_IFACE_GROUP));
931 } else if (test.equals(L3_ECMP_OVS_OFDPA)) {
932 flowRules.add(ImmutableList.of(
933 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1,
934 TABLE_30_ECMP_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
935 groups.add(ImmutableList.of(L3_ECMP_GROUP, MPLS_L3VPN_GROUP, MPLS_IFACE_GROUP, L2_IFACE_GROUP_2));
936 flowRules.add(ImmutableList.of(
937 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1,
938 TABLE_30_ECMP_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
939 groups.add(ImmutableList.of(L3_ECMP_GROUP, MPLS_L3VPN_GROUP_1, MPLS_IFACE_GROUP_1, L2_IFACE_GROUP_3));
940 } else if (test.equals(L3_ECMP_OFDPA)) {
941 flowRules.add(ImmutableList.of(
942 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY_1,
943 TABLE_30_ECMP_FLOW_ENTRY));
944 groups.add(ImmutableList.of(L3_ECMP_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP, MPLS_IFACE_GROUP,
945 L2_IFACE_GROUP_2));
946 flowRules.add(ImmutableList.of(
947 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY_1,
948 TABLE_30_ECMP_FLOW_ENTRY));
949 groups.add(ImmutableList.of(L3_ECMP_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP_1, MPLS_IFACE_GROUP_1,
950 L2_IFACE_GROUP_3));
951 } else if (test.equals(MPLS_ECMP_OVS_OFDPA)) {
952 flowRules.add(ImmutableList.of(
953 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_DEFAULT_FLOW_ENTRY, TABLE_20_MPLS_FLOW_ENTRY,
954 TABLE_23_MISS_FLOW_ENTRY_OVS, TABLE_24_MPLS_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
955 groups.add(ImmutableList.of(MPLS_ECMP_GROUP, L3_UCAST_GROUP_1, L2_IFACE_GROUP_3));
956 } else if (test.equals(MPLS_ECMP_OFDPA)) {
957 flowRules.add(ImmutableList.of(
958 TABLE_10_DEFAULT_FLOW_ENTRY_1, TABLE_10_DEFAULT_FLOW_ENTRY_2, TABLE_20_MPLS_FLOW_ENTRY,
959 TABLE_24_MPLS_FLOW_ENTRY_OFDPA));
960 groups.add(ImmutableList.of(MPLS_ECMP_GROUP, L3_UCAST_GROUP_1, L2_IFACE_GROUP_3));
961 } else if (test.equals(L2_BROAD_EMPTY_OFDPA)) {
962 flowRules.add(ImmutableList.of(
963 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
964 TABLE_50_FLOW_ENTRY));
965 groups.add(ImmutableList.of(L2_FLOOD_EMPTY_GROUP));
966 } else if (test.equals(L2_BROAD_EMPTY_OVS_OFDPA)) {
967 flowRules.add(ImmutableList.of(
968 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
969 TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS));
970 groups.add(ImmutableList.of(L2_FLOOD_EMPTY_GROUP));
971 } else if (test.equals(L2_BRIDG_NOT_ORDERED_OFDPA)) {
972 flowRules.add(ImmutableList.of(
973 TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2,
974 TABLE_50_FLOW_ENTRY_BRIDG));
975 groups.add(ImmutableList.of(L2_IFACE_GROUP_NOT_ORDERED));
976 } else if (test.equals(L2_BRIDG_NOT_ORDERED_OVS_OFDPA)) {
977 flowRules.add(ImmutableList.of(
978 TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS,
979 TABLE_50_FLOW_ENTRY_BRIDG, TABLE_60_MISS_FLOW_ENTRY_OVS));
980 groups.add(ImmutableList.of(L2_IFACE_GROUP_NOT_ORDERED));
981 }
982 List<List<DataPlaneEntity>> chains = Lists.newArrayList();
983 List<DataPlaneEntity> dataPlaneEntities = Lists.newArrayList();
984 int end = Math.max(flowRules.size(), groups.size());
985 int i = 0;
986 while (i < end) {
987 if (i < flowRules.size()) {
988 flowRules.get(i).forEach(flowRule -> dataPlaneEntities.add(new DataPlaneEntity(flowRule)));
989 }
990 if (i < groups.size()) {
991 groups.get(i).forEach(group -> dataPlaneEntities.add(new DataPlaneEntity(group)));
992 }
993 chains.add(ImmutableList.copyOf(dataPlaneEntities));
994 dataPlaneEntities.clear();
995 i = i + 1;
996 }
997 return chains;
998 }
999
1000}