mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
net: bridge: Extract boilerplate around switchdev_port_obj_*()
A call to switchdev_port_obj_add() or switchdev_port_obj_del() involves initializing a struct switchdev_obj_port_vlan, a piece of code that repeats on each call site almost verbatim. While in the current codebase there is just one duplicated add call, the follow-up patches add more of both add and del calls. Thus to remove the duplication, extract the repetition into named functions and reuse. Signed-off-by: Petr Machata <petrm@mellanox.com> Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Reviewed-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
32d26a685c
commit
d66e434896
3 changed files with 41 additions and 23 deletions
|
@ -1139,6 +1139,8 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
|
|||
unsigned long mask);
|
||||
void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
|
||||
int type);
|
||||
int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags);
|
||||
int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
|
||||
|
||||
static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
|
||||
{
|
||||
|
@ -1168,6 +1170,17 @@ static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int br_switchdev_port_vlan_add(struct net_device *dev,
|
||||
u16 vid, u16 flags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void
|
||||
br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
|
||||
{
|
||||
|
|
|
@ -136,3 +136,28 @@ br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags)
|
||||
{
|
||||
struct switchdev_obj_port_vlan v = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.flags = flags,
|
||||
.vid_begin = vid,
|
||||
.vid_end = vid,
|
||||
};
|
||||
|
||||
return switchdev_port_obj_add(dev, &v.obj);
|
||||
}
|
||||
|
||||
int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid)
|
||||
{
|
||||
struct switchdev_obj_port_vlan v = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.vid_begin = vid,
|
||||
.vid_end = vid,
|
||||
};
|
||||
|
||||
return switchdev_port_obj_del(dev, &v.obj);
|
||||
}
|
||||
|
|
|
@ -82,19 +82,12 @@ static bool __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)
|
|||
static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br,
|
||||
u16 vid, u16 flags)
|
||||
{
|
||||
struct switchdev_obj_port_vlan v = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.flags = flags,
|
||||
.vid_begin = vid,
|
||||
.vid_end = vid,
|
||||
};
|
||||
int err;
|
||||
|
||||
/* Try switchdev op first. In case it is not supported, fallback to
|
||||
* 8021q add.
|
||||
*/
|
||||
err = switchdev_port_obj_add(dev, &v.obj);
|
||||
err = br_switchdev_port_vlan_add(dev, vid, flags);
|
||||
if (err == -EOPNOTSUPP)
|
||||
return vlan_vid_add(dev, br->vlan_proto, vid);
|
||||
return err;
|
||||
|
@ -130,18 +123,12 @@ static void __vlan_del_list(struct net_bridge_vlan *v)
|
|||
static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br,
|
||||
u16 vid)
|
||||
{
|
||||
struct switchdev_obj_port_vlan v = {
|
||||
.obj.orig_dev = dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.vid_begin = vid,
|
||||
.vid_end = vid,
|
||||
};
|
||||
int err;
|
||||
|
||||
/* Try switchdev op first. In case it is not supported, fallback to
|
||||
* 8021q del.
|
||||
*/
|
||||
err = switchdev_port_obj_del(dev, &v.obj);
|
||||
err = br_switchdev_port_vlan_del(dev, vid);
|
||||
if (err == -EOPNOTSUPP) {
|
||||
vlan_vid_del(dev, br->vlan_proto, vid);
|
||||
return 0;
|
||||
|
@ -1053,13 +1040,6 @@ int nbp_vlan_init(struct net_bridge_port *p)
|
|||
int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
|
||||
bool *changed)
|
||||
{
|
||||
struct switchdev_obj_port_vlan v = {
|
||||
.obj.orig_dev = port->dev,
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
|
||||
.flags = flags,
|
||||
.vid_begin = vid,
|
||||
.vid_end = vid,
|
||||
};
|
||||
struct net_bridge_vlan *vlan;
|
||||
int ret;
|
||||
|
||||
|
@ -1069,7 +1049,7 @@ int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
|
|||
vlan = br_vlan_find(nbp_vlan_group(port), vid);
|
||||
if (vlan) {
|
||||
/* Pass the flags to the hardware bridge */
|
||||
ret = switchdev_port_obj_add(port->dev, &v.obj);
|
||||
ret = br_switchdev_port_vlan_add(port->dev, vid, flags);
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
*changed = __vlan_add_flags(vlan, flags);
|
||||
|
|
Loading…
Reference in a new issue