0001
0002
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
0108 ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
0109
0110
0111
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
0117
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
0176
0177 h1_to_h2 $test_name
0178
0179
0180
0181
0182
0183 h2_to_h1 $test_name
0184 }
0185
0186 mac_profile_test()
0187 {
0188 local rp2_mac=$(mac_get $rp2)
0189
0190
0191
0192 ip link set dev $rp2 addr 00:11:22:33:44:55
0193 smac_test "new mac profile"
0194
0195
0196 ip link set dev $rp2 address 00:22:22:22:22:22
0197 smac_test "edit mac profile"
0198
0199
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