Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4lib_dir=$(dirname $0)/../../../net/forwarding
5
6ALL_TESTS="
7 rif_mac_profile_edit_test
8"
9NUM_NETIFS=2
10source $lib_dir/lib.sh
11source $lib_dir/devlink_lib.sh
12
13setup_prepare()
14{
15 h1=${NETIFS[p1]}
16 h2=${NETIFS[p2]}
17
18 # Disable IPv6 on the two interfaces to avoid IPv6 link-local addresses
19 # being generated and RIFs being created
20 sysctl_set net.ipv6.conf.$h1.disable_ipv6 1
21 sysctl_set net.ipv6.conf.$h2.disable_ipv6 1
22
23 ip link set $h1 up
24 ip link set $h2 up
25}
26
27cleanup()
28{
29 pre_cleanup
30
31 ip link set $h2 down
32 ip link set $h1 down
33
34 sysctl_restore net.ipv6.conf.$h2.disable_ipv6
35 sysctl_restore net.ipv6.conf.$h1.disable_ipv6
36
37 # Reload in order to clean all the RIFs and RIF MAC profiles created
38 devlink_reload
39}
40
41create_max_rif_mac_profiles()
42{
43 local count=$1; shift
44 local batch_file="$(mktemp)"
45
46 for ((i = 1; i <= count; i++)); do
47 vlan=$(( i*10 ))
48 m=$(( i*11 ))
49
50 cat >> $batch_file <<-EOF
51 link add link $h1 name $h1.$vlan \
52 address 00:$m:$m:$m:$m:$m type vlan id $vlan
53 address add 192.0.$m.1/24 dev $h1.$vlan
54 EOF
55 done
56
57 ip -b $batch_file &> /dev/null
58 rm -f $batch_file
59}
60
61rif_mac_profile_replacement_test()
62{
63 local h1_10_mac=$(mac_get $h1.10)
64
65 RET=0
66
67 ip link set $h1.10 address 00:12:34:56:78:99
68 check_err $?
69
70 log_test "RIF MAC profile replacement"
71
72 ip link set $h1.10 address $h1_10_mac
73}
74
75rif_mac_profile_consolidation_test()
76{
77 local count=$1; shift
78 local h1_20_mac
79
80 RET=0
81
82 if [[ $count -eq 1 ]]; then
83 return
84 fi
85
86 h1_20_mac=$(mac_get $h1.20)
87
88 # Set the MAC of $h1.20 to that of $h1.10 and confirm that they are
89 # using the same MAC profile.
90 ip link set $h1.20 address 00:11:11:11:11:11
91 check_err $?
92
93 occ=$(devlink -j resource show $DEVLINK_DEV \
94 | jq '.[][][] | select(.name=="rif_mac_profiles") |.["occ"]')
95
96 [[ $occ -eq $((count - 1)) ]]
97 check_err $? "MAC profile occupancy did not decrease"
98
99 log_test "RIF MAC profile consolidation"
100
101 ip link set $h1.20 address $h1_20_mac
102}
103
104rif_mac_profile_shared_replacement_test()
105{
106 local count=$1; shift
107 local i=$((count + 1))
108 local vlan=$(( i*10 ))
109 local m=11
110
111 RET=0
112
113 # Create a VLAN netdevice that has the same MAC as the first one.
114 ip link add link $h1 name $h1.$vlan address 00:$m:$m:$m:$m:$m \
115 type vlan id $vlan
116 ip address add 192.0.$m.1/24 dev $h1.$vlan
117
118 # MAC replacement should fail because all the MAC profiles are in use
119 # and the profile is shared between multiple RIFs
120 m=$(( i*11 ))
121 ip link set $h1.$vlan address 00:$m:$m:$m:$m:$m &> /dev/null
122 check_fail $?
123
124 log_test "RIF MAC profile shared replacement"
125
126 ip link del dev $h1.$vlan
127}
128
129rif_mac_profile_edit_test()
130{
131 local count=$(devlink_resource_size_get rif_mac_profiles)
132
133 create_max_rif_mac_profiles $count
134
135 rif_mac_profile_replacement_test
136 rif_mac_profile_consolidation_test $count
137 rif_mac_profile_shared_replacement_test $count
138}
139
140trap cleanup EXIT
141
142setup_prepare
143setup_wait
144
145tests_run
146
147exit $EXIT_STATUS