From mboxrd@z Thu Jan 1 00:00:00 1970 From: roopa Subject: Re: [PATCH net-next v4 19/24] switchdev: add new swdev_port_bridge_getlink Date: Mon, 13 Apr 2015 22:47:11 -0700 Message-ID: <552CA9DF.8060808@cumulusnetworks.com> References: <1428905838-14920-1-git-send-email-sfeldma@gmail.com> <1428905838-14920-20-git-send-email-sfeldma@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: netdev@vger.kernel.org, jiri@resnulli.us, linux@roeck-us.net, f.fainelli@gmail.com, sridhar.samudrala@intel.com, ronen.arad@intel.com, andrew@lunn.ch To: sfeldma@gmail.com Return-path: Received: from mail-qk0-f175.google.com ([209.85.220.175]:33136 "EHLO mail-qk0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751567AbbDNFrO (ORCPT ); Tue, 14 Apr 2015 01:47:14 -0400 Received: by qkx62 with SMTP id 62so221400711qkx.0 for ; Mon, 13 Apr 2015 22:47:13 -0700 (PDT) In-Reply-To: <1428905838-14920-20-git-send-email-sfeldma@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: On 4/12/15, 11:17 PM, sfeldma@gmail.com wrote: > From: Scott Feldman > > Like bridge_setlink, add swdev wrapper to handle bridge_getlink and call into > port driver to get port attrs. For now, only BR_LEARNING and BR_LEARNING_SYNC > are returned. To add more, we'll probably want to break away from > ndo_dflt_bridge_getlink() and build the netlink skb directly in the swdev code. > > Signed-off-by: Scott Feldman > --- > include/net/switchdev.h | 9 +++++++++ > net/switchdev/switchdev.c | 27 +++++++++++++++++++++++++++ > 2 files changed, 36 insertions(+) > > diff --git a/include/net/switchdev.h b/include/net/switchdev.h > index 8c9814f..d04322e 100644 > --- a/include/net/switchdev.h > +++ b/include/net/switchdev.h > @@ -121,6 +121,8 @@ int swdev_port_attr_get(struct net_device *dev, struct swdev_attr *attr); > int swdev_port_attr_set(struct net_device *dev, struct swdev_attr *attr); > int swdev_port_obj_add(struct net_device *dev, struct swdev_obj *obj); > int swdev_port_obj_del(struct net_device *dev, struct swdev_obj *obj); > +int swdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, > + struct net_device *dev, u32 filter_mask); > int swdev_port_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh, > u16 flags); > int swdev_port_bridge_dellink(struct net_device *dev, struct nlmsghdr *nlh, > @@ -161,6 +163,13 @@ static inline int swdev_port_obj_del(struct net_device *dev, > return -EOPNOTSUPP; > } > > +static inline int swdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, > + u32 seq, struct net_device *dev, > + u32 filter_mask) > +{ > + return -EOPNOTSUPP; > +} > + > static inline int swdev_port_bridge_setlink(struct net_device *dev, > struct nlmsghdr *nlh, u16 flags) > { > diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c > index ae0ed06..6866e0c 100644 > --- a/net/switchdev/switchdev.c > +++ b/net/switchdev/switchdev.c > @@ -371,6 +371,33 @@ int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, > } > EXPORT_SYMBOL_GPL(call_netdev_switch_notifiers); > > +/** > + * swdev_port_bridge_getlink - Get bridge port attributes > + * > + * @dev: port device > + * > + * Called for SELF on rtnl_bridge_getlink to get bridge port > + * attributes. > + */ > +int swdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, > + struct net_device *dev, u32 filter_mask) > +{ > + struct swdev_attr attr = { > + .id = SWDEV_ATTR_PORT_BRIDGE_FLAGS, > + }; > + u16 mode = BRIDGE_MODE_UNDEF; > + u32 mask = BR_LEARNING | BR_LEARNING_SYNC; > + int err; > + > + err = swdev_port_attr_get(dev, &attr); > + if (err) > + return err; > + > + return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode, > + attr.brport_flags, mask); > +} > +EXPORT_SYMBOL_GPL(swdev_port_bridge_getlink); This should ideally get vlans as well because setlink/dellink supports add/del vlans. This can however be an incremental patch. I think this was the point arad was making as well some time back.