diff mbox series

[PATCHv2,net,2/2] team: reset team's flags when down link is P2P device

Message ID 20230714081340.2064472-3-liuhangbin@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series Fix up dev flags when add P2P down link | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1342 this patch: 1342
netdev/cc_maintainers success CCed 6 of 6 maintainers
netdev/build_clang success Errors and warnings before: 1365 this patch: 1365
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 1365 this patch: 1365
netdev/checkpatch warning WARNING: Unknown link reference 'Links:', use 'Link:' or 'Closes:' instead
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Hangbin Liu July 14, 2023, 8:13 a.m. UTC
When adding a point to point downlink to team device, we neglected to reset
the team's flags, which were still using flags like BROADCAST and
MULTICAST. Consequently, this would initiate ARP/DAD for P2P downlink
interfaces, such as when adding a GRE device to team device.

Fix this by remove multicast/broadcast flags and add p2p and noarp flags.

Reported-by: Liang Li <liali@redhat.com>
Links: https://bugzilla.redhat.com/show_bug.cgi?id=2221438
Fixes: 1d76efe1577b ("team: add support for non-ethernet devices")
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
---
 drivers/net/team/team.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Paolo Abeni July 18, 2023, 8:01 a.m. UTC | #1
Hi,

On Fri, 2023-07-14 at 16:13 +0800, Hangbin Liu wrote:
> When adding a point to point downlink to team device, we neglected to reset
> the team's flags, which were still using flags like BROADCAST and
> MULTICAST. Consequently, this would initiate ARP/DAD for P2P downlink
> interfaces, such as when adding a GRE device to team device.
> 
> Fix this by remove multicast/broadcast flags and add p2p and noarp flags.
> 
> Reported-by: Liang Li <liali@redhat.com>
> Links: https://bugzilla.redhat.com/show_bug.cgi?id=2221438
> Fixes: 1d76efe1577b ("team: add support for non-ethernet devices")
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
> ---
>  drivers/net/team/team.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
> index 555b0b1e9a78..9104e373c8cb 100644
> --- a/drivers/net/team/team.c
> +++ b/drivers/net/team/team.c
> @@ -2135,6 +2135,11 @@ static void team_setup_by_port(struct net_device *dev,
>  	dev->mtu = port_dev->mtu;
>  	memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
>  	eth_hw_addr_inherit(dev, port_dev);
> +
> +	if (port_dev->flags & IFF_POINTOPOINT) {
> +		dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
> +		dev->flags |= (IFF_POINTOPOINT | IFF_NOARP);
> +	}

It's unclear to me what happens with the following sequence of events:

* p2p dev is enslaved to team (IFF_BROADCAST cleared)
* p2p dev is removed from team
* plain ether device is enslaved to team.

I don't see where/when IFF_BROADCAST is set again. Could you please
point it out?

Thanks!

Paolo
Hangbin Liu July 18, 2023, 9:10 a.m. UTC | #2
On Tue, Jul 18, 2023 at 10:01:27AM +0200, Paolo Abeni wrote:
> > diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
> > index 555b0b1e9a78..9104e373c8cb 100644
> > --- a/drivers/net/team/team.c
> > +++ b/drivers/net/team/team.c
> > @@ -2135,6 +2135,11 @@ static void team_setup_by_port(struct net_device *dev,
> >  	dev->mtu = port_dev->mtu;
> >  	memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
> >  	eth_hw_addr_inherit(dev, port_dev);
> > +
> > +	if (port_dev->flags & IFF_POINTOPOINT) {
> > +		dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
> > +		dev->flags |= (IFF_POINTOPOINT | IFF_NOARP);
> > +	}
> 
> It's unclear to me what happens with the following sequence of events:
> 
> * p2p dev is enslaved to team (IFF_BROADCAST cleared)
> * p2p dev is removed from team
> * plain ether device is enslaved to team.
> 
> I don't see where/when IFF_BROADCAST is set again. Could you please
> point it out?

Hmm, you are right. Bonding will call bond_ether_setup(), ether_setup() to
reset the dev flags. But team didn't do that. I will fix it.

Thanks
Hangbin
diff mbox series

Patch

diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 555b0b1e9a78..9104e373c8cb 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -2135,6 +2135,11 @@  static void team_setup_by_port(struct net_device *dev,
 	dev->mtu = port_dev->mtu;
 	memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
 	eth_hw_addr_inherit(dev, port_dev);
+
+	if (port_dev->flags & IFF_POINTOPOINT) {
+		dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
+		dev->flags |= (IFF_POINTOPOINT | IFF_NOARP);
+	}
 }
 
 static int team_dev_type_check_change(struct net_device *dev,