| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| lib_dir=$(dirname $0)/../../../net/forwarding |
| |
| ALL_TESTS=" |
| mac_profile_test |
| " |
| NUM_NETIFS=4 |
| source $lib_dir/lib.sh |
| source $lib_dir/tc_common.sh |
| source $lib_dir/devlink_lib.sh |
| |
| h1_create() |
| { |
| simple_if_init $h1 192.0.2.1/24 |
| ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2 |
| |
| tc qdisc add dev $h1 ingress |
| } |
| |
| h1_destroy() |
| { |
| tc qdisc del dev $h1 ingress |
| |
| ip route del 198.51.100.0/24 vrf v$h1 |
| simple_if_fini $h1 192.0.2.1/24 |
| } |
| |
| h2_create() |
| { |
| simple_if_init $h2 198.51.100.1/24 |
| ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2 |
| |
| tc qdisc add dev $h2 ingress |
| } |
| |
| h2_destroy() |
| { |
| tc qdisc del dev $h2 ingress |
| |
| ip route del 192.0.2.0/24 vrf v$h2 |
| simple_if_fini $h2 198.51.100.1/24 |
| } |
| |
| router_create() |
| { |
| ip link set dev $rp1 up |
| ip link set dev $rp2 up |
| |
| tc qdisc add dev $rp1 clsact |
| tc qdisc add dev $rp2 clsact |
| ip address add 192.0.2.2/24 dev $rp1 |
| ip address add 198.51.100.2/24 dev $rp2 |
| } |
| |
| router_destroy() |
| { |
| ip address del 198.51.100.2/24 dev $rp2 |
| ip address del 192.0.2.2/24 dev $rp1 |
| tc qdisc del dev $rp2 clsact |
| tc qdisc del dev $rp1 clsact |
| |
| ip link set dev $rp2 down |
| ip link set dev $rp1 down |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| rp1=${NETIFS[p2]} |
| |
| rp2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| vrf_prepare |
| |
| h1_create |
| h2_create |
| |
| router_create |
| |
| forwarding_enable |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| forwarding_restore |
| |
| router_destroy |
| |
| h2_destroy |
| h1_destroy |
| |
| vrf_cleanup |
| } |
| |
| h1_to_h2() |
| { |
| local test_name=$@; shift |
| local smac=$(mac_get $rp2) |
| |
| RET=0 |
| |
| # Replace neighbour to avoid first packet being forwarded in software |
| ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2) |
| |
| # Add a filter to ensure that packets are forwarded in hardware. Cannot |
| # match on source MAC because it is not set in eACL after routing |
| tc filter add dev $rp2 egress proto ip pref 1 handle 101 \ |
| flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \ |
| action pass |
| |
| # Add a filter to ensure that packets are received with the correct |
| # source MAC |
| tc filter add dev $h2 ingress proto ip pref 1 handle 101 \ |
| flower skip_sw src_mac $smac ip_proto udp src_port 12345 \ |
| dst_port 54321 action pass |
| |
| $MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \ |
| -A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q |
| |
| tc_check_packets "dev $rp2 egress" 101 10 |
| check_err $? "packets not forwarded in hardware" |
| |
| tc_check_packets "dev $h2 ingress" 101 10 |
| check_err $? "packets not forwarded with correct source mac" |
| |
| log_test "h1->h2: $test_name" |
| |
| tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower |
| tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower |
| ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2) |
| } |
| |
| h2_to_h1() |
| { |
| local test_name=$@; shift |
| local rp1_mac=$(mac_get $rp1) |
| |
| RET=0 |
| |
| ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1) |
| |
| tc filter add dev $rp1 egress proto ip pref 1 handle 101 \ |
| flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \ |
| action pass |
| |
| tc filter add dev $h1 ingress proto ip pref 1 handle 101 \ |
| flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \ |
| dst_port 12345 action pass |
| |
| $MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \ |
| -A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q |
| |
| tc_check_packets "dev $rp1 egress" 101 10 |
| check_err $? "packets not forwarded in hardware" |
| |
| tc_check_packets "dev $h1 ingress" 101 10 |
| check_err $? "packets not forwarded with correct source mac" |
| |
| log_test "h2->h1: $test_name" |
| |
| tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower |
| tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower |
| ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1) |
| } |
| |
| smac_test() |
| { |
| local test_name=$@; shift |
| |
| # Test that packets forwarded to $h2 via $rp2 are forwarded with the |
| # current source MAC of $rp2 |
| h1_to_h2 $test_name |
| |
| # Test that packets forwarded to $h1 via $rp1 are forwarded with the |
| # current source MAC of $rp1. This MAC is never changed during the test, |
| # but given the shared nature of MAC profile, the point is to see that |
| # changes to the MAC of $rp2 do not affect that of $rp1 |
| h2_to_h1 $test_name |
| } |
| |
| mac_profile_test() |
| { |
| local rp2_mac=$(mac_get $rp2) |
| |
| # Test behavior when the RIF backing $rp2 is transitioned to use |
| # a new MAC profile |
| ip link set dev $rp2 addr 00:11:22:33:44:55 |
| smac_test "new mac profile" |
| |
| # Test behavior when the MAC profile used by the RIF is edited |
| ip link set dev $rp2 address 00:22:22:22:22:22 |
| smac_test "edit mac profile" |
| |
| # Restore original MAC |
| ip link set dev $rp2 addr $rp2_mac |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| mac_profiles=$(devlink_resource_size_get rif_mac_profiles) |
| if [[ $mac_profiles -ne 1 ]]; then |
| tests_run |
| fi |
| |
| exit $EXIT_STATUS |