From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, michael-dev <michael-dev@fami-braun.de>,
Nikolay Aleksandrov <nikolay@cumulusnetworks.com>,
Roopa Prabhu <roopa@cumulusnetworks.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 5.2 20/56] net: bridge: move default pvid init/deinit to NETDEV_REGISTER/UNREGISTER
Date: Thu, 8 Aug 2019 21:04:46 +0200 [thread overview]
Message-ID: <20190808190453.680894540@linuxfoundation.org> (raw)
In-Reply-To: <20190808190452.867062037@linuxfoundation.org>
From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
[ Upstream commit 091adf9ba6cdb432cbcc217b47e4ffb8aa0d8865 ]
Most of the bridge device's vlan init bugs come from the fact that its
default pvid is created at the wrong time, way too early in ndo_init()
before the device is even assigned an ifindex. It introduces a bug when the
bridge's dev_addr is added as fdb during the initial default pvid creation
the notification has ifindex/NDA_MASTER both equal to 0 (see example below)
which really makes no sense for user-space[0] and is wrong.
Usually user-space software would ignore such entries, but they are
actually valid and will eventually have all necessary attributes.
It makes much more sense to send a notification *after* the device has
registered and has a proper ifindex allocated rather than before when
there's a chance that the registration might still fail or to receive
it with ifindex/NDA_MASTER == 0. Note that we can remove the fdb flush
from br_vlan_flush() since that case can no longer happen. At
NETDEV_REGISTER br->default_pvid is always == 1 as it's initialized by
br_vlan_init() before that and at NETDEV_UNREGISTER it can be anything
depending why it was called (if called due to NETDEV_REGISTER error
it'll still be == 1, otherwise it could be any value changed during the
device life time).
For the demonstration below a small change to iproute2 for printing all fdb
notifications is added, because it contained a workaround not to show
entries with ifindex == 0.
Command executed while monitoring: $ ip l add br0 type bridge
Before (both ifindex and master == 0):
$ bridge monitor fdb
36:7e:8a:b3:56:ba dev * vlan 1 master * permanent
After (proper br0 ifindex):
$ bridge monitor fdb
e6:2a:ae:7a:b7:48 dev br0 vlan 1 master br0 permanent
v4: move only the default pvid init/deinit to NETDEV_REGISTER/UNREGISTER
v3: send the correct v2 patch with all changes (stub should return 0)
v2: on error in br_vlan_init set br->vlgrp to NULL and return 0 in
the br_vlan_bridge_event stub when bridge vlans are disabled
[0] https://bugzilla.kernel.org/show_bug.cgi?id=204389
Reported-by: michael-dev <michael-dev@fami-braun.de>
Fixes: 5be5a2df40f0 ("bridge: Add filtering support for default_pvid")
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
net/bridge/br.c | 5 ++++-
net/bridge/br_private.h | 9 +++++----
net/bridge/br_vlan.c | 34 ++++++++++++++++------------------
3 files changed, 25 insertions(+), 23 deletions(-)
--- a/net/bridge/br.c
+++ b/net/bridge/br.c
@@ -37,12 +37,15 @@ static int br_device_event(struct notifi
int err;
if (dev->priv_flags & IFF_EBRIDGE) {
+ err = br_vlan_bridge_event(dev, event, ptr);
+ if (err)
+ return notifier_from_errno(err);
+
if (event == NETDEV_REGISTER) {
/* register of bridge completed, add sysfs entries */
br_sysfs_addbr(dev);
return NOTIFY_DONE;
}
- br_vlan_bridge_event(dev, event, ptr);
}
/* not a port of a bridge */
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -893,8 +893,8 @@ int nbp_get_num_vlan_infos(struct net_br
void br_vlan_get_stats(const struct net_bridge_vlan *v,
struct br_vlan_stats *stats);
void br_vlan_port_event(struct net_bridge_port *p, unsigned long event);
-void br_vlan_bridge_event(struct net_device *dev, unsigned long event,
- void *ptr);
+int br_vlan_bridge_event(struct net_device *dev, unsigned long event,
+ void *ptr);
static inline struct net_bridge_vlan_group *br_vlan_group(
const struct net_bridge *br)
@@ -1084,9 +1084,10 @@ static inline void br_vlan_port_event(st
{
}
-static inline void br_vlan_bridge_event(struct net_device *dev,
- unsigned long event, void *ptr)
+static inline int br_vlan_bridge_event(struct net_device *dev,
+ unsigned long event, void *ptr)
{
+ return 0;
}
#endif
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -715,11 +715,6 @@ void br_vlan_flush(struct net_bridge *br
ASSERT_RTNL();
- /* delete auto-added default pvid local fdb before flushing vlans
- * otherwise it will be leaked on bridge device init failure
- */
- br_fdb_delete_by_port(br, NULL, 0, 1);
-
vg = br_vlan_group(br);
__vlan_flush(vg);
RCU_INIT_POINTER(br->vlgrp, NULL);
@@ -1048,7 +1043,6 @@ int br_vlan_init(struct net_bridge *br)
{
struct net_bridge_vlan_group *vg;
int ret = -ENOMEM;
- bool changed;
vg = kzalloc(sizeof(*vg), GFP_KERNEL);
if (!vg)
@@ -1063,17 +1057,10 @@ int br_vlan_init(struct net_bridge *br)
br->vlan_proto = htons(ETH_P_8021Q);
br->default_pvid = 1;
rcu_assign_pointer(br->vlgrp, vg);
- ret = br_vlan_add(br, 1,
- BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED |
- BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
- if (ret)
- goto err_vlan_add;
out:
return ret;
-err_vlan_add:
- vlan_tunnel_deinit(vg);
err_tunnel_init:
rhashtable_destroy(&vg->vlan_hash);
err_rhtbl:
@@ -1448,13 +1435,23 @@ static void nbp_vlan_set_vlan_dev_state(
}
/* Must be protected by RTNL. */
-void br_vlan_bridge_event(struct net_device *dev, unsigned long event,
- void *ptr)
+int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
{
struct netdev_notifier_changeupper_info *info;
- struct net_bridge *br;
+ struct net_bridge *br = netdev_priv(dev);
+ bool changed;
+ int ret = 0;
switch (event) {
+ case NETDEV_REGISTER:
+ ret = br_vlan_add(br, br->default_pvid,
+ BRIDGE_VLAN_INFO_PVID |
+ BRIDGE_VLAN_INFO_UNTAGGED |
+ BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
+ break;
+ case NETDEV_UNREGISTER:
+ br_vlan_delete(br, br->default_pvid);
+ break;
case NETDEV_CHANGEUPPER:
info = ptr;
br_vlan_upper_change(dev, info->upper_dev, info->linking);
@@ -1462,12 +1459,13 @@ void br_vlan_bridge_event(struct net_dev
case NETDEV_CHANGE:
case NETDEV_UP:
- br = netdev_priv(dev);
if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING))
- return;
+ break;
br_vlan_link_state_change(dev, br);
break;
}
+
+ return ret;
}
/* Must be protected by RTNL. */
next prev parent reply other threads:[~2019-08-08 19:06 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-08 19:04 [PATCH 5.2 00/56] 5.2.8-stable review Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 01/56] scsi: fcoe: Embed fc_rport_priv in fcoe_rport structure Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 02/56] libnvdimm/bus: Prepare the nd_ioctl() path to be re-entrant Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 03/56] libnvdimm/bus: Fix wait_nvdimm_bus_probe_idle() ABBA deadlock Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 04/56] ALSA: usb-audio: Sanity checks for each pipe and EP types Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 05/56] ALSA: usb-audio: Fix gpf in snd_usb_pipe_sanity_check Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 06/56] HID: wacom: fix bit shift for Cintiq Companion 2 Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 07/56] HID: Add quirk for HP X1200 PIXART OEM mouse Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 08/56] atm: iphase: Fix Spectre v1 vulnerability Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 09/56] bnx2x: Disable multi-cos feature Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 10/56] drivers/net/ethernet/marvell/mvmdio.c: Fix non OF case Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 11/56] ife: error out when nla attributes are empty Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 12/56] ip6_gre: reload ipv6h in prepare_ip6gre_xmit_ipv6 Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 13/56] ip6_tunnel: fix possible use-after-free on xmit Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 14/56] ipip: validate header length in ipip_tunnel_xmit Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 15/56] mlxsw: spectrum: Fix error path in mlxsw_sp_module_init() Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 16/56] mvpp2: fix panic on module removal Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 17/56] mvpp2: refactor MTU change code Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 18/56] net: bridge: delete local fdb on device init failure Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 19/56] net: bridge: mcast: dont delete permanent entries when fast leave is enabled Greg Kroah-Hartman
2019-08-08 19:04 ` Greg Kroah-Hartman [this message]
2019-08-08 19:04 ` [PATCH 5.2 21/56] net: fix ifindex collision during namespace removal Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 22/56] net/mlx5e: always initialize frag->last_in_page Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 23/56] net/mlx5: Use reversed order when unregister devices Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 24/56] net: phy: fixed_phy: print gpio error only if gpio node is present Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 25/56] net: phylink: dont start and stop SGMII PHYs in SFP modules twice Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 26/56] net: phylink: Fix flow control for fixed-link Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 27/56] net: phy: mscc: initialize stats array Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 28/56] net: qualcomm: rmnet: Fix incorrect UL checksum offload logic Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 29/56] net: sched: Fix a possible null-pointer dereference in dequeue_func() Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 30/56] net sched: update vlan action for batched events operations Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 31/56] net: sched: use temporary variable for actions indexes Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 32/56] net/smc: do not schedule tx_work in SMC_CLOSED state Greg Kroah-Hartman
2019-08-08 19:04 ` [PATCH 5.2 33/56] net: stmmac: Use netif_tx_napi_add() for TX polling function Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 34/56] NFC: nfcmrvl: fix gpio-handling regression Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 35/56] ocelot: Cancel delayed work before wq destruction Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 36/56] tipc: compat: allow tipc commands without arguments Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 37/56] tipc: fix unitilized skb list crash Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 38/56] tun: mark small packets as owned by the tap sock Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 39/56] net/mlx5: Fix modify_cq_in alignment Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 40/56] net/mlx5e: Prevent encap flow counter update async to user query Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 41/56] r8169: dont use MSI before RTL8168d Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 42/56] bpf: fix XDP vlan selftests test_xdp_vlan.sh Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 43/56] selftests/bpf: add wrapper scripts for test_xdp_vlan.sh Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 44/56] selftests/bpf: reduce time to execute test_xdp_vlan.sh Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 45/56] net: fix bpf_xdp_adjust_head regression for generic-XDP Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 46/56] hv_sock: Fix hang when a connection is closed Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 47/56] net: phy: fix race in genphy_update_link Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 48/56] net/smc: avoid fallback in case of non-blocking connect Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 49/56] rocker: fix memory leaks of fib_work on two error return paths Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 50/56] mlxsw: spectrum_buffers: Further reduce pool size on Spectrum-2 Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 51/56] net/mlx5: Add missing RDMA_RX capabilities Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 52/56] net/mlx5e: Fix matching of speed to PRM link modes Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 53/56] compat_ioctl: pppoe: fix PPPOEIOCSFWD handling Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 54/56] drm/i915/vbt: Fix VBT parsing for the PSR section Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 55/56] Revert "mac80211: set NETIF_F_LLTX when using intermediate tx queues" Greg Kroah-Hartman
2019-08-08 19:05 ` [PATCH 5.2 56/56] spi: bcm2835: Fix 3-wire mode if DMA is enabled Greg Kroah-Hartman
2019-08-09 0:36 ` [PATCH 5.2 00/56] 5.2.8-stable review shuah
2019-08-09 6:30 ` Greg Kroah-Hartman
2019-08-09 7:45 ` Naresh Kamboju
2019-08-09 8:42 ` Greg Kroah-Hartman
2019-08-09 14:48 ` Thierry Reding
2019-08-09 14:48 ` Thierry Reding
2019-08-09 15:49 ` Greg Kroah-Hartman
2019-08-09 15:37 ` Guenter Roeck
2019-08-09 15:48 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190808190453.680894540@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=michael-dev@fami-braun.de \
--cc=nikolay@cumulusnetworks.com \
--cc=roopa@cumulusnetworks.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.