Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/rtnetlink.sh: add mngtempaddr test

Add a test to check the temporary address could be added/removed
correctly when mngtempaddr is set or removed/unmanaged.

Signed-off-by: Sam Edwards <cfsworks@gmail.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Hangbin Liu and committed by
Paolo Abeni
f6e1dcd6 00b5b7aa

+95
+95
tools/testing/selftests/net/rtnetlink.sh
··· 29 29 kci_test_bridge_parent_id 30 30 kci_test_address_proto 31 31 kci_test_enslave_bonding 32 + kci_test_mngtmpaddr 32 33 " 33 34 34 35 devdummy="test-dummy0" ··· 45 44 if [ $ret -eq 0 ]; then 46 45 ret=$1 47 46 fi 47 + [ -n "$2" ] && echo "$2" 48 48 } 49 49 50 50 # same but inverted -- used when command must fail for test to pass ··· 1239 1237 1240 1238 end_test "PASS: enslave interface in a bond" 1241 1239 ip netns del "$testns" 1240 + } 1241 + 1242 + # Called to validate the addresses on $IFNAME: 1243 + # 1244 + # 1. Every `temporary` address must have a matching `mngtmpaddr` 1245 + # 2. Every `mngtmpaddr` address must have some un`deprecated` `temporary` 1246 + # 1247 + # If the mngtmpaddr or tempaddr checking failed, return 0 and stop slowwait 1248 + validate_mngtmpaddr() 1249 + { 1250 + local dev=$1 1251 + local prefix="" 1252 + local addr_list=$(ip -j -n $testns addr show dev ${dev}) 1253 + local temp_addrs=$(echo ${addr_list} | \ 1254 + jq -r '.[].addr_info[] | select(.temporary == true) | .local') 1255 + local mng_prefixes=$(echo ${addr_list} | \ 1256 + jq -r '.[].addr_info[] | select(.mngtmpaddr == true) | .local' | \ 1257 + cut -d: -f1-4 | tr '\n' ' ') 1258 + local undep_prefixes=$(echo ${addr_list} | \ 1259 + jq -r '.[].addr_info[] | select(.temporary == true and .deprecated != true) | .local' | \ 1260 + cut -d: -f1-4 | tr '\n' ' ') 1261 + 1262 + # 1. All temporary addresses (temp and dep) must have a matching mngtmpaddr 1263 + for address in ${temp_addrs}; do 1264 + prefix=$(echo ${address} | cut -d: -f1-4) 1265 + if [[ ! " ${mng_prefixes} " =~ " $prefix " ]]; then 1266 + check_err 1 "FAIL: Temporary $address with no matching mngtmpaddr!"; 1267 + return 0 1268 + fi 1269 + done 1270 + 1271 + # 2. All mngtmpaddr addresses must have a temporary address (not dep) 1272 + for prefix in ${mng_prefixes}; do 1273 + if [[ ! " ${undep_prefixes} " =~ " $prefix " ]]; then 1274 + check_err 1 "FAIL: No undeprecated temporary in $prefix!"; 1275 + return 0 1276 + fi 1277 + done 1278 + 1279 + return 1 1280 + } 1281 + 1282 + kci_test_mngtmpaddr() 1283 + { 1284 + local ret=0 1285 + 1286 + setup_ns testns 1287 + if [ $? -ne 0 ]; then 1288 + end_test "SKIP mngtmpaddr tests: cannot add net namespace $testns" 1289 + return $ksft_skip 1290 + fi 1291 + 1292 + # 1. Create a dummy Ethernet interface 1293 + run_cmd ip -n $testns link add ${devdummy} type dummy 1294 + run_cmd ip -n $testns link set ${devdummy} up 1295 + run_cmd ip netns exec $testns sysctl -w net.ipv6.conf.${devdummy}.use_tempaddr=1 1296 + run_cmd ip netns exec $testns sysctl -w net.ipv6.conf.${devdummy}.temp_prefered_lft=10 1297 + run_cmd ip netns exec $testns sysctl -w net.ipv6.conf.${devdummy}.temp_valid_lft=25 1298 + run_cmd ip netns exec $testns sysctl -w net.ipv6.conf.${devdummy}.max_desync_factor=1 1299 + 1300 + # 2. Create several mngtmpaddr addresses on that interface. 1301 + # with temp_*_lft configured to be pretty short (10 and 35 seconds 1302 + # for prefer/valid respectively) 1303 + for i in $(seq 1 9); do 1304 + run_cmd ip -n $testns addr add 2001:db8:7e57:${i}::1/64 mngtmpaddr dev ${devdummy} 1305 + done 1306 + 1307 + # 3. Confirm that a preferred temporary address exists for each mngtmpaddr 1308 + # address at all times, polling once per second for 30 seconds. 1309 + slowwait 30 validate_mngtmpaddr ${devdummy} 1310 + 1311 + # 4. Delete each mngtmpaddr address, one at a time (alternating between 1312 + # deleting and merely un-mngtmpaddr-ing), and confirm that the other 1313 + # mngtmpaddr addresses still have preferred temporaries. 1314 + for i in $(seq 1 9); do 1315 + (( $i % 4 == 0 )) && mng_flag="mngtmpaddr" || mng_flag="" 1316 + if (( $i % 2 == 0 )); then 1317 + run_cmd ip -n $testns addr del 2001:db8:7e57:${i}::1/64 $mng_flag dev ${devdummy} 1318 + else 1319 + run_cmd ip -n $testns addr change 2001:db8:7e57:${i}::1/64 dev ${devdummy} 1320 + fi 1321 + # the temp addr should be deleted 1322 + validate_mngtmpaddr ${devdummy} 1323 + done 1324 + 1325 + if [ $ret -ne 0 ]; then 1326 + end_test "FAIL: mngtmpaddr add/remove incorrect" 1327 + else 1328 + end_test "PASS: mngtmpaddr add/remove correctly" 1329 + fi 1330 + 1331 + ip netns del "$testns" 1332 + return $ret 1242 1333 } 1243 1334 1244 1335 kci_test_rtnl()