| /* |
| * Copyright 2020-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onosproject.driver.traceable; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.Lists; |
| import org.onlab.packet.VlanId; |
| import org.onosproject.core.DefaultApplicationId; |
| import org.onosproject.core.GroupId; |
| import org.onosproject.driver.extensions.Ofdpa3MplsType; |
| import org.onosproject.driver.extensions.Ofdpa3SetMplsType; |
| import org.onosproject.driver.pipeline.ofdpa.OfdpaPipelineUtility; |
| import org.onosproject.driver.pipeline.ofdpa.OvsOfdpaPipeline; |
| import org.onosproject.net.DataPlaneEntity; |
| import org.onosproject.net.flow.DefaultFlowEntry; |
| import org.onosproject.net.flow.DefaultTrafficSelector; |
| import org.onosproject.net.flow.DefaultTrafficTreatment; |
| import org.onosproject.net.flow.FlowEntry; |
| import org.onosproject.net.flow.FlowRule; |
| import org.onosproject.net.flow.TrafficSelector; |
| import org.onosproject.net.flow.TrafficTreatment; |
| import org.onosproject.net.group.DefaultGroup; |
| import org.onosproject.net.group.DefaultGroupBucket; |
| import org.onosproject.net.group.Group; |
| import org.onosproject.net.group.GroupBucket; |
| import org.onosproject.net.group.GroupBuckets; |
| |
| import java.util.List; |
| |
| import static org.onlab.packet.EthType.EtherType.ARP; |
| import static org.onlab.packet.EthType.EtherType.IPV4; |
| import static org.onlab.packet.EthType.EtherType.LLDP; |
| import static org.onlab.packet.EthType.EtherType.MPLS_UNICAST; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.*; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.ARP_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.ARP_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_NOT_ORDERED_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_NOT_ORDERED_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_UNTAG_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BRIDG_UNTAG_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_EMPTY_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_EMPTY_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_UNTAG_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L2_BROAD_UNTAG_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_ECMP_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_ECMP_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_UCAST_UNTAG_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.L3_UCAST_UNTAG_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.MPLS_ECMP_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.MPLS_ECMP_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_IP_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_IP_OVS_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_LLDP_OFDPA; |
| import static org.onosproject.driver.traceable.TraceableTestObjects.TraceableTest.PUNT_LLDP_OVS_OFDPA; |
| |
| /** |
| * Helper class for dataplane objects related to the Traceable tests. |
| */ |
| final class TraceableDataPlaneObjects { |
| |
| private TraceableDataPlaneObjects() { |
| // Banning construction |
| } |
| |
| // Groups |
| private static final GroupId L2_FLOOD_GROUP_ID = GroupId.valueOf(0x40140000); |
| |
| private static final GroupId PUNT_GROUP_ID = GroupId.valueOf(OvsOfdpaPipeline.POP_VLAN_PUNT_GROUP_ID); |
| private static final TrafficTreatment PUNT_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .punt() |
| .build(); |
| private static final GroupBucket PUNT_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| PUNT_BUCKET_TREATMENT); |
| private static final GroupBuckets PUNT_BUCKETS = new GroupBuckets(ImmutableList.of(PUNT_BUCKET)); |
| private static final Group PUNT_GROUP = new DefaultGroup(PUNT_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, PUNT_BUCKETS); |
| |
| private static final GroupId L2_IFACE_GROUP_ID = GroupId.valueOf(0x140000 | (int) OUT_PORT.toLong()); |
| private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .setOutput(OUT_PORT) |
| .build(); |
| private static final GroupBucket L2_IFACE_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| L2_IFACE_BUCKET_TREATMENT); |
| private static final GroupBuckets L2_IFACE_BUCKETS = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET)); |
| private static final Group L2_IFACE_GROUP = new DefaultGroup(L2_IFACE_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L2_IFACE_BUCKETS); |
| |
| private static final GroupId L2_IFACE_GROUP_ID_1 = GroupId.valueOf(0x140000 | (int) PORT.toLong()); |
| private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .setOutput(PORT) |
| .build(); |
| private static final GroupBucket L2_IFACE_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket( |
| L2_IFACE_BUCKET_TREATMENT_1); |
| private static final GroupBuckets L2_IFACE_BUCKETS_1 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_1)); |
| private static final Group L2_IFACE_GROUP_1 = new DefaultGroup(L2_IFACE_GROUP_ID_1, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L2_IFACE_BUCKETS_1); |
| |
| private static final GroupId L2_IFACE_GROUP_ID_2 = GroupId.valueOf(0xffe000 | (int) UP_PORT.toLong()); |
| private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_2 = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .setOutput(UP_PORT) |
| .build(); |
| private static final GroupBucket L2_IFACE_BUCKET_2 = DefaultGroupBucket.createIndirectGroupBucket( |
| L2_IFACE_BUCKET_TREATMENT_2); |
| private static final GroupBuckets L2_IFACE_BUCKETS_2 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_2)); |
| private static final Group L2_IFACE_GROUP_2 = new DefaultGroup(L2_IFACE_GROUP_ID_2, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L2_IFACE_BUCKETS_2); |
| |
| private static final GroupId L2_IFACE_GROUP_ID_3 = GroupId.valueOf(0xffe000 | (int) UP_PORT_1.toLong()); |
| private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_3 = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .setOutput(UP_PORT_1) |
| .build(); |
| private static final GroupBucket L2_IFACE_BUCKET_3 = DefaultGroupBucket.createIndirectGroupBucket( |
| L2_IFACE_BUCKET_TREATMENT_3); |
| private static final GroupBuckets L2_IFACE_BUCKETS_3 = new GroupBuckets(ImmutableList.of(L2_IFACE_BUCKET_3)); |
| private static final Group L2_IFACE_GROUP_3 = new DefaultGroup(L2_IFACE_GROUP_ID_3, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L2_IFACE_BUCKETS_3); |
| |
| private static final GroupId L2_IFACE_GROUP_ID_NOT_ORDERED = GroupId.valueOf(0x140000 | (int) OUT_PORT.toLong()); |
| private static final TrafficTreatment L2_IFACE_BUCKET_TREATMENT_NOT_ORDERED = DefaultTrafficTreatment.builder() |
| .setOutput(OUT_PORT) |
| .popVlan() |
| .build(); |
| private static final GroupBucket L2_IFACE_BUCKET_NOT_ORDERED = DefaultGroupBucket.createIndirectGroupBucket( |
| L2_IFACE_BUCKET_TREATMENT_NOT_ORDERED); |
| private static final GroupBuckets L2_IFACE_BUCKETS_NOT_ORDERED = new GroupBuckets(ImmutableList.of( |
| L2_IFACE_BUCKET_NOT_ORDERED)); |
| private static final Group L2_IFACE_GROUP_NOT_ORDERED = new DefaultGroup(L2_IFACE_GROUP_ID_NOT_ORDERED, |
| OFDPA_DEVICE, Group.Type.INDIRECT, L2_IFACE_BUCKETS_NOT_ORDERED); |
| |
| private static final TrafficTreatment L2_FLOOD_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .group(L2_IFACE_GROUP_ID) |
| .build(); |
| private static final GroupBucket L2_FLOOD_BUCKET = DefaultGroupBucket.createAllGroupBucket( |
| L2_FLOOD_BUCKET_TREATMENT); |
| private static final TrafficTreatment L2_FLOOD_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .group(L2_IFACE_GROUP_ID_1) |
| .build(); |
| private static final GroupBucket L2_FLOOD_BUCKET_1 = DefaultGroupBucket.createAllGroupBucket( |
| L2_FLOOD_BUCKET_TREATMENT_1); |
| private static final GroupBuckets L2_FLOOD_BUCKETS = new GroupBuckets(ImmutableList.of( |
| L2_FLOOD_BUCKET, L2_FLOOD_BUCKET_1)); |
| private static final Group L2_FLOOD_GROUP = new DefaultGroup(L2_FLOOD_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.ALL, L2_FLOOD_BUCKETS); |
| |
| private static final GroupBuckets L2_FLOOD_EMPTY_BUCKETS = new GroupBuckets(ImmutableList.of()); |
| private static final Group L2_FLOOD_EMPTY_GROUP = new DefaultGroup(L2_FLOOD_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.ALL, L2_FLOOD_EMPTY_BUCKETS); |
| |
| private static final GroupId L3_UCAST_GROUP_ID = GroupId.valueOf(0x20000026); |
| private static final TrafficTreatment L3_UCAST_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .setEthSrc(LEAF_MAC) |
| .setEthDst(HOST_MAC) |
| .setVlanId(HOST_VLAN) |
| .group(L2_IFACE_GROUP_ID) |
| .build(); |
| private static final GroupBucket L3_UCAST_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| L3_UCAST_BUCKET_TREATMENT); |
| private static final GroupBuckets L3_UCAST_BUCKETS = new GroupBuckets(ImmutableList.of(L3_UCAST_BUCKET)); |
| private static final Group L3_UCAST_GROUP = new DefaultGroup(L3_UCAST_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L3_UCAST_BUCKETS); |
| |
| private static final GroupId L3_UCAST_GROUP_ID_1 = GroupId.valueOf(0x20000027); |
| private static final TrafficTreatment L3_UCAST_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .setEthSrc(LEAF_MAC) |
| .setEthDst(SPINE_MAC) |
| .setVlanId(DEFAULT_VLAN) |
| .group(L2_IFACE_GROUP_ID_3) |
| .build(); |
| private static final GroupBucket L3_UCAST_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket( |
| L3_UCAST_BUCKET_TREATMENT_1); |
| private static final GroupBuckets L3_UCAST_BUCKETS_1 = new GroupBuckets(ImmutableList.of(L3_UCAST_BUCKET_1)); |
| private static final Group L3_UCAST_GROUP_1 = new DefaultGroup(L3_UCAST_GROUP_ID_1, OFDPA_DEVICE, |
| Group.Type.INDIRECT, L3_UCAST_BUCKETS_1); |
| |
| private static final GroupId MPLS_IFACE_GROUP_ID = GroupId.valueOf(0x9000000c); |
| private static final TrafficTreatment MPLS_IFACE_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .setEthSrc(LEAF_MAC) |
| .setEthDst(SPINE_MAC) |
| .setVlanId(DEFAULT_VLAN) |
| .group(L2_IFACE_GROUP_ID_2) |
| .build(); |
| private static final GroupBucket MPLS_IFACE_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_IFACE_BUCKET_TREATMENT); |
| private static final GroupBuckets MPLS_IFACE_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_IFACE_BUCKET)); |
| private static final Group MPLS_IFACE_GROUP = new DefaultGroup(MPLS_IFACE_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_IFACE_BUCKETS); |
| |
| private static final GroupId MPLS_IFACE_GROUP_ID_1 = GroupId.valueOf(0x9000000d); |
| private static final TrafficTreatment MPLS_IFACE_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .setEthSrc(LEAF_MAC) |
| .setEthDst(SPINE_MAC_1) |
| .setVlanId(DEFAULT_VLAN) |
| .group(L2_IFACE_GROUP_ID_3) |
| .build(); |
| private static final GroupBucket MPLS_IFACE_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_IFACE_BUCKET_TREATMENT_1); |
| private static final GroupBuckets MPLS_IFACE_BUCKETS_1 = new GroupBuckets(ImmutableList.of(MPLS_IFACE_BUCKET_1)); |
| private static final Group MPLS_IFACE_GROUP_1 = new DefaultGroup(MPLS_IFACE_GROUP_ID_1, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_IFACE_BUCKETS_1); |
| |
| private static final GroupId MPLS_L3VPN_GROUP_ID = GroupId.valueOf(0x9200000d); |
| private static final TrafficTreatment MPLS_L3VPN_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .pushMpls() |
| .setMpls(MPLS_LABEL) |
| .group(MPLS_IFACE_GROUP_ID) |
| .pushVlan() |
| .setVlanId(VlanId.vlanId(VlanId.RESERVED)) |
| .build(); |
| private static final GroupBucket MPLS_L3VPN_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_L3VPN_BUCKET_TREATMENT); |
| private static final GroupBuckets MPLS_L3VPN_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_L3VPN_BUCKET)); |
| private static final Group MPLS_L3VPN_GROUP = new DefaultGroup(MPLS_L3VPN_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_L3VPN_BUCKETS); |
| |
| private static final GroupId MPLS_L3VPN_GROUP_ID_1 = GroupId.valueOf(0x9200000e); |
| private static final TrafficTreatment MPLS_L3VPN_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .popVlan() |
| .pushMpls() |
| .setMpls(MPLS_LABEL) |
| .group(MPLS_IFACE_GROUP_ID_1) |
| .pushVlan() |
| .setVlanId(VlanId.vlanId(VlanId.RESERVED)) |
| .build(); |
| private static final GroupBucket MPLS_L3VPN_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_L3VPN_BUCKET_TREATMENT_1); |
| private static final GroupBuckets MPLS_L3VPN_BUCKETS_1 = new GroupBuckets(ImmutableList.of(MPLS_L3VPN_BUCKET_1)); |
| private static final Group MPLS_L3VPN_GROUP_1 = new DefaultGroup(MPLS_L3VPN_GROUP_ID_1, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_L3VPN_BUCKETS_1); |
| |
| private static final TrafficTreatment MPLS_L3VPN_OFDPA_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .pushMpls() |
| .setMpls(MPLS_LABEL) |
| .group(MPLS_IFACE_GROUP_ID) |
| .copyTtlOut() |
| .setMplsBos(true) |
| .build(); |
| private static final GroupBucket MPLS_L3VPN_OFDPA_BUCKET = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_L3VPN_OFDPA_BUCKET_TREATMENT); |
| private static final GroupBuckets MPLS_L3VPN_OFDPA_BUCKETS = new GroupBuckets(ImmutableList.of( |
| MPLS_L3VPN_OFDPA_BUCKET)); |
| private static final Group MPLS_L3VPN_OFDPA_GROUP = new DefaultGroup(MPLS_L3VPN_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_L3VPN_OFDPA_BUCKETS); |
| |
| private static final TrafficTreatment MPLS_L3VPN_OFDPA_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .pushMpls() |
| .setMpls(MPLS_LABEL) |
| .group(MPLS_IFACE_GROUP_ID_1) |
| .copyTtlOut() |
| .setMplsBos(true) |
| .build(); |
| private static final GroupBucket MPLS_L3VPN_OFDPA_BUCKET_1 = DefaultGroupBucket.createIndirectGroupBucket( |
| MPLS_L3VPN_OFDPA_BUCKET_TREATMENT_1); |
| private static final GroupBuckets MPLS_L3VPN_OFDPA_BUCKETS_1 = new GroupBuckets(ImmutableList.of( |
| MPLS_L3VPN_OFDPA_BUCKET_1)); |
| private static final Group MPLS_L3VPN_OFDPA_GROUP_1 = new DefaultGroup(MPLS_L3VPN_GROUP_ID_1, OFDPA_DEVICE, |
| Group.Type.INDIRECT, MPLS_L3VPN_OFDPA_BUCKETS_1); |
| |
| private static final GroupId L3_ECMP_GROUP_ID = GroupId.valueOf(0x7000000e); |
| private static final TrafficTreatment L3_ECMP_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .group(MPLS_L3VPN_GROUP_ID) |
| .build(); |
| private static final GroupBucket L3_ECMP_BUCKET = DefaultGroupBucket.createSelectGroupBucket( |
| L3_ECMP_BUCKET_TREATMENT); |
| private static final TrafficTreatment L3_ECMP_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .group(MPLS_L3VPN_GROUP_ID_1) |
| .build(); |
| private static final GroupBucket L3_ECMP_BUCKET_1 = DefaultGroupBucket.createSelectGroupBucket( |
| L3_ECMP_BUCKET_TREATMENT_1); |
| private static final GroupBuckets L3_ECMP_BUCKETS = new GroupBuckets(ImmutableList.of(L3_ECMP_BUCKET, |
| L3_ECMP_BUCKET_1)); |
| private static final Group L3_ECMP_GROUP = new DefaultGroup(L3_ECMP_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.SELECT, L3_ECMP_BUCKETS); |
| |
| private static final TrafficTreatment L3_ECMP_OFDPA_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .group(MPLS_L3VPN_GROUP_ID) |
| .build(); |
| private static final GroupBucket L3_ECMP_OFDPA_BUCKET = DefaultGroupBucket.createSelectGroupBucket( |
| L3_ECMP_OFDPA_BUCKET_TREATMENT); |
| private static final TrafficTreatment L3_ECMP_OFDPA_BUCKET_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .group(MPLS_L3VPN_GROUP_ID_1) |
| .build(); |
| private static final GroupBucket L3_ECMP_OFDPA_BUCKET_1 = DefaultGroupBucket.createSelectGroupBucket( |
| L3_ECMP_OFDPA_BUCKET_TREATMENT_1); |
| private static final GroupBuckets L3_ECMP_OFDPA_BUCKETS = new GroupBuckets(ImmutableList.of(L3_ECMP_OFDPA_BUCKET, |
| L3_ECMP_OFDPA_BUCKET_1)); |
| private static final Group L3_ECMP_OFDPA_GROUP = new DefaultGroup(L3_ECMP_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.SELECT, L3_ECMP_OFDPA_BUCKETS); |
| |
| private static final GroupId MPLS_ECMP_GROUP_ID = GroupId.valueOf(0x7000000f); |
| private static final TrafficTreatment MPLS_ECMP_BUCKET_TREATMENT = DefaultTrafficTreatment.builder() |
| .group(L3_UCAST_GROUP_ID_1) |
| .build(); |
| private static final GroupBucket MPLS_ECMP_BUCKET = DefaultGroupBucket.createSelectGroupBucket( |
| MPLS_ECMP_BUCKET_TREATMENT); |
| private static final GroupBuckets MPLS_ECMP_BUCKETS = new GroupBuckets(ImmutableList.of(MPLS_ECMP_BUCKET)); |
| private static final Group MPLS_ECMP_GROUP = new DefaultGroup(MPLS_ECMP_GROUP_ID, OFDPA_DEVICE, |
| Group.Type.SELECT, MPLS_ECMP_BUCKETS); |
| |
| // Flows |
| private static final TrafficSelector EMPTY_SELECTOR = DefaultTrafficSelector.emptySelector(); |
| private static final TrafficTreatment EMPTY_TREATMENT = DefaultTrafficTreatment.emptyTreatment(); |
| |
| private static final TrafficTreatment TABLE_0_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.VLAN_TABLE) |
| .build(); |
| private static final FlowRule TABLE_0_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.PORT_TABLE) |
| .withPriority(0) |
| .withSelector(EMPTY_SELECTOR) |
| .withTreatment(TABLE_0_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_0_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_0_MISS_OVS); |
| |
| private static final TrafficSelector TABLE_10_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchInPort(PORT) |
| .matchVlanId(VlanId.NONE) |
| .build(); |
| private static final TrafficTreatment TABLE_10_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .pushVlan() |
| .setVlanId(HOST_VLAN) |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_FLOW_SELECTOR) |
| .withTreatment(TABLE_10_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_FLOW_ENTRY = new DefaultFlowEntry(TABLE_10_FLOW); |
| |
| private static final TrafficTreatment TABLE_10_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .setVlanId(HOST_VLAN) |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_FLOW_SELECTOR) |
| .withTreatment(TABLE_10_FLOW_TREATMENT_1) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_10_FLOW_1); |
| |
| private static final TrafficSelector TABLE_10_FLOW_SELECTOR_2 = DefaultTrafficSelector.builder() |
| .matchInPort(PORT) |
| .matchVlanId(HOST_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_10_FLOW_TREATMENT_2 = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_FLOW_2 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_FLOW_SELECTOR_2) |
| .withTreatment(TABLE_10_FLOW_TREATMENT_2) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_FLOW_ENTRY_2 = new DefaultFlowEntry(TABLE_10_FLOW_2); |
| |
| private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchInPort(UP_PORT) |
| .matchVlanId(VlanId.NONE) |
| .build(); |
| private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .pushVlan() |
| .setVlanId(DEFAULT_VLAN) |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_DEFAULT_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR) |
| .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW); |
| |
| private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR_1 = DefaultTrafficSelector.builder() |
| .matchInPort(UP_PORT) |
| .matchVlanId(VlanId.NONE) |
| .build(); |
| private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .setVlanId(DEFAULT_VLAN) |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_DEFAULT_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR_1) |
| .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT_1) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW_1); |
| |
| private static final TrafficSelector TABLE_10_DEFAULT_FLOW_SELECTOR_2 = DefaultTrafficSelector.builder() |
| .matchInPort(UP_PORT) |
| .matchVlanId(DEFAULT_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_10_DEFAULT_FLOW_TREATMENT_2 = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.TMAC_TABLE) |
| .build(); |
| private static final FlowRule TABLE_10_DEFAULT_FLOW_2 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.VLAN_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_10_DEFAULT_FLOW_SELECTOR_2) |
| .withTreatment(TABLE_10_DEFAULT_FLOW_TREATMENT_2) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_10_DEFAULT_FLOW_ENTRY_2 = new DefaultFlowEntry(TABLE_10_DEFAULT_FLOW_2); |
| |
| private static final TrafficTreatment TABLE_20_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.BRIDGING_TABLE) |
| .build(); |
| private static final FlowRule TABLE_20_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.TMAC_TABLE) |
| .withPriority(0) |
| .withSelector(EMPTY_SELECTOR) |
| .withTreatment(TABLE_20_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_20_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_20_MISS_OVS); |
| |
| private static final TrafficSelector TABLE_20_IPV4_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchInPort(UP_PORT) |
| .matchEthDst(LEAF_MAC) |
| .matchEthType(IPV4.ethType().toShort()) |
| .matchVlanId(DEFAULT_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_20_IPV4_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE) |
| .build(); |
| private static final FlowRule TABLE_20_IPV4_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.TMAC_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_20_IPV4_FLOW_SELECTOR) |
| .withTreatment(TABLE_20_IPV4_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_20_IPV4_FLOW_ENTRY = new DefaultFlowEntry(TABLE_20_IPV4_FLOW); |
| |
| private static final TrafficSelector TABLE_20_IPV4_FLOW_SELECTOR_1 = DefaultTrafficSelector.builder() |
| .matchInPort(PORT) |
| .matchEthDst(LEAF_MAC) |
| .matchEthType(IPV4.ethType().toShort()) |
| .matchVlanId(HOST_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_20_IPV4_FLOW_TREATMENT_1 = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE) |
| .build(); |
| private static final FlowRule TABLE_20_IPV4_FLOW_1 = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.TMAC_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_20_IPV4_FLOW_SELECTOR_1) |
| .withTreatment(TABLE_20_IPV4_FLOW_TREATMENT_1) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_20_IPV4_FLOW_ENTRY_1 = new DefaultFlowEntry(TABLE_20_IPV4_FLOW_1); |
| |
| private static final TrafficSelector TABLE_20_MPLS_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchInPort(UP_PORT) |
| .matchEthDst(LEAF_MAC) |
| .matchEthType(MPLS_UNICAST.ethType().toShort()) |
| .matchVlanId(DEFAULT_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_20_MPLS_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.MPLS_TABLE_0) |
| .build(); |
| private static final FlowRule TABLE_20_MPLS_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.TMAC_TABLE) |
| .withPriority(32768) |
| .withSelector(TABLE_20_MPLS_FLOW_SELECTOR) |
| .withTreatment(TABLE_20_MPLS_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_20_MPLS_FLOW_ENTRY = new DefaultFlowEntry(TABLE_20_MPLS_FLOW); |
| |
| private static final TrafficTreatment TABLE_23_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.MPLS_TABLE_1) |
| .build(); |
| private static final FlowRule TABLE_23_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.MPLS_TABLE_0) |
| .withPriority(0) |
| .withSelector(EMPTY_SELECTOR) |
| .withTreatment(TABLE_23_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_23_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_23_MISS_OVS); |
| |
| private static final TrafficSelector TABLE_24_MPLS_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchEthType(MPLS_UNICAST.ethType().toShort()) |
| .matchMplsLabel(MPLS_LABEL) |
| .matchMplsBos(true) |
| .build(); |
| private static final TrafficTreatment TABLE_24_MPLS_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.ACL_TABLE) |
| .deferred() |
| .popMpls(IPV4.ethType()) |
| .decMplsTtl() |
| .group(MPLS_ECMP_GROUP_ID) |
| .build(); |
| private static final FlowRule TABLE_24_MPLS_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.MPLS_TABLE_1) |
| .withPriority(100) |
| .withSelector(TABLE_24_MPLS_FLOW_SELECTOR) |
| .withTreatment(TABLE_24_MPLS_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_24_MPLS_FLOW_ENTRY = new DefaultFlowEntry(TABLE_24_MPLS_FLOW); |
| |
| private static final TrafficTreatment TABLE_24_MPLS_FLOW_TREATMENT_OFDPA = DefaultTrafficTreatment.builder() |
| .transition(OfdpaPipelineUtility.MPLS_L3_TYPE_TABLE) |
| .copyTtlIn() |
| .decMplsTtl() |
| .extension(new Ofdpa3SetMplsType(Ofdpa3MplsType.L3_PHP), OFDPA_DEVICE) |
| .deferred() |
| .group(MPLS_ECMP_GROUP_ID) |
| .build(); |
| private static final FlowRule TABLE_24_MPLS_FLOW_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.MPLS_TABLE_1) |
| .withPriority(100) |
| .withSelector(TABLE_24_MPLS_FLOW_SELECTOR) |
| .withTreatment(TABLE_24_MPLS_FLOW_TREATMENT_OFDPA) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_24_MPLS_FLOW_ENTRY_OFDPA = new DefaultFlowEntry(TABLE_24_MPLS_FLOW_OFDPA); |
| |
| private static final TrafficSelector TABLE_30_UNI_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchEthType(IPV4.ethType().toShort()) |
| .matchIPDst(IP_DST) |
| .build(); |
| private static final TrafficTreatment TABLE_30_UNI_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .deferred() |
| .group(L3_UCAST_GROUP_ID) |
| .transition(OfdpaPipelineUtility.ACL_TABLE) |
| .build(); |
| private static final FlowRule TABLE_30_UNI_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE) |
| .withPriority(64010) |
| .withSelector(TABLE_30_UNI_FLOW_SELECTOR) |
| .withTreatment(TABLE_30_UNI_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_30_UNI_FLOW_ENTRY = new DefaultFlowEntry(TABLE_30_UNI_FLOW); |
| |
| private static final TrafficSelector TABLE_30_ECMP_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchEthType(IPV4.ethType().toShort()) |
| .matchIPDst(PREFIX_DST) |
| .build(); |
| private static final TrafficTreatment TABLE_30_ECMP_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .deferred() |
| .group(L3_ECMP_GROUP_ID) |
| .transition(OfdpaPipelineUtility.ACL_TABLE) |
| .build(); |
| private static final FlowRule TABLE_30_ECMP_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.UNICAST_ROUTING_TABLE) |
| .withPriority(48010) |
| .withSelector(TABLE_30_ECMP_FLOW_SELECTOR) |
| .withTreatment(TABLE_30_ECMP_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_30_ECMP_FLOW_ENTRY = new DefaultFlowEntry(TABLE_30_ECMP_FLOW); |
| |
| private static final TrafficSelector TABLE_50_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchVlanId(HOST_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_50_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .deferred() |
| .group(L2_FLOOD_GROUP_ID) |
| .transition(OfdpaPipelineUtility.ACL_TABLE) |
| .build(); |
| private static final FlowRule TABLE_50_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.BRIDGING_TABLE) |
| .withPriority(5) |
| .withSelector(TABLE_50_FLOW_SELECTOR) |
| .withTreatment(TABLE_50_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_50_FLOW_ENTRY = new DefaultFlowEntry(TABLE_50_FLOW); |
| |
| private static final TrafficSelector TABLE_50_FLOW_SELECTOR_BRIDG = DefaultTrafficSelector.builder() |
| .matchVlanId(HOST_VLAN) |
| .matchEthDst(HOST_MAC) |
| .build(); |
| private static final TrafficTreatment TABLE_50_FLOW_TREATMENT_BRIDG = DefaultTrafficTreatment.builder() |
| .deferred() |
| .group(L2_IFACE_GROUP_ID) |
| .transition(OfdpaPipelineUtility.ACL_TABLE) |
| .build(); |
| private static final FlowRule TABLE_50_FLOW_BRIDG = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.BRIDGING_TABLE) |
| .withPriority(100) |
| .withSelector(TABLE_50_FLOW_SELECTOR_BRIDG) |
| .withTreatment(TABLE_50_FLOW_TREATMENT_BRIDG) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_50_FLOW_ENTRY_BRIDG = new DefaultFlowEntry(TABLE_50_FLOW_BRIDG); |
| |
| private static final TrafficSelector TABLE_60_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchEthType(IPV4.ethType().toShort()) |
| .matchIPDst(IP_PUNT) |
| .build(); |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_OVS = DefaultTrafficTreatment.builder() |
| .wipeDeferred() |
| .transition(OvsOfdpaPipeline.PUNT_TABLE) |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(40000) |
| .withSelector(TABLE_60_FLOW_SELECTOR) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_OVS) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY = new DefaultFlowEntry(TABLE_60_FLOW_OVS); |
| |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_OFDPA = DefaultTrafficTreatment.builder() |
| .wipeDeferred() |
| .punt() |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(40000) |
| .withSelector(TABLE_60_FLOW_SELECTOR) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_OFDPA) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_OFDPA); |
| |
| private static final FlowRule TABLE_60_MISS_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(0) |
| .withSelector(EMPTY_SELECTOR) |
| .withTreatment(EMPTY_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_MISS_FLOW_ENTRY_OVS = new DefaultFlowEntry(TABLE_60_MISS_OVS); |
| |
| private static final TrafficSelector TABLE_60_FLOW_SELECTOR_ARP = DefaultTrafficSelector.builder() |
| .matchEthType(ARP.ethType().toShort()) |
| .build(); |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_ARP_OVS = DefaultTrafficTreatment.builder() |
| .transition(OvsOfdpaPipeline.PUNT_TABLE) |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_ARP_OVS = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(30000) |
| .withSelector(TABLE_60_FLOW_SELECTOR_ARP) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_ARP_OVS) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY_ARP_OVS = new DefaultFlowEntry(TABLE_60_FLOW_ARP_OVS); |
| |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_ARP_OFDPA = DefaultTrafficTreatment.builder() |
| .punt() |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_ARP_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(30000) |
| .withSelector(TABLE_60_FLOW_SELECTOR_ARP) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_ARP_OFDPA) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY_ARP_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_ARP_OFDPA); |
| |
| private static final TrafficSelector TABLE_60_FLOW_SELECTOR_LLDP = DefaultTrafficSelector.builder() |
| .matchEthType(LLDP.ethType().toShort()) |
| .build(); |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_LLDP = DefaultTrafficTreatment.builder() |
| .wipeDeferred() |
| .transition(OvsOfdpaPipeline.PUNT_TABLE) |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_LLDP = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(40000) |
| .withSelector(TABLE_60_FLOW_SELECTOR_LLDP) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_LLDP) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY_LLDP = new DefaultFlowEntry(TABLE_60_FLOW_LLDP); |
| |
| private static final TrafficTreatment TABLE_60_FLOW_TREATMENT_LLDP_OFDPA = DefaultTrafficTreatment.builder() |
| .wipeDeferred() |
| .punt() |
| .build(); |
| private static final FlowRule TABLE_60_FLOW_LLDP_OFDPA = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OfdpaPipelineUtility.ACL_TABLE) |
| .withPriority(40000) |
| .withSelector(TABLE_60_FLOW_SELECTOR_LLDP) |
| .withTreatment(TABLE_60_FLOW_TREATMENT_LLDP_OFDPA) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_60_FLOW_ENTRY_LLDP_OFDPA = new DefaultFlowEntry(TABLE_60_FLOW_LLDP_OFDPA); |
| |
| private static final TrafficSelector TABLE_63_FLOW_SELECTOR = DefaultTrafficSelector.builder() |
| .matchInPort(OFDPA_CP.port()) |
| .matchVlanId(HOST_VLAN) |
| .build(); |
| private static final TrafficTreatment TABLE_63_FLOW_TREATMENT = DefaultTrafficTreatment.builder() |
| .group(GroupId.valueOf(OvsOfdpaPipeline.POP_VLAN_PUNT_GROUP_ID)) |
| .build(); |
| private static final FlowRule TABLE_63_FLOW = DefaultFlowEntry.builder().forDevice(OFDPA_DEVICE) |
| .forTable(OvsOfdpaPipeline.PUNT_TABLE) |
| .withPriority(40000) |
| .withSelector(TABLE_63_FLOW_SELECTOR) |
| .withTreatment(TABLE_63_FLOW_TREATMENT) |
| .fromApp(new DefaultApplicationId(0, "TestApp")) |
| .makePermanent() |
| .build(); |
| private static final FlowEntry TABLE_63_FLOW_ENTRY = new DefaultFlowEntry(TABLE_63_FLOW); |
| |
| // Represents the device state |
| public static List<DataPlaneEntity> getDataPlaneEntities(String driverName, TraceableTest test) { |
| List<FlowEntry> flowRules = ImmutableList.of(); |
| List<Group> groups = ImmutableList.of(); |
| // Flow and groups by device |
| if (driverName.equals(OFDPA_DRIVER)) { |
| flowRules = ImmutableList.of( |
| // Vlan 1 table |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_10_DEFAULT_FLOW_ENTRY_1, |
| TABLE_10_DEFAULT_FLOW_ENTRY_2, |
| // TMAC table |
| TABLE_20_IPV4_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1, TABLE_20_MPLS_FLOW_ENTRY, |
| // MPLS 1 table |
| TABLE_24_MPLS_FLOW_ENTRY_OFDPA, |
| // Unicast table |
| TABLE_30_UNI_FLOW_ENTRY, TABLE_30_ECMP_FLOW_ENTRY, |
| // Bridging table |
| TABLE_50_FLOW_ENTRY, TABLE_50_FLOW_ENTRY_BRIDG, |
| // ACL table |
| TABLE_60_FLOW_ENTRY_OFDPA, TABLE_60_FLOW_ENTRY_ARP_OFDPA, TABLE_60_FLOW_ENTRY_LLDP_OFDPA); |
| groups = Lists.newArrayList( |
| // L3 ECMP groups |
| L3_ECMP_OFDPA_GROUP, |
| // MPLS ECMP groups |
| MPLS_ECMP_GROUP, |
| // L3 groups |
| L3_UCAST_GROUP, L3_UCAST_GROUP_1, |
| // MPLS L3 VPN groups |
| MPLS_L3VPN_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP_1, |
| // MPLS iface groups |
| MPLS_IFACE_GROUP, MPLS_IFACE_GROUP_1, |
| // L2 groups |
| L2_FLOOD_GROUP, |
| L2_IFACE_GROUP, L2_IFACE_GROUP_1, L2_IFACE_GROUP_2, L2_IFACE_GROUP_3); |
| } else if (driverName.equals(OVS_OFDPA_DRIVER)) { |
| flowRules = ImmutableList.of( |
| // Port table |
| TABLE_0_MISS_FLOW_ENTRY_OVS, |
| // Vlan 1 table |
| TABLE_10_FLOW_ENTRY, TABLE_10_DEFAULT_FLOW_ENTRY, |
| // TMAC table |
| TABLE_20_MISS_FLOW_ENTRY_OVS, TABLE_20_IPV4_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1, |
| TABLE_20_MPLS_FLOW_ENTRY, |
| // MPLS 0 table |
| TABLE_23_MISS_FLOW_ENTRY_OVS, |
| // MPLS 1 table |
| TABLE_24_MPLS_FLOW_ENTRY, |
| // Unicast table |
| TABLE_30_UNI_FLOW_ENTRY, TABLE_30_ECMP_FLOW_ENTRY, |
| // Bridging table |
| TABLE_50_FLOW_ENTRY, TABLE_50_FLOW_ENTRY_BRIDG, |
| // ACL table |
| TABLE_60_MISS_FLOW_ENTRY_OVS, TABLE_60_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, |
| TABLE_60_FLOW_ENTRY_LLDP, |
| // Punt table |
| TABLE_63_FLOW_ENTRY); |
| groups = Lists.newArrayList( |
| // Punt groups |
| PUNT_GROUP, |
| // L3 ECMP groups |
| L3_ECMP_GROUP, |
| // MPLS ECMP groups |
| MPLS_ECMP_GROUP, |
| // L3 groups |
| L3_UCAST_GROUP, L3_UCAST_GROUP_1, |
| // MPLS L3 VPN groups |
| MPLS_L3VPN_GROUP, MPLS_L3VPN_GROUP_1, |
| // MPLS iface groups |
| MPLS_IFACE_GROUP, MPLS_IFACE_GROUP_1, |
| // L2 groups |
| L2_FLOOD_GROUP, |
| L2_IFACE_GROUP, L2_IFACE_GROUP_1, L2_IFACE_GROUP_2, L2_IFACE_GROUP_3); |
| } |
| // Inject failure scenarios |
| if (test.equals(L2_BROAD_EMPTY_OFDPA) || test.equals(L2_BROAD_EMPTY_OVS_OFDPA)) { |
| groups.remove(L2_FLOOD_GROUP); |
| groups.add(L2_FLOOD_EMPTY_GROUP); |
| } else if (test.equals(L2_BRIDG_NOT_ORDERED_OFDPA) || test.equals(L2_BRIDG_NOT_ORDERED_OVS_OFDPA)) { |
| groups.remove(L2_IFACE_GROUP); |
| groups.add(L2_IFACE_GROUP_NOT_ORDERED); |
| } |
| List<DataPlaneEntity> dataPlaneEntities = Lists.newArrayList(); |
| flowRules.forEach(flowRule -> dataPlaneEntities.add(new DataPlaneEntity(flowRule))); |
| groups.forEach(group -> dataPlaneEntities.add(new DataPlaneEntity(group))); |
| return dataPlaneEntities; |
| } |
| |
| // Returns the expected hit chains (order matters!) |
| public static List<List<DataPlaneEntity>> getHitChains(TraceableTest test) { |
| List<List<FlowEntry>> flowRules = Lists.newArrayList(); |
| List<List<Group>> groups = Lists.newArrayList(); |
| // Flows and groups by test |
| if (test.equals(PUNT_IP_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY)); |
| } else if (test.equals(PUNT_IP_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY, TABLE_63_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(PUNT_GROUP)); |
| } else if (test.equals(ARP_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA)); |
| groups.add(ImmutableList.of()); |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP)); |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OFDPA)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1)); |
| } else if (test.equals(ARP_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(PUNT_GROUP)); |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP)); |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_ARP_OVS, TABLE_63_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1)); |
| } else if (test.equals(PUNT_LLDP_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_LLDP_OFDPA)); |
| } else if (test.equals(PUNT_LLDP_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_FLOW_ENTRY_LLDP, TABLE_63_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(PUNT_GROUP)); |
| } else if (test.equals(L2_BRIDG_UNTAG_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY_BRIDG)); |
| groups.add(ImmutableList.of(L2_IFACE_GROUP)); |
| } else if (test.equals(L2_BRIDG_UNTAG_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY_BRIDG, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L2_IFACE_GROUP)); |
| } else if (test.equals(L2_BROAD_UNTAG_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP)); |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1)); |
| } else if (test.equals(L2_BROAD_UNTAG_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP)); |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L2_FLOOD_GROUP, L2_IFACE_GROUP_1)); |
| } else if (test.equals(L3_UCAST_UNTAG_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_DEFAULT_FLOW_ENTRY_1, TABLE_10_DEFAULT_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY, |
| TABLE_30_UNI_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L3_UCAST_GROUP, L2_IFACE_GROUP)); |
| } else if (test.equals(L3_UCAST_UNTAG_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_DEFAULT_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY, |
| TABLE_30_UNI_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L3_UCAST_GROUP, L2_IFACE_GROUP)); |
| } else if (test.equals(L3_ECMP_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1, |
| TABLE_30_ECMP_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L3_ECMP_GROUP, MPLS_L3VPN_GROUP, MPLS_IFACE_GROUP, L2_IFACE_GROUP_2)); |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_IPV4_FLOW_ENTRY_1, |
| TABLE_30_ECMP_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L3_ECMP_GROUP, MPLS_L3VPN_GROUP_1, MPLS_IFACE_GROUP_1, L2_IFACE_GROUP_3)); |
| } else if (test.equals(L3_ECMP_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY_1, |
| TABLE_30_ECMP_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L3_ECMP_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP, MPLS_IFACE_GROUP, |
| L2_IFACE_GROUP_2)); |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, TABLE_20_IPV4_FLOW_ENTRY_1, |
| TABLE_30_ECMP_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L3_ECMP_OFDPA_GROUP, MPLS_L3VPN_OFDPA_GROUP_1, MPLS_IFACE_GROUP_1, |
| L2_IFACE_GROUP_3)); |
| } else if (test.equals(MPLS_ECMP_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_DEFAULT_FLOW_ENTRY, TABLE_20_MPLS_FLOW_ENTRY, |
| TABLE_23_MISS_FLOW_ENTRY_OVS, TABLE_24_MPLS_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(MPLS_ECMP_GROUP, L3_UCAST_GROUP_1, L2_IFACE_GROUP_3)); |
| } else if (test.equals(MPLS_ECMP_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_DEFAULT_FLOW_ENTRY_1, TABLE_10_DEFAULT_FLOW_ENTRY_2, TABLE_20_MPLS_FLOW_ENTRY, |
| TABLE_24_MPLS_FLOW_ENTRY_OFDPA)); |
| groups.add(ImmutableList.of(MPLS_ECMP_GROUP, L3_UCAST_GROUP_1, L2_IFACE_GROUP_3)); |
| } else if (test.equals(L2_BROAD_EMPTY_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY)); |
| groups.add(ImmutableList.of(L2_FLOOD_EMPTY_GROUP)); |
| } else if (test.equals(L2_BROAD_EMPTY_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L2_FLOOD_EMPTY_GROUP)); |
| } else if (test.equals(L2_BRIDG_NOT_ORDERED_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_10_FLOW_ENTRY_1, TABLE_10_FLOW_ENTRY_2, |
| TABLE_50_FLOW_ENTRY_BRIDG)); |
| groups.add(ImmutableList.of(L2_IFACE_GROUP_NOT_ORDERED)); |
| } else if (test.equals(L2_BRIDG_NOT_ORDERED_OVS_OFDPA)) { |
| flowRules.add(ImmutableList.of( |
| TABLE_0_MISS_FLOW_ENTRY_OVS, TABLE_10_FLOW_ENTRY, TABLE_20_MISS_FLOW_ENTRY_OVS, |
| TABLE_50_FLOW_ENTRY_BRIDG, TABLE_60_MISS_FLOW_ENTRY_OVS)); |
| groups.add(ImmutableList.of(L2_IFACE_GROUP_NOT_ORDERED)); |
| } |
| List<List<DataPlaneEntity>> chains = Lists.newArrayList(); |
| List<DataPlaneEntity> dataPlaneEntities = Lists.newArrayList(); |
| int end = Math.max(flowRules.size(), groups.size()); |
| int i = 0; |
| while (i < end) { |
| if (i < flowRules.size()) { |
| flowRules.get(i).forEach(flowRule -> dataPlaneEntities.add(new DataPlaneEntity(flowRule))); |
| } |
| if (i < groups.size()) { |
| groups.get(i).forEach(group -> dataPlaneEntities.add(new DataPlaneEntity(group))); |
| } |
| chains.add(ImmutableList.copyOf(dataPlaneEntities)); |
| dataPlaneEntities.clear(); |
| i = i + 1; |
| } |
| return chains; |
| } |
| |
| } |