Message ID | 20241209140151.231257-6-shaw.leon@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Johannes Berg |
Headers | show |
Series | net: Improve netns handling in RTNL and ip_tunnel | expand |
On 12/9/24 15:01, Xiao Liang wrote: > - Add test for creating link in another netns when a link of the same > name and ifindex exists in current netns. > - Add test for link netns atomicity - create link directly in target > netns, and no notifications should be generated in current netns. > > Signed-off-by: Xiao Liang <shaw.leon@gmail.com> > --- > tools/testing/selftests/net/Makefile | 1 + > tools/testing/selftests/net/netns-name.sh | 10 ++++++ > tools/testing/selftests/net/netns_atomic.py | 39 +++++++++++++++++++++ > 3 files changed, 50 insertions(+) > create mode 100755 tools/testing/selftests/net/netns_atomic.py > > diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile > index cb2fc601de66..f9f7a765d645 100644 > --- a/tools/testing/selftests/net/Makefile > +++ b/tools/testing/selftests/net/Makefile > @@ -34,6 +34,7 @@ TEST_PROGS += gre_gso.sh > TEST_PROGS += cmsg_so_mark.sh > TEST_PROGS += cmsg_time.sh cmsg_ipv6.sh > TEST_PROGS += netns-name.sh > +TEST_PROGS += netns_atomic.py > TEST_PROGS += nl_netdev.py > TEST_PROGS += srv6_end_dt46_l3vpn_test.sh > TEST_PROGS += srv6_end_dt4_l3vpn_test.sh > diff --git a/tools/testing/selftests/net/netns-name.sh b/tools/testing/selftests/net/netns-name.sh > index 6974474c26f3..0be1905d1f2f 100755 > --- a/tools/testing/selftests/net/netns-name.sh > +++ b/tools/testing/selftests/net/netns-name.sh > @@ -78,6 +78,16 @@ ip -netns $NS link show dev $ALT_NAME 2> /dev/null && > fail "Can still find alt-name after move" > ip -netns $test_ns link del $DEV || fail > > +# > +# Test no conflict of the same name/ifindex in different netns > +# > +ip -netns $NS link add name $DEV index 100 type dummy || fail > +ip -netns $NS link add netns $test_ns name $DEV index 100 type dummy || > + fail "Can create in netns without moving" > +ip -netns $test_ns link show dev $DEV >> /dev/null || fail "Device not found" > +ip -netns $NS link del $DEV || fail > +ip -netns $test_ns link del $DEV || fail > + > echo -ne "$(basename $0) \t\t\t\t" > if [ $RET_CODE -eq 0 ]; then > echo "[ OK ]" > diff --git a/tools/testing/selftests/net/netns_atomic.py b/tools/testing/selftests/net/netns_atomic.py > new file mode 100755 > index 000000000000..d350a3fc0a91 > --- /dev/null > +++ b/tools/testing/selftests/net/netns_atomic.py > @@ -0,0 +1,39 @@ > +#!/usr/bin/env python3 > +# SPDX-License-Identifier: GPL-2.0 > + > +import time > + > +from lib.py import ksft_run, ksft_exit, ksft_true > +from lib.py import ip > +from lib.py import NetNS, NetNSEnter > +from lib.py import RtnlFamily > + > + > +def test_event(ns1, ns2) -> None: > + with NetNSEnter(str(ns1)): > + rtnl = RtnlFamily() > + > + rtnl.ntf_subscribe("rtnlgrp-link") > + > + ip(f"netns set {ns1} 0", ns=str(ns2)) > + > + ip(f"link add netns {ns2} link-netnsid 0 dummy1 type dummy") > + ip(f"link add netns {ns2} dummy2 type dummy", ns=str(ns1)) > + > + ip("link del dummy1", ns=str(ns2)) > + ip("link del dummy2", ns=str(ns2)) > + > + time.sleep(1) > + rtnl.check_ntf() > + ksft_true(rtnl.async_msg_queue.empty(), > + "Received unexpected link notification") I think we need a much larger coverage here, possibly testing all the update drivers and more 'netns', 'link-netnsid', 'peer netns' permutations for the devices that allow them. Thanks, Paolo
On Thu, Dec 12, 2024 at 5:40 PM Paolo Abeni <pabeni@redhat.com> wrote: > > On 12/9/24 15:01, Xiao Liang wrote: > > - Add test for creating link in another netns when a link of the same > > name and ifindex exists in current netns. > > - Add test for link netns atomicity - create link directly in target > > netns, and no notifications should be generated in current netns. > > > > Signed-off-by: Xiao Liang <shaw.leon@gmail.com> > > --- > > tools/testing/selftests/net/Makefile | 1 + > > tools/testing/selftests/net/netns-name.sh | 10 ++++++ > > tools/testing/selftests/net/netns_atomic.py | 39 +++++++++++++++++++++ > > 3 files changed, 50 insertions(+) > > create mode 100755 tools/testing/selftests/net/netns_atomic.py > > > > diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile > > index cb2fc601de66..f9f7a765d645 100644 > > --- a/tools/testing/selftests/net/Makefile > > +++ b/tools/testing/selftests/net/Makefile > > @@ -34,6 +34,7 @@ TEST_PROGS += gre_gso.sh > > TEST_PROGS += cmsg_so_mark.sh > > TEST_PROGS += cmsg_time.sh cmsg_ipv6.sh > > TEST_PROGS += netns-name.sh > > +TEST_PROGS += netns_atomic.py > > TEST_PROGS += nl_netdev.py > > TEST_PROGS += srv6_end_dt46_l3vpn_test.sh > > TEST_PROGS += srv6_end_dt4_l3vpn_test.sh > > diff --git a/tools/testing/selftests/net/netns-name.sh b/tools/testing/selftests/net/netns-name.sh > > index 6974474c26f3..0be1905d1f2f 100755 > > --- a/tools/testing/selftests/net/netns-name.sh > > +++ b/tools/testing/selftests/net/netns-name.sh > > @@ -78,6 +78,16 @@ ip -netns $NS link show dev $ALT_NAME 2> /dev/null && > > fail "Can still find alt-name after move" > > ip -netns $test_ns link del $DEV || fail > > > > +# > > +# Test no conflict of the same name/ifindex in different netns > > +# > > +ip -netns $NS link add name $DEV index 100 type dummy || fail > > +ip -netns $NS link add netns $test_ns name $DEV index 100 type dummy || > > + fail "Can create in netns without moving" > > +ip -netns $test_ns link show dev $DEV >> /dev/null || fail "Device not found" > > +ip -netns $NS link del $DEV || fail > > +ip -netns $test_ns link del $DEV || fail > > + > > echo -ne "$(basename $0) \t\t\t\t" > > if [ $RET_CODE -eq 0 ]; then > > echo "[ OK ]" > > diff --git a/tools/testing/selftests/net/netns_atomic.py b/tools/testing/selftests/net/netns_atomic.py > > new file mode 100755 > > index 000000000000..d350a3fc0a91 > > --- /dev/null > > +++ b/tools/testing/selftests/net/netns_atomic.py > > @@ -0,0 +1,39 @@ > > +#!/usr/bin/env python3 > > +# SPDX-License-Identifier: GPL-2.0 > > + > > +import time > > + > > +from lib.py import ksft_run, ksft_exit, ksft_true > > +from lib.py import ip > > +from lib.py import NetNS, NetNSEnter > > +from lib.py import RtnlFamily > > + > > + > > +def test_event(ns1, ns2) -> None: > > + with NetNSEnter(str(ns1)): > > + rtnl = RtnlFamily() > > + > > + rtnl.ntf_subscribe("rtnlgrp-link") > > + > > + ip(f"netns set {ns1} 0", ns=str(ns2)) > > + > > + ip(f"link add netns {ns2} link-netnsid 0 dummy1 type dummy") > > + ip(f"link add netns {ns2} dummy2 type dummy", ns=str(ns1)) > > + > > + ip("link del dummy1", ns=str(ns2)) > > + ip("link del dummy2", ns=str(ns2)) > > + > > + time.sleep(1) > > + rtnl.check_ntf() > > + ksft_true(rtnl.async_msg_queue.empty(), > > + "Received unexpected link notification") > > I think we need a much larger coverage here, possibly testing all the > update drivers and more 'netns', 'link-netnsid', 'peer netns' > permutations for the devices that allow them. OK, I will add more cases. But I'm afraid I don't know how to build valid parameters for all of them, and some seem to require hardware. > > Thanks, > > Paolo >
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index cb2fc601de66..f9f7a765d645 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -34,6 +34,7 @@ TEST_PROGS += gre_gso.sh TEST_PROGS += cmsg_so_mark.sh TEST_PROGS += cmsg_time.sh cmsg_ipv6.sh TEST_PROGS += netns-name.sh +TEST_PROGS += netns_atomic.py TEST_PROGS += nl_netdev.py TEST_PROGS += srv6_end_dt46_l3vpn_test.sh TEST_PROGS += srv6_end_dt4_l3vpn_test.sh diff --git a/tools/testing/selftests/net/netns-name.sh b/tools/testing/selftests/net/netns-name.sh index 6974474c26f3..0be1905d1f2f 100755 --- a/tools/testing/selftests/net/netns-name.sh +++ b/tools/testing/selftests/net/netns-name.sh @@ -78,6 +78,16 @@ ip -netns $NS link show dev $ALT_NAME 2> /dev/null && fail "Can still find alt-name after move" ip -netns $test_ns link del $DEV || fail +# +# Test no conflict of the same name/ifindex in different netns +# +ip -netns $NS link add name $DEV index 100 type dummy || fail +ip -netns $NS link add netns $test_ns name $DEV index 100 type dummy || + fail "Can create in netns without moving" +ip -netns $test_ns link show dev $DEV >> /dev/null || fail "Device not found" +ip -netns $NS link del $DEV || fail +ip -netns $test_ns link del $DEV || fail + echo -ne "$(basename $0) \t\t\t\t" if [ $RET_CODE -eq 0 ]; then echo "[ OK ]" diff --git a/tools/testing/selftests/net/netns_atomic.py b/tools/testing/selftests/net/netns_atomic.py new file mode 100755 index 000000000000..d350a3fc0a91 --- /dev/null +++ b/tools/testing/selftests/net/netns_atomic.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 + +import time + +from lib.py import ksft_run, ksft_exit, ksft_true +from lib.py import ip +from lib.py import NetNS, NetNSEnter +from lib.py import RtnlFamily + + +def test_event(ns1, ns2) -> None: + with NetNSEnter(str(ns1)): + rtnl = RtnlFamily() + + rtnl.ntf_subscribe("rtnlgrp-link") + + ip(f"netns set {ns1} 0", ns=str(ns2)) + + ip(f"link add netns {ns2} link-netnsid 0 dummy1 type dummy") + ip(f"link add netns {ns2} dummy2 type dummy", ns=str(ns1)) + + ip("link del dummy1", ns=str(ns2)) + ip("link del dummy2", ns=str(ns2)) + + time.sleep(1) + rtnl.check_ntf() + ksft_true(rtnl.async_msg_queue.empty(), + "Received unexpected link notification") + + +def main() -> None: + with NetNS() as ns1, NetNS() as ns2: + ksft_run([test_event], args=(ns1, ns2)) + ksft_exit() + + +if __name__ == "__main__": + main()
- Add test for creating link in another netns when a link of the same name and ifindex exists in current netns. - Add test for link netns atomicity - create link directly in target netns, and no notifications should be generated in current netns. Signed-off-by: Xiao Liang <shaw.leon@gmail.com> --- tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/netns-name.sh | 10 ++++++ tools/testing/selftests/net/netns_atomic.py | 39 +++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100755 tools/testing/selftests/net/netns_atomic.py