[PATCH net-next 3/5] selftest: netdevsim: test carrier change via sysfs

From: Íñigo Huguet

Date: Sun May 10 2026 - 12:47:57 EST


The previous commits allowed to change the carrier state via the sysfs
carrier attribute and to get the carrier state via ethtool. Add
selftest for it.

Signed-off-by: Íñigo Huguet <ihuguet@xxxxxxxxxx>
---
.../selftests/drivers/net/netdevsim/peer.sh | 59 +++++++++++++++----
1 file changed, 48 insertions(+), 11 deletions(-)

diff --git a/tools/testing/selftests/drivers/net/netdevsim/peer.sh b/tools/testing/selftests/drivers/net/netdevsim/peer.sh
index f4721f7636dd..5e7b6c1d0bfb 100755
--- a/tools/testing/selftests/drivers/net/netdevsim/peer.sh
+++ b/tools/testing/selftests/drivers/net/netdevsim/peer.sh
@@ -52,21 +52,17 @@ cleanup_ns()
ip netns del nssv
}

-is_carrier_up()
-{
- local netns="$1"
- local nsim_dev="$2"
-
- test "$(ip netns exec "$netns" \
- cat /sys/class/net/"$nsim_dev"/carrier 2>/dev/null)" -eq 1
-}
-
assert_carrier_up()
{
local netns="$1"
local nsim_dev="$2"

- if ! is_carrier_up "$netns" "$nsim_dev"; then
+ local sysfs_carrier="$(ip netns exec "$netns" \
+ cat /sys/class/net/"$nsim_dev"/carrier 2>/dev/null)"
+ local ethtool_carrier="$(ip netns exec "$netns" \
+ ethtool -j "$nsim_dev" | jq '.[0]["link-detected"]' 2>/dev/null)"
+
+ if [ "$sysfs_carrier" -ne 1 -o "$ethtool_carrier" != "true" ]; then
echo "$nsim_dev's carrier should be UP, but it isn't"
cleanup_ns
exit 1
@@ -78,13 +74,36 @@ assert_carrier_down()
local netns="$1"
local nsim_dev="$2"

- if is_carrier_up "$netns" "$nsim_dev"; then
+ local sysfs_carrier="$(ip netns exec "$netns" \
+ cat /sys/class/net/"$nsim_dev"/carrier 2>/dev/null)"
+ local ethtool_carrier="$(ip netns exec "$netns" \
+ ethtool -j "$nsim_dev" | jq '.[0]["link-detected"]' 2>/dev/null)"
+
+ if [ "$sysfs_carrier" -ne 0 -o "$ethtool_carrier" != "false" ]; then
echo "$nsim_dev's carrier should be DOWN, but it isn't"
cleanup_ns
exit 1
fi
}

+set_carrier_up()
+{
+ local netns="$1"
+ local nsim_dev="$2"
+
+ ip netns exec "$netns" \
+ sh -c "echo 1 > /sys/class/net/$nsim_dev/carrier" 2>/dev/null
+}
+
+set_carrier_down()
+{
+ local netns="$1"
+ local nsim_dev="$2"
+
+ ip netns exec "$netns" \
+ sh -c "echo 0 > /sys/class/net/$nsim_dev/carrier" 2>/dev/null
+}
+
###
### Code start
###
@@ -161,6 +180,14 @@ ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up
assert_carrier_down nssv "$NSIM_DEV_1_NAME"
assert_carrier_down nscl "$NSIM_DEV_2_NAME"

+set_carrier_up nssv "$NSIM_DEV_1_NAME"
+
+assert_carrier_up nssv "$NSIM_DEV_1_NAME"
+assert_carrier_down nscl "$NSIM_DEV_2_NAME"
+
+set_carrier_down nssv "$NSIM_DEV_1_NAME"
+assert_carrier_down nssv "$NSIM_DEV_1_NAME"
+
echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK

assert_carrier_up nssv "$NSIM_DEV_1_NAME"
@@ -172,6 +199,16 @@ ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up
assert_carrier_up nssv "$NSIM_DEV_1_NAME"
assert_carrier_up nscl "$NSIM_DEV_2_NAME"

+set_carrier_down nssv "$NSIM_DEV_1_NAME"
+
+assert_carrier_down nssv "$NSIM_DEV_1_NAME"
+assert_carrier_down nscl "$NSIM_DEV_2_NAME"
+
+set_carrier_up nscl "$NSIM_DEV_2_NAME"
+
+assert_carrier_up nssv "$NSIM_DEV_1_NAME"
+assert_carrier_up nscl "$NSIM_DEV_2_NAME"
+
# send/recv packets

tmp_file=$(mktemp)
--
2.53.0