]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/switchdev/switchdev.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux...
[karo-tx-linux.git] / net / switchdev / switchdev.c
index 22e02f4edd99bf318ce2944b7ebd3804425ffd27..8c1e558db11893b7f70eaa5e5201da07a3df8812 100644 (file)
@@ -115,3 +115,113 @@ int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev,
        return err;
 }
 EXPORT_SYMBOL(call_netdev_switch_notifiers);
+
+/**
+ *     netdev_switch_port_bridge_setlink - Notify switch device port of bridge
+ *     port attributes
+ *
+ *     @dev: port device
+ *     @nlh: netlink msg with bridge port attributes
+ *     @flags: bridge setlink flags
+ *
+ *     Notify switch device port of bridge port attributes
+ */
+int netdev_switch_port_bridge_setlink(struct net_device *dev,
+                                     struct nlmsghdr *nlh, u16 flags)
+{
+       const struct net_device_ops *ops = dev->netdev_ops;
+
+       if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD))
+               return 0;
+
+       if (!ops->ndo_bridge_setlink)
+               return -EOPNOTSUPP;
+
+       return ops->ndo_bridge_setlink(dev, nlh, flags);
+}
+EXPORT_SYMBOL(netdev_switch_port_bridge_setlink);
+
+/**
+ *     netdev_switch_port_bridge_dellink - Notify switch device port of bridge
+ *     port attribute delete
+ *
+ *     @dev: port device
+ *     @nlh: netlink msg with bridge port attributes
+ *     @flags: bridge setlink flags
+ *
+ *     Notify switch device port of bridge port attribute delete
+ */
+int netdev_switch_port_bridge_dellink(struct net_device *dev,
+                                     struct nlmsghdr *nlh, u16 flags)
+{
+       const struct net_device_ops *ops = dev->netdev_ops;
+
+       if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD))
+               return 0;
+
+       if (!ops->ndo_bridge_dellink)
+               return -EOPNOTSUPP;
+
+       return ops->ndo_bridge_dellink(dev, nlh, flags);
+}
+EXPORT_SYMBOL(netdev_switch_port_bridge_dellink);
+
+/**
+ *     ndo_dflt_netdev_switch_port_bridge_setlink - default ndo bridge setlink
+ *                                                  op for master devices
+ *
+ *     @dev: port device
+ *     @nlh: netlink msg with bridge port attributes
+ *     @flags: bridge setlink flags
+ *
+ *     Notify master device slaves of bridge port attributes
+ */
+int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev,
+                                              struct nlmsghdr *nlh, u16 flags)
+{
+       struct net_device *lower_dev;
+       struct list_head *iter;
+       int ret = 0, err = 0;
+
+       if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD))
+               return ret;
+
+       netdev_for_each_lower_dev(dev, lower_dev, iter) {
+               err = netdev_switch_port_bridge_setlink(lower_dev, nlh, flags);
+               if (err && err != -EOPNOTSUPP)
+                       ret = err;
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(ndo_dflt_netdev_switch_port_bridge_setlink);
+
+/**
+ *     ndo_dflt_netdev_switch_port_bridge_dellink - default ndo bridge dellink
+ *                                                  op for master devices
+ *
+ *     @dev: port device
+ *     @nlh: netlink msg with bridge port attributes
+ *     @flags: bridge dellink flags
+ *
+ *     Notify master device slaves of bridge port attribute deletes
+ */
+int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev,
+                                              struct nlmsghdr *nlh, u16 flags)
+{
+       struct net_device *lower_dev;
+       struct list_head *iter;
+       int ret = 0, err = 0;
+
+       if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD))
+               return ret;
+
+       netdev_for_each_lower_dev(dev, lower_dev, iter) {
+               err = netdev_switch_port_bridge_dellink(lower_dev, nlh, flags);
+               if (err && err != -EOPNOTSUPP)
+                       ret = err;
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(ndo_dflt_netdev_switch_port_bridge_dellink);