Message ID | 20170519202736.5685-3-joe@ovn.org |
---|---|
State | Accepted |
Headers | show |
On Fri, 2017-05-19 at 13:27 -0700, Joe Stringer wrote: > The calls here were duplicated across each tunnel protocol. > > Signed-off-by: Joe Stringer <joe@ovn.org> > --- > lib/dpif-netlink-rtnl.c | 100 +++++++++++++++++++++--------------------------- > 1 file changed, 43 insertions(+), 57 deletions(-) > Acked-by: Greg Rose <gvrose8192@gmail.com> > 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
On Fri, May 19, 2017 at 01:27:35PM -0700, Joe Stringer wrote: > The calls here were duplicated across each tunnel protocol. > > Signed-off-by: Joe Stringer <joe@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 Acked-by: Eric Garver <e@erig.me>
On 22 May 2017 at 10:40, Eric Garver <e@erig.me> wrote: > On Fri, May 19, 2017 at 01:27:35PM -0700, Joe Stringer wrote: >> The calls here were duplicated across each tunnel protocol. >> >> Signed-off-by: Joe Stringer <joe@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 > > Acked-by: Eric Garver <e@erig.me> Thanks, applied to master.
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
The calls here were duplicated across each tunnel protocol. Signed-off-by: Joe Stringer <joe@ovn.org> --- lib/dpif-netlink-rtnl.c | 100 +++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 57 deletions(-)