From: Jakub Kicinski <kuba@kernel.org> Date: 2026-09-08 18:19:58
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 <kuba@kernel.org>
---
Adrian, Sheena, please update the setups scripts for your
systems. Looks like nodad is missing.
CC: adrian.pielech@intel.com
CC: sheenamo@google.com
CC: przemyslaw.kitszel@intel.com
CCL hramamurthy@google.com
CC: shuah@kernel.org
CC: linux-kselftest@vger.kernel.org
---
.../testing/selftests/drivers/net/README.rst | 9 +++++++++
.../selftests/drivers/net/lib/py/env.py | 19 +++++++++++++++++++
2 files changed, 28 insertions(+)
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ from . import bpftool, RtnlFamily, Netlinkifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.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):+withopen(f"/proc/sys/net/ipv6/conf/{scope}/keep_addr_on_down",+encoding="utf-8")asfp:+returnint(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)+ifnot(devanddev[0]["addr_info"][0].get("nodad")):+ksft_pr(f"WARN: LOCAL_V6 {addr} not configured with nodad")defresolve_remote_ifc(self):v4=v6=None
On Tue, Sep 8, 2026 at 11:19 AM Jakub Kicinski [off-list ref] wrote:
quoted hunk
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 <kuba@kernel.org>
---
Adrian, Sheena, please update the setups scripts for your
systems. Looks like nodad is missing.
CC: adrian.pielech@intel.com
CC: sheenamo@google.com
CC: przemyslaw.kitszel@intel.com
CCL hramamurthy@google.com
CC: shuah@kernel.org
CC: linux-kselftest@vger.kernel.org
---
.../testing/selftests/drivers/net/README.rst | 9 +++++++++
.../selftests/drivers/net/lib/py/env.py | 19 +++++++++++++++++++
2 files changed, 28 insertions(+)
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ from . import bpftool, RtnlFamily, Netlinkifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.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):+withopen(f"/proc/sys/net/ipv6/conf/{scope}/keep_addr_on_down",+encoding="utf-8")asfp:+returnint(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)+ifnot(devanddev[0]["addr_info"][0].get("nodad")):+ksft_pr(f"WARN: LOCAL_V6 {addr} not configured with nodad")defresolve_remote_ifc(self):v4=v6=None--
2.55.0
Thanks Jakub. We will update the setup scripts on our end to reflect
this configuration.
Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider:
Critical: 0 · High: 0 · Medium: 1 · Low: 0
- [Medium] The patch documents a new environment invariant
(README.rst:73-80: the local IPv6 address must be added with `nodad`…
--
selftests: drv-net: warn if LOCAL_V6 has DAD or not kept on link down
This documents that the drv-net environment is expected to configure
LOCAL_V6 with nodad and with keep_addr_on_down enabled, and adds a check
in NetDrvEpEnv._check_env() that prints warnings when either is missing.
The motivation is intermittent bind() failures in napi_id.py on HW
runners.
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ class NetDrvEpEnv(NetDrvEnvBase):ifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.env:+self._check_v6_env()
[Severity: Medium]
Do the in-tree environment providers meet the invariant that is being
documented here?
Two cases look like they do not:
1) NetDrvEpEnv.create_local() (the netdevsim path in the same file) adds
the addresses with nodad, but never enables keep_addr_on_down on the
nsim devices or on 'all':
ip(f" addr add dev {self._ns.nsims[0].ifname} {self.nsim_v4_pfx}1/24")
ip(f"-6 addr add dev {self._ns.nsims[0].ifname} {self.nsim_v6_pfx}1/64 nodad")
ip(f" link set dev {self._ns.nsims[0].ifname} up")
Both the devconf_all and per-device defaults are 0, and
addrconf_ifdown() drops permanent global addresses when the aggregate
is not positive:
net/ipv6/addrconf.c:addrconf_ifdown() {
...
int _keep_addr = READ_ONCE(net->ipv6.devconf_all->keep_addr_on_down);
if (!_keep_addr)
_keep_addr = READ_ONCE(idev->cnf.keep_addr_on_down);
keep_addr = (_keep_addr > 0);
...
}
So a test that follows the new documentation and bounces the link
would lose the nsim LOCAL_V6 address. Note also that this path never
reaches _check_v6_env(), since the call is only made from the branch
that requires NETIF, so there is no warning either.
2) tools/testing/selftests/net/lib/ksft_setup_loopback.sh sets up the
env that this code validates, and adds LOCAL_V6 without nodad and
without touching keep_addr_on_down:
ip -netns "${SERVER_NS}" addr add $LOCAL_V6/64 dev server
...
export NETIF=server
Would every run driven by that script now print both new warnings,
pointing at in-tree setup code rather than at a user
misconfiguration? Should the script and create_local() be updated
along with the documentation?
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ class NetDrvEpEnv(NetDrvEnvBase):ifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.env:+self._check_v6_env()
[Severity: Medium]
Do the in-tree environment providers meet the invariant that is being
documented here?
Two cases look like they do not:
1) NetDrvEpEnv.create_local() (the netdevsim path in the same file) adds
the addresses with nodad, but never enables keep_addr_on_down on the
nsim devices or on 'all':
ip(f" addr add dev {self._ns.nsims[0].ifname} {self.nsim_v4_pfx}1/24")
ip(f"-6 addr add dev {self._ns.nsims[0].ifname} {self.nsim_v6_pfx}1/64 nodad")
ip(f" link set dev {self._ns.nsims[0].ifname} up")
Both the devconf_all and per-device defaults are 0, and
addrconf_ifdown() drops permanent global addresses when the aggregate
is not positive:
net/ipv6/addrconf.c:addrconf_ifdown() {
...
int _keep_addr = READ_ONCE(net->ipv6.devconf_all->keep_addr_on_down);
if (!_keep_addr)
_keep_addr = READ_ONCE(idev->cnf.keep_addr_on_down);
keep_addr = (_keep_addr > 0);
...
}
So a test that follows the new documentation and bounces the link
would lose the nsim LOCAL_V6 address. Note also that this path never
reaches _check_v6_env(), since the call is only made from the branch
that requires NETIF, so there is no warning either.
2) tools/testing/selftests/net/lib/ksft_setup_loopback.sh sets up the
env that this code validates, and adds LOCAL_V6 without nodad and
without touching keep_addr_on_down:
ip -netns "${SERVER_NS}" addr add $LOCAL_V6/64 dev server
...
export NETIF=server
Would every run driven by that script now print both new warnings,
pointing at in-tree setup code rather than at a user
misconfiguration? Should the script and create_local() be updated
along with the documentation?
Not sure if and how that script is actually used :S
From: Pielech, Adrian <hidden> Date: 2026-09-11 13:25:50
On 9/9/2026 5:16 AM, Sheena Mohan wrote:
On Tue, Sep 8, 2026 at 11:19 AM Jakub Kicinski [off-list ref] wrote:
quoted
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 <kuba@kernel.org>
---
Adrian, Sheena, please update the setups scripts for your
systems. Looks like nodad is missing.
CC: adrian.pielech@intel.com
CC: sheenamo@google.com
CC: przemyslaw.kitszel@intel.com
CCL hramamurthy@google.com
CC: shuah@kernel.org
CC: linux-kselftest@vger.kernel.org
---
.../testing/selftests/drivers/net/README.rst | 9 +++++++++
.../selftests/drivers/net/lib/py/env.py | 19 +++++++++++++++++++
2 files changed, 28 insertions(+)
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ from . import bpftool, RtnlFamily, Netlinkifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.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):+withopen(f"/proc/sys/net/ipv6/conf/{scope}/keep_addr_on_down",+encoding="utf-8")asfp:+returnint(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)+ifnot(devanddev[0]["addr_info"][0].get("nodad")):+ksft_pr(f"WARN: LOCAL_V6 {addr} not configured with nodad")defresolve_remote_ifc(self):v4=v6=None--
2.55.0
Thanks Jakub. We will update the setup scripts on our end to reflect
this configuration.
Applied to the setups, thanks for noticing about that requirement!
On Fri, Sep 11, 2026 at 6:25 AM Pielech, Adrian
[off-list ref] wrote:
On 9/9/2026 5:16 AM, Sheena Mohan wrote:
quoted
On Tue, Sep 8, 2026 at 11:19 AM Jakub Kicinski [off-list ref] wrote:
quoted
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 <kuba@kernel.org>
---
Adrian, Sheena, please update the setups scripts for your
systems. Looks like nodad is missing.
CC: adrian.pielech@intel.com
CC: sheenamo@google.com
CC: przemyslaw.kitszel@intel.com
CCL hramamurthy@google.com
CC: shuah@kernel.org
CC: linux-kselftest@vger.kernel.org
---
.../testing/selftests/drivers/net/README.rst | 9 +++++++++
.../selftests/drivers/net/lib/py/env.py | 19 +++++++++++++++++++
2 files changed, 28 insertions(+)
@@ -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 ~~~~~~~~~~~~~~~
@@ -239,6 +239,25 @@ from . import bpftool, RtnlFamily, Netlinkifmissing:raiseException("Invalid environment, missing configuration:",missing,"Please see tools/testing/selftests/drivers/net/README.rst")+if"LOCAL_V6"inself.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):+withopen(f"/proc/sys/net/ipv6/conf/{scope}/keep_addr_on_down",+encoding="utf-8")asfp:+returnint(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)+ifnot(devanddev[0]["addr_info"][0].get("nodad")):+ksft_pr(f"WARN: LOCAL_V6 {addr} not configured with nodad")defresolve_remote_ifc(self):v4=v6=None--
2.55.0
Thanks Jakub. We will update the setup scripts on our end to reflect
this configuration.
Applied to the setups, thanks for noticing about that requirement!
GVE and IDPF executor test setups are now updated.