diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-08-31 11:50:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-08-31 17:15:42 -0400 |
commit | 8df3025520aaeba36aba867a4851f8968ac65b4d (patch) | |
tree | a34dd93f10d37541c87bd497fb1bb8efe2d6b007 /net/dsa | |
parent | dbeb714a5b11d26cec49e8bb5ba61e7f9b6639ac (diff) |
net: dsa: add MDB support
Add SWITCHDEV_OBJ_ID_PORT_MDB support to the DSA layer.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa')
-rw-r--r-- | net/dsa/slave.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 9f6c2a20f6ff..9ecbe787f102 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
@@ -290,6 +290,50 @@ static int dsa_slave_port_fdb_dump(struct net_device *dev, | |||
290 | return -EOPNOTSUPP; | 290 | return -EOPNOTSUPP; |
291 | } | 291 | } |
292 | 292 | ||
293 | static int dsa_slave_port_mdb_add(struct net_device *dev, | ||
294 | const struct switchdev_obj_port_mdb *mdb, | ||
295 | struct switchdev_trans *trans) | ||
296 | { | ||
297 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
298 | struct dsa_switch *ds = p->parent; | ||
299 | |||
300 | if (switchdev_trans_ph_prepare(trans)) { | ||
301 | if (!ds->ops->port_mdb_prepare || !ds->ops->port_mdb_add) | ||
302 | return -EOPNOTSUPP; | ||
303 | |||
304 | return ds->ops->port_mdb_prepare(ds, p->port, mdb, trans); | ||
305 | } | ||
306 | |||
307 | ds->ops->port_mdb_add(ds, p->port, mdb, trans); | ||
308 | |||
309 | return 0; | ||
310 | } | ||
311 | |||
312 | static int dsa_slave_port_mdb_del(struct net_device *dev, | ||
313 | const struct switchdev_obj_port_mdb *mdb) | ||
314 | { | ||
315 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
316 | struct dsa_switch *ds = p->parent; | ||
317 | |||
318 | if (ds->ops->port_mdb_del) | ||
319 | return ds->ops->port_mdb_del(ds, p->port, mdb); | ||
320 | |||
321 | return -EOPNOTSUPP; | ||
322 | } | ||
323 | |||
324 | static int dsa_slave_port_mdb_dump(struct net_device *dev, | ||
325 | struct switchdev_obj_port_mdb *mdb, | ||
326 | switchdev_obj_dump_cb_t *cb) | ||
327 | { | ||
328 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
329 | struct dsa_switch *ds = p->parent; | ||
330 | |||
331 | if (ds->ops->port_mdb_dump) | ||
332 | return ds->ops->port_mdb_dump(ds, p->port, mdb, cb); | ||
333 | |||
334 | return -EOPNOTSUPP; | ||
335 | } | ||
336 | |||
293 | static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 337 | static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
294 | { | 338 | { |
295 | struct dsa_slave_priv *p = netdev_priv(dev); | 339 | struct dsa_slave_priv *p = netdev_priv(dev); |
@@ -412,6 +456,10 @@ static int dsa_slave_port_obj_add(struct net_device *dev, | |||
412 | SWITCHDEV_OBJ_PORT_FDB(obj), | 456 | SWITCHDEV_OBJ_PORT_FDB(obj), |
413 | trans); | 457 | trans); |
414 | break; | 458 | break; |
459 | case SWITCHDEV_OBJ_ID_PORT_MDB: | ||
460 | err = dsa_slave_port_mdb_add(dev, SWITCHDEV_OBJ_PORT_MDB(obj), | ||
461 | trans); | ||
462 | break; | ||
415 | case SWITCHDEV_OBJ_ID_PORT_VLAN: | 463 | case SWITCHDEV_OBJ_ID_PORT_VLAN: |
416 | err = dsa_slave_port_vlan_add(dev, | 464 | err = dsa_slave_port_vlan_add(dev, |
417 | SWITCHDEV_OBJ_PORT_VLAN(obj), | 465 | SWITCHDEV_OBJ_PORT_VLAN(obj), |
@@ -435,6 +483,9 @@ static int dsa_slave_port_obj_del(struct net_device *dev, | |||
435 | err = dsa_slave_port_fdb_del(dev, | 483 | err = dsa_slave_port_fdb_del(dev, |
436 | SWITCHDEV_OBJ_PORT_FDB(obj)); | 484 | SWITCHDEV_OBJ_PORT_FDB(obj)); |
437 | break; | 485 | break; |
486 | case SWITCHDEV_OBJ_ID_PORT_MDB: | ||
487 | err = dsa_slave_port_mdb_del(dev, SWITCHDEV_OBJ_PORT_MDB(obj)); | ||
488 | break; | ||
438 | case SWITCHDEV_OBJ_ID_PORT_VLAN: | 489 | case SWITCHDEV_OBJ_ID_PORT_VLAN: |
439 | err = dsa_slave_port_vlan_del(dev, | 490 | err = dsa_slave_port_vlan_del(dev, |
440 | SWITCHDEV_OBJ_PORT_VLAN(obj)); | 491 | SWITCHDEV_OBJ_PORT_VLAN(obj)); |
@@ -459,6 +510,10 @@ static int dsa_slave_port_obj_dump(struct net_device *dev, | |||
459 | SWITCHDEV_OBJ_PORT_FDB(obj), | 510 | SWITCHDEV_OBJ_PORT_FDB(obj), |
460 | cb); | 511 | cb); |
461 | break; | 512 | break; |
513 | case SWITCHDEV_OBJ_ID_PORT_MDB: | ||
514 | err = dsa_slave_port_mdb_dump(dev, SWITCHDEV_OBJ_PORT_MDB(obj), | ||
515 | cb); | ||
516 | break; | ||
462 | case SWITCHDEV_OBJ_ID_PORT_VLAN: | 517 | case SWITCHDEV_OBJ_ID_PORT_VLAN: |
463 | err = dsa_slave_port_vlan_dump(dev, | 518 | err = dsa_slave_port_vlan_dump(dev, |
464 | SWITCHDEV_OBJ_PORT_VLAN(obj), | 519 | SWITCHDEV_OBJ_PORT_VLAN(obj), |