[ovs-dev] [PATCH 2/4] lib/tc: Support matching on ip tos

Simon Horman simon.horman at netronome.com
Thu Jul 26 14:44:31 UTC 2018


Hi Or,

On Wed, Jul 25, 2018 at 09:20:07PM +0300, Or Gerlitz wrote:
> Add the missing code to match on ip tos when dealing
> with the TC data-path.
> 
> Signed-off-by: Or Gerlitz <ogerlitz at mellanox.com>
> Reviewed-by: Roi Dayan <roid at mellanox.com>
> ---
>  include/openvswitch/match.h |  1 +
>  lib/match.c                 |  7 +++++++
>  lib/netdev-tc-offloads.c    |  6 ++++--
>  lib/tc.c                    | 10 ++++++++++
>  lib/tc.h                    |  1 +
>  5 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/include/openvswitch/match.h b/include/openvswitch/match.h
> index b43ecb1..e8c80dd 100644
> --- a/include/openvswitch/match.h
> +++ b/include/openvswitch/match.h
> @@ -194,6 +194,7 @@ void match_set_nw_dscp(struct match *, uint8_t);
>  void match_set_nw_ecn(struct match *, uint8_t);
>  void match_set_nw_ttl(struct match *, uint8_t nw_ttl);
>  void match_set_nw_ttl_masked(struct match *, uint8_t nw_ttl, uint8_t mask);
> +void match_set_nw_tos_masked(struct match *, uint8_t nw_tos, uint8_t mask);
>  void match_set_nw_frag(struct match *, uint8_t nw_frag);
>  void match_set_nw_frag_masked(struct match *, uint8_t nw_frag, uint8_t mask);
>  void match_set_icmp_type(struct match *, uint8_t);
> diff --git a/lib/match.c b/lib/match.c
> index 2281fa0..a1407a8 100644
> --- a/lib/match.c
> +++ b/lib/match.c
> @@ -946,6 +946,13 @@ match_set_nw_ttl(struct match *match, uint8_t nw_ttl)
>  }
>  
>  void
> +match_set_nw_tos_masked(struct match *match, uint8_t nw_tos, uint8_t mask)
> +{
> +    match->flow.nw_tos = nw_tos & mask;
> +    match->wc.masks.nw_tos = mask;
> +}
> +
> +void
>  match_set_nw_ttl_masked(struct match *match, uint8_t nw_ttl, uint8_t mask)
>  {
>      match->flow.nw_ttl = nw_ttl & mask;
> diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c
> index 2a6dd6d..c61197a 100644
> --- a/lib/netdev-tc-offloads.c
> +++ b/lib/netdev-tc-offloads.c
> @@ -455,6 +455,7 @@ parse_tc_flower_to_match(struct tc_flower *flower,
>              match_set_nw_proto(match, key->ip_proto);
>          }
>  
> +        match_set_nw_tos_masked(match, key->ip_tos, mask->ip_tos);
>          match_set_nw_ttl_masked(match, key->ip_ttl, mask->ip_ttl);
>  
>          if (mask->flags) {
> @@ -1026,6 +1027,9 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
>          flower.key.ip_proto = key->nw_proto;
>          flower.mask.ip_proto = mask->nw_proto;
>          mask->nw_proto = 0;
> +        flower.key.ip_tos = key->nw_tos;
> +        flower.mask.ip_tos = mask->nw_tos;
> +        mask->nw_tos = 0;
>          flower.key.ip_ttl = key->nw_ttl;
>          flower.mask.ip_ttl = mask->nw_ttl;
>          mask->nw_ttl = 0;
> @@ -1074,8 +1078,6 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
>              mask->tp_dst = 0;
>          }
>  
> -        mask->nw_tos = 0;
> -

As per my comment on patch 1/2, the intention of the mask->nw_tos change
in the above two hunks is not clear to me.

>          if (key->dl_type == htons(ETH_P_IP)) {
>              flower.key.ipv4.ipv4_src = key->nw_src;
>              flower.mask.ipv4.ipv4_src = mask->nw_src;
> diff --git a/lib/tc.c b/lib/tc.c
> index f3fb59c..8fbca7d 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -302,6 +302,10 @@ static const struct nl_policy tca_flower_policy[] = {
>                                  .optional = true, },
>      [TCA_FLOWER_KEY_IP_TTL_MASK] = { .type = NL_A_U8,
>                                       .optional = true, },
> +    [TCA_FLOWER_KEY_IP_TOS] = { .type = NL_A_U8,
> +                                .optional = true, },
> +    [TCA_FLOWER_KEY_IP_TOS_MASK] = { .type = NL_A_U8,
> +                                     .optional = true, },
>      [TCA_FLOWER_KEY_TCP_FLAGS] = { .type = NL_A_U16,
>                                     .optional = true, },
>      [TCA_FLOWER_KEY_TCP_FLAGS_MASK] = { .type = NL_A_U16,
> @@ -497,6 +501,11 @@ nl_parse_flower_ip(struct nlattr **attrs, struct tc_flower *flower) {
>          key->ip_ttl = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_IP_TTL]);
>          mask->ip_ttl = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_IP_TTL_MASK]);
>      }
> +
> +    if (attrs[TCA_FLOWER_KEY_IP_TOS_MASK]) {
> +        key->ip_tos = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_IP_TOS]);
> +        mask->ip_tos = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_IP_TOS_MASK]);
> +    }
>  }
>  
>  static enum tc_offloaded_state
> @@ -1626,6 +1635,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
>  
>      if (host_eth_type == ETH_P_IP || host_eth_type == ETH_P_IPV6) {
>          FLOWER_PUT_MASKED_VALUE(ip_ttl, TCA_FLOWER_KEY_IP_TTL);
> +        FLOWER_PUT_MASKED_VALUE(ip_tos, TCA_FLOWER_KEY_IP_TOS);
>  
>          if (flower->mask.ip_proto && flower->key.ip_proto) {
>              nl_msg_put_u8(request, TCA_FLOWER_KEY_IP_PROTO,
> diff --git a/lib/tc.h b/lib/tc.h
> index 447d85f..90ef32a 100644
> --- a/lib/tc.h
> +++ b/lib/tc.h
> @@ -95,6 +95,7 @@ struct tc_flower_key {
>  
>      uint8_t flags;
>      uint8_t ip_ttl;
> +    uint8_t ip_tos;
>  
>      struct {
>          ovs_be32 ipv4_src;
> -- 
> 2.5.5
> 


More information about the dev mailing list