On 31/01/2019 11:58, Simon Horman wrote:
> On Mon, Jan 21, 2019 at 05:32:37PM +0200, Adi Nissim wrote:
>> Currently the TC tunnel_key action is always
>> initialized with the given tunnel id value. However,
>> some tunneling protocols define the tunnel id as an optional field.
>>
>> This patch initializes the id field of tunnel_key:set and tunnel_key:unset
>> only if a value is provided.
>>
>> In the case that a tunnel key value is not provided by the user
>> the key flag will not be set.
>>
>> Signed-off-by: Adi Nissim <[email protected]>
>> Acked-by: Paul Blakey <[email protected]>
>> ---
>> v1->v2: check if mask.tunnel.id == OVS_BE64_MAX
>>         so we won't do match in the case of a partial mask.
> 
> I am still a bit concerned about the partial mask case.
> It looks like the code will now silently not offload such matches.
> 
> I think that a partial mask should either be offloaded or
> offload of the entire flow should be rejected.

thanks. you are right. I didn't notice it. partial masks should be rejected
to fallback to ovs dp instead of ignoring the mask.

> 
>>
>>  lib/netdev-tc-offloads.c | 13 +++++++++++--
>>  lib/tc.c                 | 21 +++++++++++++++------
>>  lib/tc.h                 |  1 +
>>  3 files changed, 27 insertions(+), 8 deletions(-)
>>
>> diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c
>> index 73ce7b9..abfbaeb 100644
>> --- a/lib/netdev-tc-offloads.c
>> +++ b/lib/netdev-tc-offloads.c
>> @@ -574,7 +574,9 @@ parse_tc_flower_to_match(struct tc_flower *flower,
>>      }
>>
>>      if (flower->tunnel) {
>> -        match_set_tun_id(match, flower->key.tunnel.id);
>> +        if (flower->mask.tunnel.id == OVS_BE64_MAX) {
>> +            match_set_tun_id(match, flower->key.tunnel.id);
>> +        }
>>          if (flower->key.tunnel.ipv4.ipv4_dst) {
>>              match_set_tun_src(match, flower->key.tunnel.ipv4.ipv4_src);
>>              match_set_tun_dst(match, flower->key.tunnel.ipv4.ipv4_dst);
>> @@ -628,7 +630,10 @@ parse_tc_flower_to_match(struct tc_flower *flower,
>>                  size_t tunnel_offset =
>>                      nl_msg_start_nested(buf, OVS_KEY_ATTR_TUNNEL);
>>
>> -                nl_msg_put_be64(buf, OVS_TUNNEL_KEY_ATTR_ID, 
>> action->encap.id);
>> +                if (action->encap.id_present) {
>> +                    nl_msg_put_be64(buf, OVS_TUNNEL_KEY_ATTR_ID,
>> +                                    action->encap.id);
>> +                }
>>                  if (action->encap.ipv4.ipv4_src) {
>>                      nl_msg_put_be32(buf, OVS_TUNNEL_KEY_ATTR_IPV4_SRC,
>>                                      action->encap.ipv4.ipv4_src);
>> @@ -830,11 +835,13 @@ parse_put_flow_set_action(struct tc_flower *flower, 
>> struct tc_action *action,
>>      tunnel_len = nl_attr_get_size(set);
>>
>>      action->type = TC_ACT_ENCAP;
>> +    action->encap.id_present = false;
>>      flower->action_count++;
>>      NL_ATTR_FOR_EACH_UNSAFE(tun_attr, tun_left, tunnel, tunnel_len) {
>>          switch (nl_attr_type(tun_attr)) {
>>          case OVS_TUNNEL_KEY_ATTR_ID: {
>>              action->encap.id = nl_attr_get_be64(tun_attr);
>> +            action->encap.id_present = true;
>>          }
>>          break;
>>          case OVS_TUNNEL_KEY_ATTR_IPV4_SRC: {
>> @@ -1099,6 +1106,8 @@ netdev_tc_flow_put(struct netdev *netdev, struct match 
>> *match,
>>          flower.key.tunnel.tp_dst = tnl->tp_dst;
>>          flower.mask.tunnel.tos = tnl_mask->ip_tos;
>>          flower.mask.tunnel.ttl = tnl_mask->ip_ttl;
>> +        flower.mask.tunnel.id = (tnl->flags & FLOW_TNL_F_KEY) ?
>> +                                 tnl_mask->tun_id : 0;
>>          flower_match_to_tun_opt(&flower, tnl, tnl_mask);
>>          flower.tunnel = true;
>>      }
>> diff --git a/lib/tc.c b/lib/tc.c
>> index b19f075..e435663 100644
>> --- a/lib/tc.c
>> +++ b/lib/tc.c
>> @@ -571,6 +571,7 @@ nl_parse_flower_tunnel(struct nlattr **attrs, struct 
>> tc_flower *flower)
>>          ovs_be32 id = nl_attr_get_be32(attrs[TCA_FLOWER_KEY_ENC_KEY_ID]);
>>
>>          flower->key.tunnel.id = be32_to_be64(id);
>> +        flower->mask.tunnel.id = OVS_BE64_MAX;
>>      }
>>      if (attrs[TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK]) {
>>          flower->key.tunnel.ipv4.ipv4_src =
>> @@ -1014,6 +1015,7 @@ nl_parse_act_tunnel_key(struct nlattr *options, struct 
>> tc_flower *flower)
>>              action->encap.ipv6.ipv6_dst = nl_attr_get_in6_addr(ipv6_dst);
>>          }
>>          action->encap.id = id ? be32_to_be64(nl_attr_get_be32(id)) : 0;
>> +        action->encap.id_present = id ? true : false;
>>          action->encap.tp_dst = dst_port ? nl_attr_get_be16(dst_port) : 0;
>>          action->encap.tos = tos ? nl_attr_get_u8(tos) : 0;
>>          action->encap.ttl = ttl ? nl_attr_get_u8(ttl) : 0;
>> @@ -1631,9 +1633,9 @@ nl_msg_put_act_tunnel_geneve_option(struct ofpbuf 
>> *request,
>>  }
>>
>>  static void
>> -nl_msg_put_act_tunnel_key_set(struct ofpbuf *request, ovs_be64 id,
>> -                              ovs_be32 ipv4_src, ovs_be32 ipv4_dst,
>> -                              struct in6_addr *ipv6_src,
>> +nl_msg_put_act_tunnel_key_set(struct ofpbuf *request, bool id_present,
>> +                              ovs_be64 id, ovs_be32 ipv4_src,
>> +                              ovs_be32 ipv4_dst, struct in6_addr *ipv6_src,
>>                                struct in6_addr *ipv6_dst,
>>                                ovs_be16 tp_dst, uint8_t tos, uint8_t ttl,
>>                                struct tun_metadata tun_metadata,
>> @@ -1650,7 +1652,9 @@ nl_msg_put_act_tunnel_key_set(struct ofpbuf *request, 
>> ovs_be64 id,
>>          nl_msg_put_unspec(request, TCA_TUNNEL_KEY_PARMS, &tun, sizeof tun);
>>
>>          ovs_be32 id32 = be64_to_be32(id);
>> -        nl_msg_put_be32(request, TCA_TUNNEL_KEY_ENC_KEY_ID, id32);
>> +        if (id_present) {
>> +            nl_msg_put_be32(request, TCA_TUNNEL_KEY_ENC_KEY_ID, id32);
>> +        }
>>          if (ipv4_dst) {
>>              nl_msg_put_be32(request, TCA_TUNNEL_KEY_ENC_IPV4_SRC, ipv4_src);
>>              nl_msg_put_be32(request, TCA_TUNNEL_KEY_ENC_IPV4_DST, ipv4_dst);
>> @@ -1906,7 +1910,9 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct 
>> tc_flower *flower)
>>              break;
>>              case TC_ACT_ENCAP: {
>>                  act_offset = nl_msg_start_nested(request, act_index++);
>> -                nl_msg_put_act_tunnel_key_set(request, action->encap.id,
>> +                nl_msg_put_act_tunnel_key_set(request,
>> +                                              action->encap.id_present,
>> +                                              action->encap.id,
>>                                                action->encap.ipv4.ipv4_src,
>>                                                action->encap.ipv4.ipv4_dst,
>>                                                &action->encap.ipv6.ipv6_src,
>> @@ -2026,6 +2032,7 @@ nl_msg_put_flower_tunnel(struct ofpbuf *request, 
>> struct tc_flower *flower)
>>      uint8_t ttl = flower->key.tunnel.ttl;
>>      uint8_t tos_mask = flower->mask.tunnel.tos;
>>      uint8_t ttl_mask = flower->mask.tunnel.ttl;
>> +    ovs_be64 id_mask = flower->mask.tunnel.id;
>>
>>      if (ipv4_dst) {
>>          nl_msg_put_be32(request, TCA_FLOWER_KEY_ENC_IPV4_SRC, ipv4_src);
>> @@ -2045,7 +2052,9 @@ nl_msg_put_flower_tunnel(struct ofpbuf *request, 
>> struct tc_flower *flower)
>>      if (tp_dst) {
>>          nl_msg_put_be16(request, TCA_FLOWER_KEY_ENC_UDP_DST_PORT, tp_dst);
>>      }
>> -    nl_msg_put_be32(request, TCA_FLOWER_KEY_ENC_KEY_ID, id);
>> +    if (id_mask == OVS_BE64_MAX) {
>> +        nl_msg_put_be32(request, TCA_FLOWER_KEY_ENC_KEY_ID, id);
>> +    }
>>      nl_msg_put_flower_tunnel_opts(request, TCA_FLOWER_KEY_ENC_OPTS,
>>                                    flower->key.tunnel.metadata);
>>      nl_msg_put_flower_tunnel_opts(request, TCA_FLOWER_KEY_ENC_OPTS_MASK,
>> diff --git a/lib/tc.h b/lib/tc.h
>> index 7196a32..6643f24 100644
>> --- a/lib/tc.h
>> +++ b/lib/tc.h
>> @@ -147,6 +147,7 @@ struct tc_action {
>>          } vlan;
>>
>>          struct {
>> +            bool id_present;
>>              ovs_be64 id;
>>              ovs_be16 tp_src;
>>              ovs_be16 tp_dst;
>> --
>> 1.8.3.1
>>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to