Skip to content

Commit a321831

Browse files
liujian56gregkh
authored andcommitted
net: check vlan filter feature in vlan_vids_add_by_dev() and vlan_vids_del_by_dev()
[ Upstream commit 01a564b ] I got the below warning trace: WARNING: CPU: 4 PID: 4056 at net/core/dev.c:11066 unregister_netdevice_many_notify CPU: 4 PID: 4056 Comm: ip Not tainted 6.7.0-rc4+ khadas#15 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014 RIP: 0010:unregister_netdevice_many_notify+0x9a4/0x9b0 Call Trace: rtnl_dellink rtnetlink_rcv_msg netlink_rcv_skb netlink_unicast netlink_sendmsg __sock_sendmsg ____sys_sendmsg ___sys_sendmsg __sys_sendmsg do_syscall_64 entry_SYSCALL_64_after_hwframe It can be repoduced via: ip netns add ns1 ip netns exec ns1 ip link add bond0 type bond mode 0 ip netns exec ns1 ip link add bond_slave_1 type veth peer veth2 ip netns exec ns1 ip link set bond_slave_1 master bond0 [1] ip netns exec ns1 ethtool -K bond0 rx-vlan-filter off [2] ip netns exec ns1 ip link add link bond_slave_1 name bond_slave_1.0 type vlan id 0 [3] ip netns exec ns1 ip link add link bond0 name bond0.0 type vlan id 0 [4] ip netns exec ns1 ip link set bond_slave_1 nomaster [5] ip netns exec ns1 ip link del veth2 ip netns del ns1 This is all caused by command [1] turning off the rx-vlan-filter function of bond0. The reason is the same as commit 01f4fd2 ("bonding: Fix incorrect deletion of ETH_P_8021AD protocol vid from slaves"). Commands [2] [3] add the same vid to slave and master respectively, causing command [4] to empty slave->vlan_info. The following command [5] triggers this problem. To fix this problem, we should add VLAN_FILTER feature checks in vlan_vids_add_by_dev() and vlan_vids_del_by_dev() to prevent incorrect addition or deletion of vlan_vid information. Fixes: 348a144 ("vlan: introduce functions to do mass addition/deletion of vids by another device") Signed-off-by: Liu Jian <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 12e5a47 commit a321831

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

net/8021q/vlan_core.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,8 @@ int vlan_vids_add_by_dev(struct net_device *dev,
406406
return 0;
407407

408408
list_for_each_entry(vid_info, &vlan_info->vid_list, list) {
409+
if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
410+
continue;
409411
err = vlan_vid_add(dev, vid_info->proto, vid_info->vid);
410412
if (err)
411413
goto unwind;
@@ -416,6 +418,8 @@ int vlan_vids_add_by_dev(struct net_device *dev,
416418
list_for_each_entry_continue_reverse(vid_info,
417419
&vlan_info->vid_list,
418420
list) {
421+
if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
422+
continue;
419423
vlan_vid_del(dev, vid_info->proto, vid_info->vid);
420424
}
421425

@@ -435,8 +439,11 @@ void vlan_vids_del_by_dev(struct net_device *dev,
435439
if (!vlan_info)
436440
return;
437441

438-
list_for_each_entry(vid_info, &vlan_info->vid_list, list)
442+
list_for_each_entry(vid_info, &vlan_info->vid_list, list) {
443+
if (!vlan_hw_filter_capable(by_dev, vid_info->proto))
444+
continue;
439445
vlan_vid_del(dev, vid_info->proto, vid_info->vid);
446+
}
440447
}
441448
EXPORT_SYMBOL(vlan_vids_del_by_dev);
442449

0 commit comments

Comments
 (0)