diff options
Diffstat (limited to 'net/switchdev/switchdev.c')
| -rw-r--r-- | net/switchdev/switchdev.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 22e02f4edd99..8c1e558db118 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
| @@ -115,3 +115,113 @@ int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, | |||
| 115 | return err; | 115 | return err; |
| 116 | } | 116 | } |
| 117 | EXPORT_SYMBOL(call_netdev_switch_notifiers); | 117 | EXPORT_SYMBOL(call_netdev_switch_notifiers); |
| 118 | |||
| 119 | /** | ||
| 120 | * netdev_switch_port_bridge_setlink - Notify switch device port of bridge | ||
| 121 | * port attributes | ||
| 122 | * | ||
| 123 | * @dev: port device | ||
| 124 | * @nlh: netlink msg with bridge port attributes | ||
| 125 | * @flags: bridge setlink flags | ||
| 126 | * | ||
| 127 | * Notify switch device port of bridge port attributes | ||
| 128 | */ | ||
| 129 | int netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 130 | struct nlmsghdr *nlh, u16 flags) | ||
| 131 | { | ||
| 132 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 133 | |||
| 134 | if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD)) | ||
| 135 | return 0; | ||
| 136 | |||
| 137 | if (!ops->ndo_bridge_setlink) | ||
| 138 | return -EOPNOTSUPP; | ||
| 139 | |||
| 140 | return ops->ndo_bridge_setlink(dev, nlh, flags); | ||
| 141 | } | ||
| 142 | EXPORT_SYMBOL(netdev_switch_port_bridge_setlink); | ||
| 143 | |||
| 144 | /** | ||
| 145 | * netdev_switch_port_bridge_dellink - Notify switch device port of bridge | ||
| 146 | * port attribute delete | ||
| 147 | * | ||
| 148 | * @dev: port device | ||
| 149 | * @nlh: netlink msg with bridge port attributes | ||
| 150 | * @flags: bridge setlink flags | ||
| 151 | * | ||
| 152 | * Notify switch device port of bridge port attribute delete | ||
| 153 | */ | ||
| 154 | int netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 155 | struct nlmsghdr *nlh, u16 flags) | ||
| 156 | { | ||
| 157 | const struct net_device_ops *ops = dev->netdev_ops; | ||
| 158 | |||
| 159 | if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD)) | ||
| 160 | return 0; | ||
| 161 | |||
| 162 | if (!ops->ndo_bridge_dellink) | ||
| 163 | return -EOPNOTSUPP; | ||
| 164 | |||
| 165 | return ops->ndo_bridge_dellink(dev, nlh, flags); | ||
| 166 | } | ||
| 167 | EXPORT_SYMBOL(netdev_switch_port_bridge_dellink); | ||
| 168 | |||
| 169 | /** | ||
| 170 | * ndo_dflt_netdev_switch_port_bridge_setlink - default ndo bridge setlink | ||
| 171 | * op for master devices | ||
| 172 | * | ||
| 173 | * @dev: port device | ||
| 174 | * @nlh: netlink msg with bridge port attributes | ||
| 175 | * @flags: bridge setlink flags | ||
| 176 | * | ||
| 177 | * Notify master device slaves of bridge port attributes | ||
| 178 | */ | ||
| 179 | int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 180 | struct nlmsghdr *nlh, u16 flags) | ||
| 181 | { | ||
| 182 | struct net_device *lower_dev; | ||
| 183 | struct list_head *iter; | ||
| 184 | int ret = 0, err = 0; | ||
| 185 | |||
| 186 | if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD)) | ||
| 187 | return ret; | ||
| 188 | |||
| 189 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
| 190 | err = netdev_switch_port_bridge_setlink(lower_dev, nlh, flags); | ||
| 191 | if (err && err != -EOPNOTSUPP) | ||
| 192 | ret = err; | ||
| 193 | } | ||
| 194 | |||
| 195 | return ret; | ||
| 196 | } | ||
| 197 | EXPORT_SYMBOL(ndo_dflt_netdev_switch_port_bridge_setlink); | ||
| 198 | |||
| 199 | /** | ||
| 200 | * ndo_dflt_netdev_switch_port_bridge_dellink - default ndo bridge dellink | ||
| 201 | * op for master devices | ||
| 202 | * | ||
| 203 | * @dev: port device | ||
| 204 | * @nlh: netlink msg with bridge port attributes | ||
| 205 | * @flags: bridge dellink flags | ||
| 206 | * | ||
| 207 | * Notify master device slaves of bridge port attribute deletes | ||
| 208 | */ | ||
| 209 | int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 210 | struct nlmsghdr *nlh, u16 flags) | ||
| 211 | { | ||
| 212 | struct net_device *lower_dev; | ||
| 213 | struct list_head *iter; | ||
| 214 | int ret = 0, err = 0; | ||
| 215 | |||
| 216 | if (!(dev->features & NETIF_F_HW_SWITCH_OFFLOAD)) | ||
| 217 | return ret; | ||
| 218 | |||
| 219 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
| 220 | err = netdev_switch_port_bridge_dellink(lower_dev, nlh, flags); | ||
| 221 | if (err && err != -EOPNOTSUPP) | ||
| 222 | ret = err; | ||
| 223 | } | ||
| 224 | |||
| 225 | return ret; | ||
| 226 | } | ||
| 227 | EXPORT_SYMBOL(ndo_dflt_netdev_switch_port_bridge_dellink); | ||
