Re: [PATCH net] net: do not bond/team netdevices which use ml_priv

Oliver Hartkopp <[email protected]>
Newsgroups org.kernel.vger.netdev
Message-ID <[email protected]>
On 21.08.26 03:46, Hangbin Liu wrote:

>> This caused a problem on CAN devices that were not created by the CAN driver
>> infrastructure (creating proper ml_priv content). When TUN/TAP set the
>> dev->type of an ethernet device to ARPHRD_CAN the CAN ml_priv is NULL (not
>> initialized).
> 
> I don't know why a user change the tun/tap dev->type to CAN. Can they work
> together? If it's a miss config, I think we can just leave it since we already
> block CAN slave.

Correct. We currently block ARPHRD_CAN in bond_main.c

>> Not sure if collecting a bunch of ARPHRD values is the right approach or
>> whether team/bonding should check required features and settings (like IFF
>> flags, e.g. IFF_ARP or specific address length)?
> 
> Bond supports none arp devices. It also supports infiniband devices. So we
> can't check it with IFF_ARP or address length.
> 
>  From my perspective, we can keep the existing check as it only causes issues
> with CAN devices. We can work out a better solution if more incompatible
> devices are found under bond/team.

I've checked some whitelisting ideas for bond and team which did not 
really work and turned out to be risky.

In the end the V2 patch from Jiale Yao testing for ARPHRD_CAN and 
ARPHRD_IEEE802154 / ARPHRD_IEEE802154_MONITOR (suggested by 
Gemini/Jakub) seems to be the best idea!

https://lore.kernel.org/netdev/[email protected]/

ARPHRD_IEEE802154 / ARPHRD_IEEE802154_MONITOR do similar things like the 
CAN dev->ml_priv approach but with dev->ieee802154_ptr :-/

diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c
index feaa75fbf8fc..d8c46105fc8b 100644
--- a/drivers/net/team/team_core.c
+++ b/drivers/net/team/team_core.c
@@ -1224,6 +1224,17 @@ static int team_port_add(struct team *team, 
struct net_device *port_dev,
  		return -EINVAL;
  	}

+		if (port_dev->type == ARPHRD_CAN ||
+		    port_dev->type == ARPHRD_IEEE802154 ||
+		    port_dev->type == ARPHRD_IEEE802154_MONITOR) {
+			NL_SET_ERR_MSG(extack,
+				       "CAN and IEEE 802.15.4 devices can't be added as a team port");
+			netdev_err(dev, "Device %s is CAN or IEEE 802.15.4. These device 
types can't be added as a team port\n",
+				   portname);
+			return -EINVAL;
+		}
+	}
+

And for the same reason the same checks for ARPHRD_IEEE802154 / 
ARPHRD_IEEE802154_MONITOR need to be added in bond_main.c where 
currently only ARPHRD_CAN is blocked.

And I would suggest to have two separate patches for team/bond and not 
create a common function for now. Also to provide proper Fixes tags.

@Jiale Yao: Would you like to pick up the bond patch too, so that your 
team V2 patch together with the new bond patch will solve this entire issue?

Finally this will fix these three users of "ml_priv"-style non-ethernet 
device types.

The general discussion about the ml_priv usage in

- qeth
- ctcm
- cxgb2
- i596
- wilc1000

gets relaxed after drilling down the shown critical cases. The use of 
ml_priv is simply legacy code and we can make some cleanups/enhancements 
there without pressure.

Best regards,
Oliver
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.