switchdev: add new switchdev_port_bridge_getlink
authorScott Feldman <sfeldma@gmail.com>
Sun, 10 May 2015 16:48:04 +0000 (09:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 12 May 2015 22:43:55 +0000 (18:43 -0400)
Like bridge_setlink, add switchdev 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 switchdev code.

Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Acked-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/switchdev.h
net/switchdev/switchdev.c

index 397b1e6e04f6ba3b311db5f7088c142e6064c18a..e081d67f973a40179c401174821310f126294235 100644 (file)
@@ -126,6 +126,9 @@ int register_switchdev_notifier(struct notifier_block *nb);
 int unregister_switchdev_notifier(struct notifier_block *nb);
 int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
                             struct switchdev_notifier_info *info);
+int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
+                                 struct net_device *dev, u32 filter_mask,
+                                 int nlflags);
 int switchdev_port_bridge_setlink(struct net_device *dev,
                                  struct nlmsghdr *nlh, u16 flags);
 int switchdev_port_bridge_dellink(struct net_device *dev,
@@ -179,6 +182,13 @@ static inline int call_switchdev_notifiers(unsigned long val,
        return NOTIFY_DONE;
 }
 
+static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid,
+                                           u32 seq, struct net_device *dev,
+                                           u32 filter_mask, int nlflags)
+{
+       return -EOPNOTSUPP;
+}
+
 static inline int switchdev_port_bridge_setlink(struct net_device *dev,
                                                struct nlmsghdr *nlh,
                                                u16 flags)
index 0e15b6f6bb56a61c181f28e380f55a0f81b932a9..9210355ec965b6bde0ad0723692facd1c7283b4a 100644 (file)
@@ -358,6 +358,34 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
 }
 EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
 
+/**
+ *     switchdev_port_bridge_getlink - Get bridge port attributes
+ *
+ *     @dev: port device
+ *
+ *     Called for SELF on rtnl_bridge_getlink to get bridge port
+ *     attributes.
+ */
+int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
+                                 struct net_device *dev, u32 filter_mask,
+                                 int nlflags)
+{
+       struct switchdev_attr attr = {
+               .id = SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS,
+       };
+       u16 mode = BRIDGE_MODE_UNDEF;
+       u32 mask = BR_LEARNING | BR_LEARNING_SYNC;
+       int err;
+
+       err = switchdev_port_attr_get(dev, &attr);
+       if (err)
+               return err;
+
+       return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode,
+                                      attr.brport_flags, mask, nlflags);
+}
+EXPORT_SYMBOL_GPL(switchdev_port_bridge_getlink);
+
 static int switchdev_port_br_setflag(struct net_device *dev,
                                     struct nlattr *nlattr,
                                     unsigned long brport_flag)