OSDN Git Service

net: bridge: Extract boilerplate around switchdev_port_obj_*()
authorPetr Machata <petrm@mellanox.com>
Wed, 30 May 2018 00:56:03 +0000 (02:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 31 May 2018 18:13:42 +0000 (14:13 -0400)
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>
net/bridge/br_private.h
net/bridge/br_switchdev.c
net/bridge/br_vlan.c

index 11520ed..5216a52 100644 (file)
@@ -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)
 {
index 35474d4..d77f807 100644 (file)
@@ -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);
+}
index dc832c0..e3b14c0 100644 (file)
@@ -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 @@ err_vlan_enabled:
 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);