The calls here were duplicated across each tunnel protocol.
Signed-off-by: Joe Stringer <[email protected]>
---
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
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev