Message ID | 20210127010028.1619443-2-olteanv@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Automatically manage DSA master interface state | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 3 maintainers not CCed: corbet@lwn.net linux-doc@vger.kernel.org rdunlap@infradead.org |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 26 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
netdev/stable | success | Stable not CCed |
On Wed, Jan 27, 2021 at 03:00:25AM +0200, Vladimir Oltean wrote: > From: Vladimir Oltean <vladimir.oltean@nxp.com> > > DSA wants the master interface to be open before the user port is due to > historical reasons. The promiscuity of interfaces that are down used to > have issues, as referenced Lennert Buytenhek in commit df02c6ff2e39 > ("dsa: fix master interface allmulti/promisc handling"). > > The bugfix mentioned there, commit b6c40d68ff64 ("net: only invoke > dev->change_rx_flags when device is UP"), was basically a "don't do > that" approach to working around the promiscuity while down issue. > > Further work done by Vlad Yasevich in commit d2615bf45069 ("net: core: > Always propagate flag changes to interfaces") has resolved the > underlying issue, and it is strictly up to the DSA and 8021q drivers > now, it is no longer mandated by the networking core that the master > interface must be up when changing its promiscuity. > > >From DSA's point of view, deciding to error out in dsa_slave_open > because the master isn't up is (a) a bad user experience and (b) missing > the forest for the trees. Even if there still was an issue with > promiscuity while down, DSA could still do this and avoid it: open the > DSA master manually, then do whatever. Voila, the DSA master is now up, > no need to error out. > > Doing it this way has the additional benefit that user space can now > remove DSA-specific workarounds, like systemd-networkd with BindCarrier: > https://github.com/systemd/systemd/issues/7478 > > And we can finally remove one of the 2 bullets in the "Common pitfalls > using DSA setups" chapter. > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew
On 1/26/2021 5:00 PM, Vladimir Oltean wrote: > From: Vladimir Oltean <vladimir.oltean@nxp.com> > > DSA wants the master interface to be open before the user port is due to > historical reasons. The promiscuity of interfaces that are down used to > have issues, as referenced Lennert Buytenhek in commit df02c6ff2e39 > ("dsa: fix master interface allmulti/promisc handling"). > > The bugfix mentioned there, commit b6c40d68ff64 ("net: only invoke > dev->change_rx_flags when device is UP"), was basically a "don't do > that" approach to working around the promiscuity while down issue. > > Further work done by Vlad Yasevich in commit d2615bf45069 ("net: core: > Always propagate flag changes to interfaces") has resolved the > underlying issue, and it is strictly up to the DSA and 8021q drivers > now, it is no longer mandated by the networking core that the master > interface must be up when changing its promiscuity. > > From DSA's point of view, deciding to error out in dsa_slave_open > because the master isn't up is (a) a bad user experience and (b) missing > the forest for the trees. Even if there still was an issue with > promiscuity while down, DSA could still do this and avoid it: open the > DSA master manually, then do whatever. Voila, the DSA master is now up, > no need to error out. > > Doing it this way has the additional benefit that user space can now > remove DSA-specific workarounds, like systemd-networkd with BindCarrier: > https://github.com/systemd/systemd/issues/7478 > > And we can finally remove one of the 2 bullets in the "Common pitfalls > using DSA setups" chapter. > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff --git a/Documentation/networking/dsa/dsa.rst b/Documentation/networking/dsa/dsa.rst index a8d15dd2b42b..e9517af5fe02 100644 --- a/Documentation/networking/dsa/dsa.rst +++ b/Documentation/networking/dsa/dsa.rst @@ -273,10 +273,6 @@ will not make us go through the switch tagging protocol transmit function, so the Ethernet switch on the other end, expecting a tag will typically drop this frame. -Slave network devices check that the master network device is UP before allowing -you to administratively bring UP these slave network devices. A common -configuration mistake is forgetting to bring UP the master network device first. - Interactions with other subsystems ================================== diff --git a/net/dsa/slave.c b/net/dsa/slave.c index f2fb433f3828..393294a53834 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -68,8 +68,14 @@ static int dsa_slave_open(struct net_device *dev) struct dsa_port *dp = dsa_slave_to_port(dev); int err; - if (!(master->flags & IFF_UP)) - return -ENETDOWN; + if (!(master->flags & IFF_UP)) { + err = dev_change_flags(master, master->flags | IFF_UP, NULL); + if (err < 0) { + netdev_err(dev, "failed to open master %s\n", + master->name); + goto out; + } + } if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) { err = dev_uc_add(master, dev->dev_addr);