The calls here were duplicated across each tunnel protocol.

Signed-off-by: Joe Stringer <j...@ovn.org>
---
 lib/dpif-netlink-rtnl.c | 100 +++++++++++++++++++++---------------------------
 1 file changed, 43 insertions(+), 57 deletions(-)

diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
index 0ca6529e9d82..76ab0fe3fdec 100644
--- a/lib/dpif-netlink-rtnl.c
+++ b/lib/dpif-netlink-rtnl.c
@@ -160,34 +160,23 @@ rtnl_policy_parse(const char *kind, struct ofpbuf *reply,
 
 static int
 dpif_netlink_rtnl_vxlan_verify(const struct netdev_tunnel_config *tnl_cfg,
-                               const char *name, const char *kind)
+                               const char *kind, struct ofpbuf *reply)
 {
-    struct ofpbuf *reply;
+    struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)];
     int err;
 
-    err = dpif_netlink_rtnl_getlink(name, &reply);
-
+    err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan,
+                            ARRAY_SIZE(vxlan_policy));
     if (!err) {
-        struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)];
-
-        err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan,
-                                ARRAY_SIZE(vxlan_policy));
-        if (!err) {
-            if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING])
-                || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA])
-                || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])
-                || (tnl_cfg->dst_port
-                    != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT]))) {
-                err = EINVAL;
-            }
-        }
-        if (!err) {
-            if (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP)
-                && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP])) {
-                err = EINVAL;
-            }
+        if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING])
+            || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA])
+            || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])
+            || (tnl_cfg->dst_port
+                != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT]))
+            || (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP)
+                && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP]))) {
+            err = EINVAL;
         }
-        ofpbuf_delete(reply);
     }
 
     return err;
@@ -195,24 +184,17 @@ dpif_netlink_rtnl_vxlan_verify(const struct 
netdev_tunnel_config *tnl_cfg,
 
 static int
 dpif_netlink_rtnl_gre_verify(const struct netdev_tunnel_config OVS_UNUSED *tnl,
-                             const char *name, const char *kind)
+                             const char *kind, struct ofpbuf *reply)
 {
-    struct ofpbuf *reply;
+    struct nlattr *gre[ARRAY_SIZE(gre_policy)];
     int err;
 
-    err = dpif_netlink_rtnl_getlink(name, &reply);
-
+    err = rtnl_policy_parse(kind, reply, gre_policy, gre,
+                            ARRAY_SIZE(gre_policy));
     if (!err) {
-        struct nlattr *gre[ARRAY_SIZE(gre_policy)];
-
-        err = rtnl_policy_parse(kind, reply, gre_policy, gre,
-                                ARRAY_SIZE(gre_policy));
-        if (!err) {
-            if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) {
-                err = EINVAL;
-            }
+        if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) {
+            err = EINVAL;
         }
-        ofpbuf_delete(reply);
     }
 
     return err;
@@ -220,27 +202,20 @@ dpif_netlink_rtnl_gre_verify(const struct 
netdev_tunnel_config OVS_UNUSED *tnl,
 
 static int
 dpif_netlink_rtnl_geneve_verify(const struct netdev_tunnel_config *tnl_cfg,
-                                const char *name, const char *kind)
+                                const char *kind, struct ofpbuf *reply)
 {
-    struct ofpbuf *reply;
+    struct nlattr *geneve[ARRAY_SIZE(geneve_policy)];
     int err;
 
-    err = dpif_netlink_rtnl_getlink(name, &reply);
-
+    err = rtnl_policy_parse(kind, reply, geneve_policy, geneve,
+                            ARRAY_SIZE(geneve_policy));
     if (!err) {
-        struct nlattr *geneve[ARRAY_SIZE(geneve_policy)];
-
-        err = rtnl_policy_parse(kind, reply, geneve_policy, geneve,
-                                ARRAY_SIZE(geneve_policy));
-        if (!err) {
-            if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA])
-                || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX])
-                || (tnl_cfg->dst_port
-                    != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) {
-                err = EINVAL;
-            }
+        if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA])
+            || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX])
+            || (tnl_cfg->dst_port
+                != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) {
+            err = EINVAL;
         }
-        ofpbuf_delete(reply);
     }
 
     return err;
@@ -250,20 +225,30 @@ static int
 dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg,
                          enum ovs_vport_type type, const char *name)
 {
+    struct ofpbuf *reply;
     const char *kind;
+    int err;
 
     kind = vport_type_to_kind(type);
     if (!kind) {
         return EOPNOTSUPP;
     }
 
+    err = dpif_netlink_rtnl_getlink(name, &reply);
+    if (err) {
+        return err;
+    }
+
     switch (type) {
     case OVS_VPORT_TYPE_VXLAN:
-        return dpif_netlink_rtnl_vxlan_verify(tnl_cfg, name, kind);
+        err = dpif_netlink_rtnl_vxlan_verify(tnl_cfg, kind, reply);
+        break;
     case OVS_VPORT_TYPE_GRE:
-        return dpif_netlink_rtnl_gre_verify(tnl_cfg, name, kind);
+        err = dpif_netlink_rtnl_gre_verify(tnl_cfg, kind, reply);
+        break;
     case OVS_VPORT_TYPE_GENEVE:
-        return dpif_netlink_rtnl_geneve_verify(tnl_cfg, name, kind);
+        err = dpif_netlink_rtnl_geneve_verify(tnl_cfg, kind, reply);
+        break;
     case OVS_VPORT_TYPE_NETDEV:
     case OVS_VPORT_TYPE_INTERNAL:
     case OVS_VPORT_TYPE_LISP:
@@ -271,10 +256,11 @@ dpif_netlink_rtnl_verify(const struct 
netdev_tunnel_config *tnl_cfg,
     case OVS_VPORT_TYPE_UNSPEC:
     case __OVS_VPORT_TYPE_MAX:
     default:
-        return EOPNOTSUPP;
+        err = EOPNOTSUPP;
     }
 
-    return 0;
+    ofpbuf_delete(reply);
+    return err;
 }
 
 static int
-- 
2.11.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to