On Tue, Sep 8, 2026 at 11:19 AM Jakub Kicinski <[email protected]> wrote:
>
> napi_id.py intermittently fails to start its helper on Intel and Google
> HW runners:
>
> CMD: /srv/netdev/drivers/net/napi_id_helper 3001::1 37569
> EXIT: 1
> STDERR: bind failed: Cannot assign requested address
>
> Either keep_addr_on_down is not set or more likely the address is
> configured without nodad. Having to make sure that all tests
> always wait for DAD after impacting the link would be a whack-a-mole
> so we expect the env to have nodad and keep_addr_on_down set.
>
> Warn about both while validating the environment, and document this.
> We could fail completely but most tests don't impact the link so for
> quick local testing it'd be annoying to have to apply the settings.
> I hope the warninging stikes the right balance.
>
> Signed-off-by: Jakub Kicinski <[email protected]>
> ---
> Adrian, Sheena, please update the setups scripts for your
> systems. Looks like nodad is missing.
>
> CC: [email protected]
> CC: [email protected]
> CC: [email protected]
> CCL [email protected]
> CC: [email protected]
> CC: [email protected]
> ---
> .../testing/selftests/drivers/net/README.rst | 9 +++++++++
> .../selftests/drivers/net/lib/py/env.py | 19 +++++++++++++++++++
> 2 files changed, 28 insertions(+)
>
> diff --git a/tools/testing/selftests/drivers/net/README.rst
> b/tools/testing/selftests/drivers/net/README.rst
> index c6bed9a985bc..3fe49bce4f3a 100644
> --- a/tools/testing/selftests/drivers/net/README.rst
> +++ b/tools/testing/selftests/drivers/net/README.rst
> @@ -70,6 +70,15 @@ LOCAL_V4, LOCAL_V6, REMOTE_V4, REMOTE_V6
>
> Local and remote endpoint IP addresses.
>
> +Tests reconfigure the device freely, including taking the link down, and
> +expect the addresses to work immediately afterwards. IPv6 needs help::
> +
> + ip -6 address add 2001:db8:1::1/64 dev eth0 nodad
> + sysctl -w net.ipv6.conf.eth0.keep_addr_on_down=1
> +
> +Without those the address is flushed when the link goes down, or spends
> +a second unusable while waiting for DAD to finish.
> +
> LOCAL_PREFIX_V6
> ~~~~~~~~~~~~~~~
>
> diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py
> b/tools/testing/selftests/drivers/net/lib/py/env.py
> index 25903f580b40..6262080a8bf4 100644
> --- a/tools/testing/selftests/drivers/net/lib/py/env.py
> +++ b/tools/testing/selftests/drivers/net/lib/py/env.py
> @@ -239,6 +239,25 @@ from . import bpftool, RtnlFamily, Netlink
> if missing:
> raise Exception("Invalid environment, missing configuration:",
> missing,
> "Please see
> tools/testing/selftests/drivers/net/README.rst")
> + if "LOCAL_V6" in self.env:
> + self._check_v6_env()
> +
> + def _check_v6_env(self):
> + """Tests bind() to LOCAL_V6 and bounce the link, it must survive
> both."""
> + ifname, addr = self.env["NETIF"], self.env["LOCAL_V6"]
> +
> + def _keep_addr(scope):
> + with open(f"/proc/sys/net/ipv6/conf/{scope}/keep_addr_on_down",
> + encoding="utf-8") as fp:
> + return int(fp.read())
> +
> + # 'all' wins when non-zero, see addrconf_ifdown()
> + if (_keep_addr("all") or _keep_addr(ifname)) <= 0:
> + ksft_pr(f"WARN: net.ipv6.conf.{ifname}.keep_addr_on_down not
> set")
> +
> + dev = ip(f"-6 address show dev {ifname} to {addr}", json=True)
> + if not (dev and dev[0]["addr_info"][0].get("nodad")):
> + ksft_pr(f"WARN: LOCAL_V6 {addr} not configured with nodad")
>
> def resolve_remote_ifc(self):
> v4 = v6 = None
> --
> 2.55.0
>
Thanks Jakub. We will update the setup scripts on our end to reflect
this configuration.