net: switchdev: pass callback to dump operation
Similar to the notifier_call callback of a notifier_block, change the function signature of switchdev dump operation to: int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id, void *obj, int (*cb)(void *obj)); This allows the caller to pass and expect back a specific switchdev_obj_* structure instead of the generic switchdev_obj one. Drivers implementation of dump operation can now expect this specific structure and call the callback with it. Drivers have been changed accordingly. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
03d5fb1862
commit
25f07adc47
@@ -300,9 +300,9 @@ static int dsa_slave_port_vlan_del(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int dsa_slave_port_vlan_dump(struct net_device *dev,
|
||||
struct switchdev_obj *obj)
|
||||
struct switchdev_obj_vlan *vlan,
|
||||
int (*cb)(void *obj))
|
||||
{
|
||||
struct switchdev_obj_vlan *vlan = &obj->u.vlan;
|
||||
struct dsa_slave_priv *p = netdev_priv(dev);
|
||||
struct dsa_switch *ds = p->parent;
|
||||
DECLARE_BITMAP(members, DSA_MAX_PORTS);
|
||||
@@ -334,7 +334,7 @@ static int dsa_slave_port_vlan_dump(struct net_device *dev,
|
||||
if (test_bit(p->port, untagged))
|
||||
vlan->flags |= BRIDGE_VLAN_INFO_UNTAGGED;
|
||||
|
||||
err = obj->cb(obj);
|
||||
err = cb(vlan);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
@@ -374,7 +374,8 @@ static int dsa_slave_port_fdb_del(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int dsa_slave_port_fdb_dump(struct net_device *dev,
|
||||
struct switchdev_obj *obj)
|
||||
struct switchdev_obj_fdb *fdb,
|
||||
int (*cb)(void *obj))
|
||||
{
|
||||
struct dsa_slave_priv *p = netdev_priv(dev);
|
||||
struct dsa_switch *ds = p->parent;
|
||||
@@ -393,11 +394,11 @@ static int dsa_slave_port_fdb_dump(struct net_device *dev,
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
obj->u.fdb.addr = addr;
|
||||
obj->u.fdb.vid = vid;
|
||||
obj->u.fdb.ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;
|
||||
fdb->addr = addr;
|
||||
fdb->vid = vid;
|
||||
fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;
|
||||
|
||||
ret = obj->cb(obj);
|
||||
ret = cb(fdb);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
@@ -518,16 +519,17 @@ static int dsa_slave_port_obj_del(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int dsa_slave_port_obj_dump(struct net_device *dev,
|
||||
struct switchdev_obj *obj)
|
||||
enum switchdev_obj_id id, void *obj,
|
||||
int (*cb)(void *obj))
|
||||
{
|
||||
int err;
|
||||
|
||||
switch (obj->id) {
|
||||
switch (id) {
|
||||
case SWITCHDEV_OBJ_PORT_FDB:
|
||||
err = dsa_slave_port_fdb_dump(dev, obj);
|
||||
err = dsa_slave_port_fdb_dump(dev, obj, cb);
|
||||
break;
|
||||
case SWITCHDEV_OBJ_PORT_VLAN:
|
||||
err = dsa_slave_port_vlan_dump(dev, obj);
|
||||
err = dsa_slave_port_vlan_dump(dev, obj, cb);
|
||||
break;
|
||||
default:
|
||||
err = -EOPNOTSUPP;
|
||||
|
Reference in New Issue
Block a user