Skip to content

Commit 6532673

Browse files
committed
Merge branch 'net-netdevsim-fix-inconsistent-carrier-state-after-link-unlink'
Yohei Kojima says: ==================== net: netdevsim: fix inconsistent carrier state after link/unlink This series fixes netdevsim's inconsistent behavior between carrier and link/unlink state. More specifically, this fixes a bug that the carrier goes DOWN although two netdevsim were peered, depending on the order of peering and ifup. Especially in a NetworkManager-enabled environment, netdevsim test fails because of this. The first patch fixes the bug itself in netdevsim/bus.c by adding netif_carrier_on() into a proper function. The second patch adds a regression test for this bug. ==================== Link: https://patch.msgid.link/cover.1767624906.git.yk@y-koj.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 353cfc0 + 75df712 commit 6532673

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

  • drivers/net/netdevsim
  • tools/testing/selftests/drivers/net/netdevsim

drivers/net/netdevsim/bus.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@ static ssize_t link_device_store(const struct bus_type *bus, const char *buf, si
332332
rcu_assign_pointer(nsim_a->peer, nsim_b);
333333
rcu_assign_pointer(nsim_b->peer, nsim_a);
334334

335+
if (netif_running(dev_a) && netif_running(dev_b)) {
336+
netif_carrier_on(dev_a);
337+
netif_carrier_on(dev_b);
338+
}
339+
335340
out_err:
336341
put_net(ns_b);
337342
put_net(ns_a);
@@ -381,6 +386,9 @@ static ssize_t unlink_device_store(const struct bus_type *bus, const char *buf,
381386
if (!peer)
382387
goto out_put_netns;
383388

389+
netif_carrier_off(dev);
390+
netif_carrier_off(peer->netdev);
391+
384392
err = 0;
385393
RCU_INIT_POINTER(nsim->peer, NULL);
386394
RCU_INIT_POINTER(peer->peer, NULL);

tools/testing/selftests/drivers/net/netdevsim/peer.sh

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,39 @@ cleanup_ns()
5252
ip netns del nssv
5353
}
5454

55+
is_carrier_up()
56+
{
57+
local netns="$1"
58+
local nsim_dev="$2"
59+
60+
test "$(ip netns exec "$netns" \
61+
cat /sys/class/net/"$nsim_dev"/carrier 2>/dev/null)" -eq 1
62+
}
63+
64+
assert_carrier_up()
65+
{
66+
local netns="$1"
67+
local nsim_dev="$2"
68+
69+
if ! is_carrier_up "$netns" "$nsim_dev"; then
70+
echo "$nsim_dev's carrier should be UP, but it isn't"
71+
cleanup_ns
72+
exit 1
73+
fi
74+
}
75+
76+
assert_carrier_down()
77+
{
78+
local netns="$1"
79+
local nsim_dev="$2"
80+
81+
if is_carrier_up "$netns" "$nsim_dev"; then
82+
echo "$nsim_dev's carrier should be DOWN, but it isn't"
83+
cleanup_ns
84+
exit 1
85+
fi
86+
}
87+
5588
###
5689
### Code start
5790
###
@@ -113,6 +146,32 @@ if [ $? -eq 0 ]; then
113146
exit 1
114147
fi
115148

149+
# netdevsim carrier state consistency checking
150+
assert_carrier_up nssv "$NSIM_DEV_1_NAME"
151+
assert_carrier_up nscl "$NSIM_DEV_2_NAME"
152+
153+
echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > "$NSIM_DEV_SYS_UNLINK"
154+
155+
assert_carrier_down nssv "$NSIM_DEV_1_NAME"
156+
assert_carrier_down nscl "$NSIM_DEV_2_NAME"
157+
158+
ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" down
159+
ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up
160+
161+
assert_carrier_down nssv "$NSIM_DEV_1_NAME"
162+
assert_carrier_down nscl "$NSIM_DEV_2_NAME"
163+
164+
echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK
165+
166+
assert_carrier_up nssv "$NSIM_DEV_1_NAME"
167+
assert_carrier_up nscl "$NSIM_DEV_2_NAME"
168+
169+
ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" down
170+
ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up
171+
172+
assert_carrier_up nssv "$NSIM_DEV_1_NAME"
173+
assert_carrier_up nscl "$NSIM_DEV_2_NAME"
174+
116175
# send/recv packets
117176

118177
tmp_file=$(mktemp)

0 commit comments

Comments
 (0)