Aarav90-cpu dc0d1c50f0 Initial Commit 16 hours ago
..
Makefile dc0d1c50f0 Initial Commit 16 hours ago
README dc0d1c50f0 Initial Commit 16 hours ago
bridge_activity_notify.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_fdb_learning_limit.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_fdb_local_vlan_0.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_igmp.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_locked_port.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_mdb.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_mdb_host.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_mdb_max.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_mdb_port_down.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_mld.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_port_isolation.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_sticky_fdb.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_vlan_aware.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_vlan_mcast.sh dc0d1c50f0 Initial Commit 16 hours ago
bridge_vlan_unaware.sh dc0d1c50f0 Initial Commit 16 hours ago
config dc0d1c50f0 Initial Commit 16 hours ago
custom_multipath_hash.sh dc0d1c50f0 Initial Commit 16 hours ago
devlink_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
dual_vxlan_bridge.sh dc0d1c50f0 Initial Commit 16 hours ago
fib_offload_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
forwarding.config.sample dc0d1c50f0 Initial Commit 16 hours ago
gre_custom_multipath_hash.sh dc0d1c50f0 Initial Commit 16 hours ago
gre_inner_v4_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
gre_inner_v6_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
gre_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
gre_multipath_nh.sh dc0d1c50f0 Initial Commit 16 hours ago
gre_multipath_nh_res.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6_forward_instats_vrf.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_custom_multipath_hash.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_flat.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_flat_key.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_flat_keys.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_hier.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_hier_key.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_hier_keys.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_inner_v4_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_inner_v6_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
ip6gre_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_flat_gre.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_flat_gre_key.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_flat_gre_keys.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_hier_gre.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_hier_gre_key.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_hier_gre_keys.sh dc0d1c50f0 Initial Commit 16 hours ago
ipip_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
lib.sh dc0d1c50f0 Initial Commit 16 hours ago
lib_sh_test.sh dc0d1c50f0 Initial Commit 16 hours ago
local_termination.sh dc0d1c50f0 Initial Commit 16 hours ago
min_max_mtu.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_bound.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_bridge_1d.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_bridge_1d_vlan.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_bridge_1q.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_bridge_1q_lag.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_changes.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_flower.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_lag_lacp.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_neigh.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_nh.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_topo_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_vlan.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_gre_vlan_bridge_1q.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_topo_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
mirror_vlan.sh dc0d1c50f0 Initial Commit 16 hours ago
no_forwarding.sh dc0d1c50f0 Initial Commit 16 hours ago
pedit_dsfield.sh dc0d1c50f0 Initial Commit 16 hours ago
pedit_ip.sh dc0d1c50f0 Initial Commit 16 hours ago
pedit_l4port.sh dc0d1c50f0 Initial Commit 16 hours ago
q_in_vni.sh dc0d1c50f0 Initial Commit 16 hours ago
q_in_vni_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
router.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_1d.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_1d_lag.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_lag.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_pvid_vlan_upper.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_vlan.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_vlan_upper.sh dc0d1c50f0 Initial Commit 16 hours ago
router_bridge_vlan_upper_pvid.sh dc0d1c50f0 Initial Commit 16 hours ago
router_broadcast.sh dc0d1c50f0 Initial Commit 16 hours ago
router_mpath_nh.sh dc0d1c50f0 Initial Commit 16 hours ago
router_mpath_nh_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
router_mpath_nh_res.sh dc0d1c50f0 Initial Commit 16 hours ago
router_mpath_seed.sh dc0d1c50f0 Initial Commit 16 hours ago
router_multicast.sh dc0d1c50f0 Initial Commit 16 hours ago
router_multipath.sh dc0d1c50f0 Initial Commit 16 hours ago
router_nh.sh dc0d1c50f0 Initial Commit 16 hours ago
router_vid_1.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_ets.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_ets_core.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_ets_tests.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_red.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_tbf_core.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_tbf_ets.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_tbf_etsprio.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_tbf_prio.sh dc0d1c50f0 Initial Commit 16 hours ago
sch_tbf_root.sh dc0d1c50f0 Initial Commit 16 hours ago
settings dc0d1c50f0 Initial Commit 16 hours ago
skbedit_priority.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_actions.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_chains.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_common.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_flower.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_flower_cfm.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_flower_l2_miss.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_flower_port_range.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_flower_router.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_mpls_l2vpn.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_police.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_shblocks.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_taprio.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_tunnel_key.sh dc0d1c50f0 Initial Commit 16 hours ago
tc_vlan_modify.sh dc0d1c50f0 Initial Commit 16 hours ago
tsn_lib.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_asymmetric.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_asymmetric_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1d.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1d_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1d_port_8472.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1d_port_8472_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1q.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1q_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1q_mc_ul.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1q_port_8472.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_bridge_1q_port_8472_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_reserved.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_symmetric.sh dc0d1c50f0 Initial Commit 16 hours ago
vxlan_symmetric_ipv6.sh dc0d1c50f0 Initial Commit 16 hours ago

README

Motivation
==========

One of the nice things about network namespaces is that they allow one
to easily create and test complex environments.

Unfortunately, these namespaces can not be used with actual switching
ASICs, as their ports can not be migrated to other network namespaces
(dev->netns_immutable) and most of them probably do not support the
L1-separation provided by namespaces.

However, a similar kind of flexibility can be achieved by using VRFs and
by looping the switch ports together. For example:

br0
+
vrf-h1 | vrf-h2
+ +---+----+ +
| | | |
192.0.2.1/24 + + + + 192.0.2.2/24
swp1 swp2 swp3 swp4
+ + + +
| | | |
+--------+ +--------+

The VRFs act as lightweight namespaces representing hosts connected to
the switch.

This approach for testing switch ASICs has several advantages over the
traditional method that requires multiple physical machines, to name a
few:

1. Only the device under test (DUT) is being tested without noise from
other system.

2. Ability to easily provision complex topologies. Testing bridging
between 4-ports LAGs or 8-way ECMP requires many physical links that are
not always available. With the VRF-based approach one merely needs to
loopback more ports.

These tests are written with switch ASICs in mind, but they can be run
on any Linux box using veth pairs to emulate physical loopbacks.

Guidelines for Writing Tests
============================

o Where possible, reuse an existing topology for different tests instead
of recreating the same topology.
o Tests that use anything but the most trivial topologies should include
an ASCII art showing the topology.
o Where possible, IPv6 and IPv4 addresses shall conform to RFC 3849 and
RFC 5737, respectively.
o Where possible, tests shall be written so that they can be reused by
multiple topologies and added to lib.sh.
o Checks shall be added to lib.sh for any external dependencies.
o Code shall be checked using ShellCheck [1] prior to submission.

1. https://www.shellcheck.net/

Cleanups
--------

o lib.sh brings in defer.sh (by way of ../lib.sh) by default. Consider
making use of the defer primitive to schedule automatic cleanups. This
makes it harder to forget to remove a temporary netdevice, kill a running
process or perform other cleanup when the test script is interrupted.

o When adding a helper that dirties the environment, but schedules all
necessary cleanups through defer, consider prefixing it adf_ for
consistency with lib.sh and ../lib.sh helpers. This serves as an
immediately visible bit of documentation about the helper API.

o Definitely do the above for any new code in lib.sh, if practical.

Customization
=============

The forwarding selftests framework uses a number of variables that
influence its behavior and tools it invokes, and how it invokes them, in
various ways. A number of these variables can be overridden. The way these
overridable variables are specified is typically one of the following two
syntaxes:

: "${VARIABLE:=default_value}"
VARIABLE=${VARIABLE:=default_value}

Any of these variables can be overridden. Notably net/forwarding/lib.sh and
net/lib.sh contain a number of overridable variables.

One way of overriding these variables is through the environment:

PAUSE_ON_FAIL=yes ./some_test.sh

The variable NETIFS is special. Since it is an array variable, there is no
way to pass it through the environment. Its value can instead be given as
consecutive arguments to the selftest:

./some_test.sh swp{1..8}

A way to customize variables in a persistent fashion is to create a file
named forwarding.config in this directory. lib.sh sources the file if
present, so it can contain any shell code. Typically it will contain
assignments of variables whose value should be overridden.

forwarding.config.sample is available in the directory as an example of
how forwarding.config might look.