On 22 Mar 2022, at 10:35, Eelco Chaudron wrote:
> The parse_key_and_mask_to_match() is a function to translate > a netlink formatted key/mask to match structure. And should > not consider any configuration setting when translating. > > In addition we also enforce the encap_eth_type[0] mask as > it's required for the VLAN match. > > Signed-off-by: Eelco Chaudron <[email protected]> Ilya, can you take a look at this one, it’s the only remaining patch from the “netdev-offload-tc: Fix various tc-offload related problems” series. Thanks, Eelco > --- > v4: > - Fixed call to odp_flow_key_to_mask__() to ignore vlan limit. > - Force encap_eth_type[0] mask as it was used for VLAN matching. > > lib/netdev-offload-tc.c | 2 +- > lib/odp-util.c | 41 ++++++++++++++++++++++++++++------------- > 2 files changed, 29 insertions(+), 14 deletions(-) > > diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c > index 9845e8d3f..7f0d4bbff 100644 > --- a/lib/netdev-offload-tc.c > +++ b/lib/netdev-offload-tc.c > @@ -1638,7 +1638,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match > *match, > > if (mask->vlans[0].tpid && eth_type_vlan(key->vlans[0].tpid)) { > flower.key.encap_eth_type[0] = flower.key.eth_type; > - flower.mask.encap_eth_type[0] = flower.mask.eth_type; > + flower.mask.encap_eth_type[0] = CONSTANT_HTONS(0xffff); > flower.key.eth_type = key->vlans[0].tpid; > flower.mask.eth_type = mask->vlans[0].tpid; > } > diff --git a/lib/odp-util.c b/lib/odp-util.c > index 0ff302856..4389df6a6 100644 > --- a/lib/odp-util.c > +++ b/lib/odp-util.c > @@ -7188,7 +7188,8 @@ parse_8021q_onward(const struct nlattr > *attrs[OVS_KEY_ATTR_MAX + 1], > uint64_t present_attrs, int out_of_range_attr, > uint64_t expected_attrs, struct flow *flow, > const struct nlattr *key, size_t key_len, > - const struct flow *src_flow, char **errorp) > + const struct flow *src_flow, char **errorp, > + bool ignore_vlan_limit) > { > static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > bool is_mask = src_flow != flow; > @@ -7196,9 +7197,11 @@ parse_8021q_onward(const struct nlattr > *attrs[OVS_KEY_ATTR_MAX + 1], > const struct nlattr *encap; > enum odp_key_fitness encap_fitness; > enum odp_key_fitness fitness = ODP_FIT_ERROR; > + int vlan_limit; > int encaps = 0; > > - while (encaps < flow_vlan_limit && > + vlan_limit = ignore_vlan_limit ? FLOW_MAX_VLAN_HEADERS : flow_vlan_limit; > + while (encaps < vlan_limit && > (is_mask > ? (src_flow->vlans[encaps].tci & htons(VLAN_CFI)) != 0 > : eth_type_vlan(flow->dl_type))) { > @@ -7281,7 +7284,7 @@ parse_8021q_onward(const struct nlattr > *attrs[OVS_KEY_ATTR_MAX + 1], > static enum odp_key_fitness > odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, > struct flow *flow, const struct flow *src_flow, > - char **errorp) > + char **errorp, bool ignore_vlan_limit) > { > /* New "struct flow" fields that are visible to the datapath (including > all > * data fields) should be translated from equivalent datapath flow fields > @@ -7431,7 +7434,7 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t > key_len, > : eth_type_vlan(src_flow->dl_type)) { > fitness = parse_8021q_onward(attrs, present_attrs, out_of_range_attr, > expected_attrs, flow, key, key_len, > - src_flow, errorp); > + src_flow, errorp, ignore_vlan_limit); > } else { > if (is_mask) { > /* A missing VLAN mask means exact match on vlan_tci 0 (== no > @@ -7497,7 +7500,7 @@ enum odp_key_fitness > odp_flow_key_to_flow(const struct nlattr *key, size_t key_len, > struct flow *flow, char **errorp) > { > - return odp_flow_key_to_flow__(key, key_len, flow, flow, errorp); > + return odp_flow_key_to_flow__(key, key_len, flow, flow, errorp, false); > } > > /* Converts the 'mask_key_len' bytes of OVS_KEY_ATTR_* attributes in > 'mask_key' > @@ -7509,14 +7512,16 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t > key_len, > * If 'errorp' is nonnull, this function uses it for detailed error reports: > if > * the return value is ODP_FIT_ERROR, it stores a malloc()'d error string in > * '*errorp', otherwise NULL. */ > -enum odp_key_fitness > -odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len, > - struct flow_wildcards *mask, const struct flow > *src_flow, > - char **errorp) > +static enum odp_key_fitness > +odp_flow_key_to_mask__(const struct nlattr *mask_key, size_t mask_key_len, > + struct flow_wildcards *mask, > + const struct flow *src_flow, > + char **errorp, bool ignore_vlan_limit) > { > if (mask_key_len) { > return odp_flow_key_to_flow__(mask_key, mask_key_len, > - &mask->masks, src_flow, errorp); > + &mask->masks, src_flow, errorp, > + ignore_vlan_limit); > } else { > if (errorp) { > *errorp = NULL; > @@ -7530,6 +7535,15 @@ odp_flow_key_to_mask(const struct nlattr *mask_key, > size_t mask_key_len, > } > } > > +enum odp_key_fitness > +odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len, > + struct flow_wildcards *mask, > + const struct flow *src_flow, char **errorp) > +{ > + return odp_flow_key_to_mask__(mask_key, mask_key_len, mask, src_flow, > + errorp, false); > +} > + > /* Converts the netlink formated key/mask to match. > * Fails if odp_flow_key_from_key/mask and odp_flow_key_key/mask > * disagree on the acceptable form of flow */ > @@ -7540,7 +7554,8 @@ parse_key_and_mask_to_match(const struct nlattr *key, > size_t key_len, > { > enum odp_key_fitness fitness; > > - fitness = odp_flow_key_to_flow(key, key_len, &match->flow, NULL); > + fitness = odp_flow_key_to_flow__(key, key_len, &match->flow, > &match->flow, > + NULL, true); > if (fitness) { > /* This should not happen: it indicates that > * odp_flow_key_from_flow() and odp_flow_key_to_flow() disagree on > @@ -7561,8 +7576,8 @@ parse_key_and_mask_to_match(const struct nlattr *key, > size_t key_len, > return EINVAL; > } > > - fitness = odp_flow_key_to_mask(mask, mask_len, &match->wc, &match->flow, > - NULL); > + fitness = odp_flow_key_to_mask__(mask, mask_len, &match->wc, > &match->flow, > + NULL, true); > if (fitness) { > /* This should not happen: it indicates that > * odp_flow_key_from_mask() and odp_flow_key_to_mask() > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
