[systemd-devel] [RFC][PATCH] net: set default DEVTYPE for all ethernet based devices

Marcel Holtmann marcel at holtmann.org
Sun Jan 5 11:44:30 PST 2014


Hi Tom,

>>>>> In systemd's networkd and udevd, we would like to give the administrator a
>>>>> simple way to filter ethernet devices by their DEVTYPE. In order to avoid
>>>>> having a special treatment of the case where DEVTYPE=(null), initialize it to
>>>>> a default value, "ethernet", in the kernel.
>>>>> 
>>>>> Signed-off-by: Tom Gundersen <teg at jklm.no>
>>>>> Cc: Marcel Holtmann <marcel at holtmann.org>
>>>>> Cc: Greg KH <gregkh at linuxfoundation.org>
>>>>> ---
>>>>> 
>>>>> Hi Greg and Marcel,
>>>>> 
>>>>> This patch seems to do the right thing for me. Any comments before I send it
>>>>> off to LKML?
>>>>> 
>>>>> I suppose it may make sense to hide this behind a kernel option in case we are
>>>>> worried about breaking existing users (but if ConnMan is adapted, I don't know
>>>>> of any other issues, NetworkManager is not affected at least).
>>>>> 
>>>>> Cheers,
>>>>> 
>>>>> Tom
>>>>> 
>>>>> net/core/dev.c | 6 ++++++
>>>>> 1 file changed, 6 insertions(+)
>>>>> 
>>>>> diff --git a/net/core/dev.c b/net/core/dev.c
>>>>> index ba3b7ea..62881e0 100644
>>>>> --- a/net/core/dev.c
>>>>> +++ b/net/core/dev.c
>>>>> @@ -6215,6 +6215,10 @@ void netdev_freemem(struct net_device *dev)
>>>>>             kfree(addr);
>>>>> }
>>>>> 
>>>>> +static const struct device_type ethernet_type = {
>>>>> +     .name = "ethernet",
>>>>> +};
>>>>> +
>>>>> /**
>>>>> *    alloc_netdev_mqs - allocate network device
>>>>> *    @sizeof_priv:   size of private data to allocate space for
>>>>> @@ -6305,6 +6309,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
>>>>>             goto free_all;
>>>>> #endif
>>>>> 
>>>>> +     SET_NETDEV_DEVTYPE(dev, &ethernet_type);
>>>>> +
>>>>>     strcpy(dev->name, name);
>>>>>     dev->group = INIT_NETDEV_GROUP;
>>>>>     if (!dev->ethtool_ops)
>>>> 
>>>> this means that every single netdev is defaulting to Ethernet. This includes also the fake ones like IrDA or raw IP ones like PPP or TUN devices. I do not think that is something we really want here.
>>> 
>>> Hm, so then the assumption I first worked under (DEVTYPE==(null) means
>>> ethernet) is not really correct. Doesn't this give you problems in
>>> ConnMan at the moment?
>> 
>> that is why I mentioned ARPHRD_* earlier. It is important to check that value as well. You will need both at some point.
> 
> Hm, I thought that was to fix false negatives. I.e., that some devices
> with, say, DEVTYPE=bluetooth should in fact be treated as regular
> ethernet?

DEVTYPE=bluetooth and DEVTYPE=wlan are not false negatives. They should be like that. That is something current userspace relies on. We can not break this.

However you will see a DEVTYPE=bluetooth as Ethernet emulation and another as raw IP (6loWPAN). You want to differentiate these for the default address assignment you pick. For example 6loWPAN will just rely on IPv6 route solicitation.

Same applies to DEVTYPE=wwan btw. Some Qualcomm cards can be exposed as Ethernet or they do a raw IP only header in their netdev. DEVTYPE is just to figure out the underlying technology of your network device. Then the ARPHRD_ is to get an idea of the actual encapsulation that is used.

Regards

Marcel



More information about the systemd-devel mailing list