Hi Jiri,

>>>> The name value from SET_NETDEV_DEVTYPE only ended up in the uevent sysfs
>>>> file as DEVTYPE= information. To avoid any kind of race conditions
>>>> between netlink messages and reading from sysfs, it is useful to add the
>>>> same string as new IFLA_DEVTYPE attribute included in the RTM_NEWLINK
>>>> messages.
>>>> 
>>>> For network managing daemons that have to classify ARPHRD_ETHER network
>>>> devices into different types (like Wireless LAN, Bluetooth etc.), this
>>>> avoids the extra round trip to sysfs and parsing of the uevent file.
>>>> 
>>>> Signed-off-by: Marcel Holtmann <mar...@holtmann.org>
>>>> ---
>>>> include/uapi/linux/if_link.h |  2 ++
>>>> net/core/rtnetlink.c         | 12 ++++++++++++
>>>> 2 files changed, 14 insertions(+)
>>>> 
>>>> diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
>>>> index 43391e2d1153..781294972bb4 100644
>>>> --- a/include/uapi/linux/if_link.h
>>>> +++ b/include/uapi/linux/if_link.h
>>>> @@ -166,6 +166,8 @@ enum {
>>>>    IFLA_NEW_IFINDEX,
>>>>    IFLA_MIN_MTU,
>>>>    IFLA_MAX_MTU,
>>>> +  IFLA_DEVTYPE,           /* Name value from SET_NETDEV_DEVTYPE */
>>> 
>>> This is not something netdev-related. dev->dev.type is struct device_type.
>>> This is a generic "device" thing. Incorrect to expose over
>>> netdev-specific API. Please use "device" API for this.
>> 
>> it is not just "device" related since this is a sub-classification of 
>> ARPHRD_ETHER type as a wrote above. Don't get hang up that this information 
>> is part of struct device. The dev->dev.type contains strings like "wlan", 
>> "bluetooth", "wimax", "gadget" etc. so that you can tell what kind of 
>> Ethernet card you have.
> 
> I understand. But using dev->dev.type for that purpose seems like an
> abuse. If this is subtype of netdev, it should not be stored in parent
> device. I believe that you need to re-introduce this as a part of struct
> net_device - preferably an enum - and that you can expose over rtnl (and
> net-sysfs).

it is not stored in the parent device. It is stored in the device of the netdev.

As Stephen said, there is no device API. And why would I add the same info 
again and bloat netdev?

drivers/net/bonding/bond_main.c:        SET_NETDEV_DEVTYPE(bond_dev, 
&bond_type);
drivers/net/geneve.c:   SET_NETDEV_DEVTYPE(dev, &geneve_type);
drivers/net/macsec.c:   SET_NETDEV_DEVTYPE(dev, &macsec_type);
drivers/net/ppp/ppp_generic.c:  SET_NETDEV_DEVTYPE(dev, &ppp_type);
drivers/net/usb/hso.c:  SET_NETDEV_DEVTYPE(net, &hso_type);
drivers/net/usb/usbnet.c:               SET_NETDEV_DEVTYPE(net, &wlan_type);
drivers/net/usb/usbnet.c:               SET_NETDEV_DEVTYPE(net, &wwan_type);
drivers/net/vxlan.c:    SET_NETDEV_DEVTYPE(dev, &vxlan_type);
drivers/net/wimax/i2400m/usb.c: SET_NETDEV_DEVTYPE(net_dev, &i2400mu_type);
drivers/net/wireless/intersil/prism54/islpci_dev.c:     
SET_NETDEV_DEVTYPE(ndev, &wlan_type);
drivers/staging/gdm724x/gdm_lte.c:              SET_NETDEV_DEVTYPE(net, 
&wwan_type);
drivers/usb/gadget/function/u_ether.c:  SET_NETDEV_DEVTYPE(net, &gadget_type);
drivers/usb/gadget/function/u_ether.c:  SET_NETDEV_DEVTYPE(net, &gadget_type);
net/8021q/vlan_dev.c:   SET_NETDEV_DEVTYPE(dev, &vlan_type);
net/bluetooth/6lowpan.c:        SET_NETDEV_DEVTYPE(netdev, &bt_type);
net/bluetooth/bnep/core.c:      SET_NETDEV_DEVTYPE(dev, &bnep_type);
net/bridge/br_device.c: SET_NETDEV_DEVTYPE(dev, &br_type);
net/dsa/slave.c:        SET_NETDEV_DEVTYPE(slave_dev, &dsa_type);
net/hsr/hsr_device.c:   SET_NETDEV_DEVTYPE(dev, &hsr_type);
net/l2tp/l2tp_eth.c:    SET_NETDEV_DEVTYPE(dev, &l2tpeth_type);
net/wireless/core.c:            SET_NETDEV_DEVTYPE(dev, &wiphy_type);

So for all these devices we have to add duplicate information now?

I actually don't like that idea. I can rename it to IFLA_FOO or any other 
proposal, but adding the same information twice is pointless.

>> We can revive the patches for adding this information as IFLA_INFO_KIND, but 
>> last time they where reverted since NetworkManager did all the wrong 
>> decisions based on that. That part is fixed now and we can put that back and 
>> declare the sub-type classification of Ethernet device in two places. Or we 
>> just take the information that we added a long time ago for exactly this 
>> sub-classification and provide them to userspace via RTNL.
> 
> IFLA_INFO_KIND serves for different purpose. It is for drivers that
> register rtnl_link_ops. I don't think it would be wise to mix it with
> this.

We could register rtnl_link_ops for these Ethernet drivers, but then we are 
duplicating the information as well.

Regards

Marcel

Reply via email to