Message ID | 20210602102653.9d5c4789824f.Ia98e333bba58bc6a0b1c8fa28ad0964fb9c918d6@changeid (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | generic WWAN framework interface creation | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Wed, Jun 2, 2021 at 11:28 AM Johannes Berg <johannes@sipsolutions.net> wrote: > In some cases, for example in the upcoming WWAN framework > changes, there's no natural "parent netdev", so sometimes > dummy netdevs are created or similar. IFLA_PARENT_DEV_NAME > is a new attribute intended to contain a device (sysfs, > struct device) name that can be used instead when creating > a new netdev, if the rtnetlink family implements it. > > Suggested-by: Sergey Ryazanov <ryazanov.s.a@gmail.com> > Signed-off-by: Johannes Berg <johannes.berg@intel.com> > --- > v2: > * new patch > --- > include/uapi/linux/if_link.h | 6 ++++++ > net/core/rtnetlink.c | 1 + > 2 files changed, 7 insertions(+) > > diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h > index f7c3beebb074..3455780193a4 100644 > --- a/include/uapi/linux/if_link.h > +++ b/include/uapi/linux/if_link.h > @@ -341,6 +341,12 @@ enum { > IFLA_ALT_IFNAME, /* Alternative ifname */ > IFLA_PERM_ADDRESS, > IFLA_PROTO_DOWN_REASON, > + > + /* device (sysfs) name as parent, used instead > + * of IFLA_LINK where there's no parent netdev > + */ > + IFLA_PARENT_DEV_NAME, > + > __IFLA_MAX > }; > > diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c > index 4975dd91407d..49a27bf6e4a7 100644 > --- a/net/core/rtnetlink.c > +++ b/net/core/rtnetlink.c > @@ -1878,6 +1878,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { > [IFLA_PERM_ADDRESS] = { .type = NLA_REJECT }, > [IFLA_PROTO_DOWN_REASON] = { .type = NLA_NESTED }, > [IFLA_NEW_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1), > + [IFLA_PARENT_DEV_NAME] = { .type = NLA_NUL_STRING }, > }; > > static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { I would like to clarify this proposal more broadly. There are some devices that implement multiple data channels and require several netdev for traffic separation. The most notable class of such devices is WWAN modems. At the moment, a common way to manage these multiple interfaces is to create a master netdev per each HW instance and reuse IFLA_LINK attribute to create all subsequent data channel netdevs as subinterfaces of the master (see MBIM and RMNET drivers). But in fact all these netdev do not have the master-subinterface relationship. They are equal. The only reason to implement such a complex scheme is the absenсe of an attribute that can indicate a parent device. So, in some sense, driver developers were forced to abuse IFLA_LINK to avoid a complete per-driver private API creation. It was Johannes finding that we can greatly simplify the management API for the WWAN subsystem by specifying a sysfs device name as a parent for the data channel netdev creation procedure. The first RFC introduces a private attribute to indicate a parent device. My suggestion was only to make this attribute generic as it seems to be generic. The parent device indication attribute should help us avoid further IFLA_LINK abuse and perhaps even make it easier to rework existing drivers. Moreover, we have the parent device pointer directly in the netdev structure, so after applying this patch, we will be able to export the parent device name using the netdev dump operation and even filter its results. ip-link(8) support for the generic parent device attribute will help us avoid code duplication, so no other link type will require a custom code to handle the parent name attribute. E.g. the WWAN interface creation command will looks like this: # ip link add wwan0-1 parent-dev wwan0 type wwan channel-id 1 So, some future subsystem (or driver) FOO will have an interface creation command that looks like this: # ip link add foo1-3 parent-dev foo1 type foo bar-id 3 baz-type Y As suggested by Johannes, I will soon send a small series with examples of using the suggested parent device name attribute.
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index f7c3beebb074..3455780193a4 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -341,6 +341,12 @@ enum { IFLA_ALT_IFNAME, /* Alternative ifname */ IFLA_PERM_ADDRESS, IFLA_PROTO_DOWN_REASON, + + /* device (sysfs) name as parent, used instead + * of IFLA_LINK where there's no parent netdev + */ + IFLA_PARENT_DEV_NAME, + __IFLA_MAX }; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4975dd91407d..49a27bf6e4a7 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1878,6 +1878,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { [IFLA_PERM_ADDRESS] = { .type = NLA_REJECT }, [IFLA_PROTO_DOWN_REASON] = { .type = NLA_NESTED }, [IFLA_NEW_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1), + [IFLA_PARENT_DEV_NAME] = { .type = NLA_NUL_STRING }, }; static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {