Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 lib_dir=$(dirname $0)/../../../net/forwarding
0005 
0006 ALL_TESTS="
0007         mac_profile_test
0008 "
0009 NUM_NETIFS=4
0010 source $lib_dir/lib.sh
0011 source $lib_dir/tc_common.sh
0012 source $lib_dir/devlink_lib.sh
0013 
0014 h1_create()
0015 {
0016         simple_if_init $h1 192.0.2.1/24
0017         ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2
0018 
0019         tc qdisc add dev $h1 ingress
0020 }
0021 
0022 h1_destroy()
0023 {
0024         tc qdisc del dev $h1 ingress
0025 
0026         ip route del 198.51.100.0/24 vrf v$h1
0027         simple_if_fini $h1 192.0.2.1/24
0028 }
0029 
0030 h2_create()
0031 {
0032         simple_if_init $h2 198.51.100.1/24
0033         ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2
0034 
0035         tc qdisc add dev $h2 ingress
0036 }
0037 
0038 h2_destroy()
0039 {
0040         tc qdisc del dev $h2 ingress
0041 
0042         ip route del 192.0.2.0/24 vrf v$h2
0043         simple_if_fini $h2 198.51.100.1/24
0044 }
0045 
0046 router_create()
0047 {
0048         ip link set dev $rp1 up
0049         ip link set dev $rp2 up
0050 
0051         tc qdisc add dev $rp1 clsact
0052         tc qdisc add dev $rp2 clsact
0053         ip address add 192.0.2.2/24 dev $rp1
0054         ip address add 198.51.100.2/24 dev $rp2
0055 }
0056 
0057 router_destroy()
0058 {
0059         ip address del 198.51.100.2/24 dev $rp2
0060         ip address del 192.0.2.2/24 dev $rp1
0061         tc qdisc del dev $rp2 clsact
0062         tc qdisc del dev $rp1 clsact
0063 
0064         ip link set dev $rp2 down
0065         ip link set dev $rp1 down
0066 }
0067 
0068 setup_prepare()
0069 {
0070         h1=${NETIFS[p1]}
0071         rp1=${NETIFS[p2]}
0072 
0073         rp2=${NETIFS[p3]}
0074         h2=${NETIFS[p4]}
0075 
0076         vrf_prepare
0077 
0078         h1_create
0079         h2_create
0080 
0081         router_create
0082 
0083         forwarding_enable
0084 }
0085 
0086 cleanup()
0087 {
0088         pre_cleanup
0089 
0090         forwarding_restore
0091 
0092         router_destroy
0093 
0094         h2_destroy
0095         h1_destroy
0096 
0097         vrf_cleanup
0098 }
0099 
0100 h1_to_h2()
0101 {
0102         local test_name=$@; shift
0103         local smac=$(mac_get $rp2)
0104 
0105         RET=0
0106 
0107         # Replace neighbour to avoid first packet being forwarded in software
0108         ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
0109 
0110         # Add a filter to ensure that packets are forwarded in hardware. Cannot
0111         # match on source MAC because it is not set in eACL after routing
0112         tc filter add dev $rp2 egress proto ip pref 1 handle 101 \
0113                 flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \
0114                 action pass
0115 
0116         # Add a filter to ensure that packets are received with the correct
0117         # source MAC
0118         tc filter add dev $h2 ingress proto ip pref 1 handle 101 \
0119                 flower skip_sw src_mac $smac ip_proto udp src_port 12345 \
0120                 dst_port 54321 action pass
0121 
0122         $MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \
0123                 -A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q
0124 
0125         tc_check_packets "dev $rp2 egress" 101 10
0126         check_err $? "packets not forwarded in hardware"
0127 
0128         tc_check_packets "dev $h2 ingress" 101 10
0129         check_err $? "packets not forwarded with correct source mac"
0130 
0131         log_test "h1->h2: $test_name"
0132 
0133         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
0134         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
0135         ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
0136 }
0137 
0138 h2_to_h1()
0139 {
0140         local test_name=$@; shift
0141         local rp1_mac=$(mac_get $rp1)
0142 
0143         RET=0
0144 
0145         ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
0146 
0147         tc filter add dev $rp1 egress proto ip pref 1 handle 101 \
0148                 flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \
0149                 action pass
0150 
0151         tc filter add dev $h1 ingress proto ip pref 1 handle 101 \
0152                 flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \
0153                 dst_port 12345 action pass
0154 
0155         $MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \
0156                 -A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q
0157 
0158         tc_check_packets "dev $rp1 egress" 101 10
0159         check_err $? "packets not forwarded in hardware"
0160 
0161         tc_check_packets "dev $h1 ingress" 101 10
0162         check_err $? "packets not forwarded with correct source mac"
0163 
0164         log_test "h2->h1: $test_name"
0165 
0166         tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
0167         tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower
0168         ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
0169 }
0170 
0171 smac_test()
0172 {
0173         local test_name=$@; shift
0174 
0175         # Test that packets forwarded to $h2 via $rp2 are forwarded with the
0176         # current source MAC of $rp2
0177         h1_to_h2 $test_name
0178 
0179         # Test that packets forwarded to $h1 via $rp1 are forwarded with the
0180         # current source MAC of $rp1. This MAC is never changed during the test,
0181         # but given the shared nature of MAC profile, the point is to see that
0182         # changes to the MAC of $rp2 do not affect that of $rp1
0183         h2_to_h1 $test_name
0184 }
0185 
0186 mac_profile_test()
0187 {
0188         local rp2_mac=$(mac_get $rp2)
0189 
0190         # Test behavior when the RIF backing $rp2 is transitioned to use
0191         # a new MAC profile
0192         ip link set dev $rp2 addr 00:11:22:33:44:55
0193         smac_test "new mac profile"
0194 
0195         # Test behavior when the MAC profile used by the RIF is edited
0196         ip link set dev $rp2 address 00:22:22:22:22:22
0197         smac_test "edit mac profile"
0198 
0199         # Restore original MAC
0200         ip link set dev $rp2 addr $rp2_mac
0201 }
0202 
0203 trap cleanup EXIT
0204 
0205 setup_prepare
0206 setup_wait
0207 
0208 mac_profiles=$(devlink_resource_size_get rif_mac_profiles)
0209 if [[ $mac_profiles -ne 1 ]]; then
0210         tests_run
0211 fi
0212 
0213 exit $EXIT_STATUS