selftests: rtnetlink: Add an address proto test
authorPetr Machata <petrm@nvidia.com>
Tue, 21 Mar 2023 11:52:01 +0000 (12:52 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Mar 2023 08:32:52 +0000 (08:32 +0000)
Add coverage of "ip address {add,replace} ... proto" support.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/rtnetlink.sh

index 12caf96..3b15c68 100755 (executable)
@@ -26,6 +26,7 @@ ALL_TESTS="
        kci_test_fdb_get
        kci_test_neigh_get
        kci_test_bridge_parent_id
+       kci_test_address_proto
 "
 
 devdummy="test-dummy0"
@@ -1249,6 +1250,96 @@ kci_test_bridge_parent_id()
        echo "PASS: bridge_parent_id"
 }
 
+address_get_proto()
+{
+       local addr=$1; shift
+
+       ip -N -j address show dev "$devdummy" |
+           jq -e -r --arg addr "${addr%/*}" \
+              '.[].addr_info[] | select(.local == $addr) | .protocol'
+}
+
+address_count()
+{
+       ip -N -j address show dev "$devdummy" "$@" |
+           jq -e -r '[.[].addr_info[] | .local | select(. != null)] | length'
+}
+
+do_test_address_proto()
+{
+       local what=$1; shift
+       local addr=$1; shift
+       local addr2=${addr%/*}2/${addr#*/}
+       local addr3=${addr%/*}3/${addr#*/}
+       local proto
+       local count
+       local ret=0
+       local err
+
+       ip address add dev "$devdummy" "$addr3"
+       check_err $?
+       proto=$(address_get_proto "$addr3")
+       [[ "$proto" == null ]]
+       check_err $?
+
+       ip address add dev "$devdummy" "$addr2" proto 0x99
+       check_err $?
+       proto=$(address_get_proto "$addr2")
+       [[ "$proto" == 0x99 ]]
+       check_err $?
+
+       ip address add dev "$devdummy" "$addr" proto 0xab
+       check_err $?
+       proto=$(address_get_proto "$addr")
+       [[ "$proto" == 0xab ]]
+       check_err $?
+
+       ip address replace dev "$devdummy" "$addr" proto 0x11
+       proto=$(address_get_proto "$addr")
+       check_err $?
+       [[ "$proto" == 0x11 ]]
+       check_err $?
+
+       count=$(address_count)
+       check_err $?
+       (( count == 3 )) # $addr, $addr2 and $addr3
+
+       count=$(address_count proto 0)
+       check_err $?
+       (( count == 1 )) # just $addr2
+
+       count=$(address_count proto 0x11)
+       check_err $?
+       (( count == 2 )) # $addr and $addr2
+
+       count=$(address_count proto 0xab)
+       check_err $?
+       (( count == 1 )) # just $addr2
+
+       ip address del dev "$devdummy" "$addr"
+       ip address del dev "$devdummy" "$addr2"
+       ip address del dev "$devdummy" "$addr3"
+
+       if [ $ret -ne 0 ]; then
+               echo "FAIL: address proto $what"
+               return 1
+       fi
+       echo "PASS: address proto $what"
+}
+
+kci_test_address_proto()
+{
+       local ret=0
+
+       do_test_address_proto IPv4 192.0.2.1/28
+       check_err $?
+
+       do_test_address_proto IPv6 2001:db8:1::1/64
+       check_err $?
+
+       return $ret
+}
+
 kci_test_rtnl()
 {
        local current_test