[ovs-dev] [PATCH 2/3] dpif-netlink-rtnl: Use getlink() in common verify path.

Joe Stringer joe at ovn.org
Tue May 23 22:45:12 UTC 2017


On 22 May 2017 at 10:40, Eric Garver <e at 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 at 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 at erig.me>

Thanks, applied to master.


More information about the dev mailing list