On 7/14/22 19:03, Roi Dayan wrote: > > > On 2022-07-14 4:18 PM, Ilya Maximets wrote: >> On 7/14/22 15:13, Roi Dayan wrote: >>> >>> >>> On 2022-07-14 4:01 PM, Roi Dayan wrote: >>>> >>>> >>>> On 2022-07-14 3:52 PM, Roi Dayan wrote: >>>>> >>>>> >>>>> On 2022-07-14 3:37 PM, Roi Dayan wrote: >>>>>> >>>>>> >>>>>> On 2022-07-13 7:28 PM, Ilya Maximets wrote: >>>>>>> On 7/13/22 12:11, Roi Dayan wrote: >>>>>>>> >>>>>>>> >>>>>>>> On 2022-07-13 12:01 PM, Roi Dayan wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> On 2022-07-06 4:58 PM, Roi Dayan wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On 2022-07-05 1:45 AM, Ilya Maximets wrote: >>>>>>>>>>> Current offloading code supports only limited number of tunnel keys >>>>>>>>>>> and silently ignores everything it doesn't understand. This is >>>>>>>>>>> causing, for example, offloaded ERSPAN tunnels to not work, because >>>>>>>>>>> flow is offloaded, but ERSPAN options are not provided to TC. >>>>>>>>>>> >>>>>>>>>>> There is a number of tunnel keys, which are supported by the >>>>>>>>>>> userspace, >>>>>>>>>>> but silently ignored during offloading: >>>>>>>>>>> >>>>>>>>>>> OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT >>>>>>>>>>> OVS_TUNNEL_KEY_ATTR_OAM >>>>>>>>>>> OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS >>>>>>>>>>> OVS_TUNNEL_KEY_ATTR_ERSPAN_OPTS >>>>>>>>>>> >>>>>>>>>>> OVS_TUNNEL_KEY_ATTR_CSUM is kind of supported, but only for actions >>>>>>>>>>> and for some reason is set from the tunnel port instead of the >>>>>>>>>>> provided action, and not currently supported for the tunnel key in >>>>>>>>>>> the match. >>>>>>>>>>> >>>>>>>>>>> Addig a default case to fail offloading of unknown attributes. For >>>>>>>>>>> now explicitly allowing incorrect behavior for the DONT_FRAGMENT >>>>>>>>>>> flag, >>>>>>>>>>> otherwise we'll break all tunnel offloading by default. VXLAN and >>>>>>>>>>> ERSPAN options has to fail offloading, because the tunnel will not >>>>>>>>>>> work otherwise. OAM is not a default configurations, so failing it >>>>>>>>>>> as well. The missing DONT_FRAGMENT flag though should, probably, >>>>>>>>>>> cause frequent flow revalidation, but that is not new with this >>>>>>>>>>> patch. >>>>>>>>>>> >>>>>>>>>>> Same for the 'match' key, only clearing masks that was actually >>>>>>>>>>> consumed, except for the DONT_FRAGMENT and CSUM flags, which are >>>>>>>>>>> explicitly allowed and highlighted as broken. >>>>>>>>>>> >>>>>>>>>>> Also, ttl and tos were incorrectly checked by the value instead of a >>>>>>>>>>> mask during the flow key dump. Destination port as well as CSUM >>>>>>>>>>> configuration for unknown reason was not taken from the actions list >>>>>>>>>>> and were passed via HW offload info. >>>>>>>>>>> >>>>>>>>>>> Reported-at: >>>>>>>>>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.openvswitch.org%2Fpipermail%2Fovs-dev%2F2022-July%2F395522.html&data=05%7C01%7Croid%40nvidia.com%7Cd5529f26731846561c5108da659b57a3%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637934015121728988%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=s9utolIUQDeF7SP0gwe6PucT%2FUzp99uHNpV3W9b0Z6M%3D&reserved=0 >>>>>>>>>>> Reported-by: Eelco Chaudron <[email protected]> >>>>>>>>>>> Fixes: 8f283af89298 ("netdev-tc-offloads: Implement netdev flow put >>>>>>>>>>> using tc interface") >>>>>>>>>>> Signed-off-by: Ilya Maximets <[email protected]> >>>>>>>>>>> --- >>>>>>>>>>> lib/dpif-netlink.c | 14 +--------- >>>>>>>>>>> lib/netdev-offload-tc.c | 57 >>>>>>>>>>> ++++++++++++++++++++++++++++++++++------- >>>>>>>>>>> lib/netdev-offload.h | 3 --- >>>>>>>>>>> 3 files changed, 49 insertions(+), 25 deletions(-) >>>>>>>>>>> >>>>>>>>>>> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c >>>>>>>>>>> index 06e1e8ca0..1e116b4ad 100644 >>>>>>>>>>> --- a/lib/dpif-netlink.c >>>>>>>>>>> +++ b/lib/dpif-netlink.c >>>>>>>>>>> @@ -2237,8 +2237,6 @@ parse_flow_put(struct dpif_netlink *dpif, >>>>>>>>>>> struct dpif_flow_put *put) >>>>>>>>>>> size_t left; >>>>>>>>>>> struct netdev *dev; >>>>>>>>>>> struct offload_info info; >>>>>>>>>>> - ovs_be16 dst_port = 0; >>>>>>>>>>> - uint8_t csum_on = false; >>>>>>>>>>> int err; >>>>>>>>>>> info.tc_modify_flow_deleted = false; >>>>>>>>>>> @@ -2258,10 +2256,9 @@ parse_flow_put(struct dpif_netlink *dpif, >>>>>>>>>>> struct dpif_flow_put *put) >>>>>>>>>>> return EOPNOTSUPP; >>>>>>>>>>> } >>>>>>>>>>> - /* Get tunnel dst port */ >>>>>>>>>>> + /* Check the output port for a tunnel. */ >>>>>>>>>>> NL_ATTR_FOR_EACH(nla, left, put->actions, put->actions_len) >>>>>>>>>>> { >>>>>>>>>>> if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { >>>>>>>>>>> - const struct netdev_tunnel_config *tnl_cfg; >>>>>>>>>>> struct netdev *outdev; >>>>>>>>>>> odp_port_t out_port; >>>>>>>>>>> @@ -2271,19 +2268,10 @@ parse_flow_put(struct dpif_netlink *dpif, >>>>>>>>>>> struct dpif_flow_put *put) >>>>>>>>>>> err = EOPNOTSUPP; >>>>>>>>>>> goto out; >>>>>>>>>>> } >>>>>>>>>>> - tnl_cfg = netdev_get_tunnel_config(outdev); >>>>>>>>>>> - if (tnl_cfg && tnl_cfg->dst_port != 0) { >>>>>>>>>>> - dst_port = tnl_cfg->dst_port; >>>>>>>>>>> - } >>>>>>>>>>> - if (tnl_cfg) { >>>>>>>>>>> - csum_on = tnl_cfg->csum; >>>>>>>>>>> - } >>>>>>>>>>> netdev_close(outdev); >>>>>>>>>>> } >>>>>>>>>>> } >>>>>>>>>>> - info.tp_dst_port = dst_port; >>>>>>>>>>> - info.tunnel_csum_on = csum_on; >>>>>>>>>>> info.recirc_id_shared_with_tc = (dpif->user_features >>>>>>>>>>> & >>>>>>>>>>> OVS_DP_F_TC_RECIRC_SHARING); >>>>>>>>>>> err = netdev_flow_put(dev, &match, >>>>>>>>>>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c >>>>>>>>>>> index 262faf3c6..e62687c82 100644 >>>>>>>>>>> --- a/lib/netdev-offload-tc.c >>>>>>>>>>> +++ b/lib/netdev-offload-tc.c >>>>>>>>>>> @@ -805,11 +805,11 @@ parse_tc_flower_to_match(struct tc_flower >>>>>>>>>>> *flower, >>>>>>>>>>> &flower->key.tunnel.ipv6.ipv6_src, >>>>>>>>>>> &flower->mask.tunnel.ipv6.ipv6_src); >>>>>>>>>>> } >>>>>>>>>>> - if (flower->key.tunnel.tos) { >>>>>>>>>>> + if (flower->mask.tunnel.tos) { >>>>>>>>>>> match_set_tun_tos_masked(match, >>>>>>>>>>> flower->key.tunnel.tos, >>>>>>>>>>> flower->mask.tunnel.tos); >>>>>>>>>>> } >>>>>>>>>>> - if (flower->key.tunnel.ttl) { >>>>>>>>>>> + if (flower->mask.tunnel.ttl) { >>>>>>>>>>> match_set_tun_ttl_masked(match, >>>>>>>>>>> flower->key.tunnel.ttl, >>>>>>>>>>> flower->mask.tunnel.ttl); >>>>>>>>>>> } >>>>>>>>>>> @@ -1284,9 +1284,11 @@ static int >>>>>>>>>>> parse_put_flow_set_action(struct tc_flower *flower, struct >>>>>>>>>>> tc_action *action, >>>>>>>>>>> const struct nlattr *set, size_t >>>>>>>>>>> set_len) >>>>>>>>>>> { >>>>>>>>>>> + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); >>>>>>>>>>> const struct nlattr *tunnel; >>>>>>>>>>> const struct nlattr *tun_attr; >>>>>>>>>>> size_t tun_left, tunnel_len; >>>>>>>>>>> + bool attr_csum_present; >>>>>>>>>>> if (nl_attr_type(set) == OVS_KEY_ATTR_MPLS) { >>>>>>>>>>> return parse_mpls_set_action(flower, action, set); >>>>>>>>>>> @@ -1300,6 +1302,7 @@ parse_put_flow_set_action(struct tc_flower >>>>>>>>>>> *flower, struct tc_action *action, >>>>>>>>>>> tunnel = nl_attr_get(set); >>>>>>>>>>> tunnel_len = nl_attr_get_size(set); >>>>>>>>>>> + attr_csum_present = false; >>>>>>>>>>> action->type = TC_ACT_ENCAP; >>>>>>>>>>> action->encap.id_present = false; >>>>>>>>>>> flower->action_count++; >>>>>>>>>>> @@ -1326,6 +1329,19 @@ parse_put_flow_set_action(struct tc_flower >>>>>>>>>>> *flower, struct tc_action *action, >>>>>>>>>>> action->encap.ttl = nl_attr_get_u8(tun_attr); >>>>>>>>>>> } >>>>>>>>>>> break; >>>>>>>>>>> + case OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT: { >>>>>>>>>>> + /* XXX: This is wrong! We're ignoring the DF flag >>>>>>>>>>> configuration >>>>>>>>>>> + * requested by the user. However, TC for now has no >>>>>>>>>>> way to pass >>>>>>>>>>> + * that flag and it is set by default, meaning tunnel >>>>>>>>>>> offloading >>>>>>>>>>> + * will not work if 'options:df_default=false' is not >>>>>>>>>>> set. >>>>>>>>>>> + * Keeping incorrect behavior for now. */ >>>>>>>>>>> + } >>>>>>>>>>> + break; >>>>>>>>>>> + case OVS_TUNNEL_KEY_ATTR_CSUM: { >>>>>>>>>>> + attr_csum_present = true; >>>>>>>>>>> + action->encap.no_csum = !nl_attr_get_u8(tun_attr); >>>>>>>>>>> + } >>>>>>>>>>> + break; >>>>>>>>>>> case OVS_TUNNEL_KEY_ATTR_IPV6_SRC: { >>>>>>>>>>> action->encap.ipv6.ipv6_src = >>>>>>>>>>> nl_attr_get_in6_addr(tun_attr); >>>>>>>>>>> @@ -1350,9 +1366,17 @@ parse_put_flow_set_action(struct tc_flower >>>>>>>>>>> *flower, struct tc_action *action, >>>>>>>>>>> action->encap.data.present.len = >>>>>>>>>>> nl_attr_get_size(tun_attr); >>>>>>>>>>> } >>>>>>>>>>> break; >>>>>>>>>>> + default: >>>>>>>>>>> + VLOG_DBG_RL(&rl, "unsupported tunnel key attribute %d", >>>>>>>>>>> + nl_attr_type(tun_attr)); >>>>>>>>>>> + return EOPNOTSUPP; >>>>>>>>>>> } >>>>>>>>>>> } >>>>>>>>>>> + if (!attr_csum_present) { >>>>>>>>>>> + action->encap.no_csum = 1; >>>>>>>>>>> + } >>>>>>>>>>> + >>>>>>>>>>> return 0; >>>>>>>>>>> } >>>>>>>>>>> @@ -1448,7 +1472,7 @@ test_key_and_mask(struct match *match) >>>>>>>>>>> static void >>>>>>>>>>> flower_match_to_tun_opt(struct tc_flower *flower, const struct >>>>>>>>>>> flow_tnl *tnl, >>>>>>>>>>> - const struct flow_tnl *tnl_mask) >>>>>>>>>>> + struct flow_tnl *tnl_mask) >>>>>>>>>>> { >>>>>>>>>>> struct geneve_opt *opt, *opt_mask; >>>>>>>>>>> int len, cnt = 0; >>>>>>>>>>> @@ -1472,6 +1496,10 @@ flower_match_to_tun_opt(struct tc_flower >>>>>>>>>>> *flower, const struct flow_tnl *tnl, >>>>>>>>>>> } >>>>>>>>>>> flower->mask.tunnel.metadata.present.len = >>>>>>>>>>> tnl->metadata.present.len; >>>>>>>>>>> + >>>>>>>>>>> + memset(tnl_mask->metadata.opts.gnv, 0, >>>>>>>>>>> tnl->metadata.present.len); >>>>>>>>>>> + memset(&tnl_mask->metadata.present.len, 0, >>>>>>>>>>> + sizeof tnl_mask->metadata.present.len); >>>>>>>>>>> } >>>>>>>>>>> static void >>>>>>>>>>> @@ -1576,7 +1604,7 @@ netdev_tc_flow_put(struct netdev *netdev, >>>>>>>>>>> struct match *match, >>>>>>>>>>> const struct flow *key = &match->flow; >>>>>>>>>>> struct flow *mask = &match->wc.masks; >>>>>>>>>>> const struct flow_tnl *tnl = &match->flow.tunnel; >>>>>>>>>>> - const struct flow_tnl *tnl_mask = &mask->tunnel; >>>>>>>>>>> + struct flow_tnl *tnl_mask = &mask->tunnel; >>>>>>>>>>> struct tc_action *action; >>>>>>>>>>> bool recirc_act = false; >>>>>>>>>>> uint32_t block_id = 0; >>>>>>>>>>> @@ -1624,10 +1652,25 @@ netdev_tc_flow_put(struct netdev *netdev, >>>>>>>>>>> struct match *match, >>>>>>>>>>> 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; >>>>>>>>>>> + memset(&tnl_mask->tun_id, 0, sizeof tnl_mask->tun_id); >>>>>>>>>>> + memset(&tnl_mask->ip_src, 0, sizeof tnl_mask->ip_src); >>>>>>>>>>> + memset(&tnl_mask->ip_dst, 0, sizeof tnl_mask->ip_dst); >>>>>>>>>>> + memset(&tnl_mask->ipv6_src, 0, sizeof tnl_mask->ipv6_src); >>>>>>>>>>> + memset(&tnl_mask->ipv6_dst, 0, sizeof tnl_mask->ipv6_dst); >>>>>>>>>>> + memset(&tnl_mask->ip_tos, 0, sizeof tnl_mask->ip_tos); >>>>>>>>>>> + memset(&tnl_mask->ip_ttl, 0, sizeof tnl_mask->ip_ttl); >>>>>>>>>>> + tnl_mask->flags &= ~FLOW_TNL_F_KEY; >>>>>>>>>>> + >>>>>>>>>>> + /* XXX: This is wrong! We're ignoring DF and CSUM flags >>>>>>>>>>> configuration >>>>>>>>>>> + * requested by the user. However, TC for now has no way >>>>>>>>>>> to pass >>>>>>>>>>> + * these flags in a flower key and their masks are set by >>>>>>>>>>> default, >>>>>>>>>>> + * meaning tunnel offloading will not work at all if not >>>>>>>>>>> cleared. >>>>>>>>>>> + * Keeping incorrect behavior for now. */ >>>>>>>>>>> + tnl_mask->flags &= ~(FLOW_TNL_F_DONT_FRAGMENT | >>>>>>>>>>> FLOW_TNL_F_CSUM); >>>>>>>>>>> + >>>>>>>>>>> flower_match_to_tun_opt(&flower, tnl, tnl_mask); >>>>>>>>>>> flower.tunnel = true; >>>>>>>>>>> } >>>>>>>>>>> - memset(&mask->tunnel, 0, sizeof mask->tunnel); >>>>>>>>>>> flower.key.eth_type = key->dl_type; >>>>>>>>>>> flower.mask.eth_type = mask->dl_type; >>>>>>>>>>> @@ -1899,10 +1942,6 @@ netdev_tc_flow_put(struct netdev *netdev, >>>>>>>>>>> struct match *match, >>>>>>>>>>> if (err) { >>>>>>>>>>> return err; >>>>>>>>>>> } >>>>>>>>>>> - if (action->type == TC_ACT_ENCAP) { >>>>>>>>>>> - action->encap.tp_dst = info->tp_dst_port; >>>>>>>>>>> - action->encap.no_csum = !info->tunnel_csum_on; >>>>>>>>>>> - } >>>>>>>>>>> } else if (nl_attr_type(nla) == >>>>>>>>>>> OVS_ACTION_ATTR_SET_MASKED) { >>>>>>>>>>> const struct nlattr *set = nl_attr_get(nla); >>>>>>>>>>> const size_t set_len = nl_attr_get_size(nla); >>>>>>>>>>> diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h >>>>>>>>>>> index 8237a85dd..93eb2df48 100644 >>>>>>>>>>> --- a/lib/netdev-offload.h >>>>>>>>>>> +++ b/lib/netdev-offload.h >>>>>>>>>>> @@ -65,9 +65,6 @@ struct netdev_flow_dump { >>>>>>>>>>> /* Flow offloading. */ >>>>>>>>>>> struct offload_info { >>>>>>>>>>> - ovs_be16 tp_dst_port; /* Destination port for tunnel in SET >>>>>>>>>>> action */ >>>>>>>>>>> - uint8_t tunnel_csum_on; /* Tunnel header with checksum */ >>>>>>>>>>> - >>>>>>>>>>> bool recirc_id_shared_with_tc; /* Indicates whever tc >>>>>>>>>>> chains will be in >>>>>>>>>>> * sync with datapath >>>>>>>>>>> recirc ids. */ >>>>>>>>>> >>>>>>>>>> Acked-by: Roi Dayan <[email protected]> >>>>>>>>> >>>>>>>>> hi, >>>>>>>>> >>>>>>>>> I did ack too early maybe I did some more tests and found dpctl rule I >>>>>>>>> could add before this commit now fail with this commit. >>>>>>>>> >>>>>>>>> I created an ovs bridge with a vxlan port and tried the following: >>>>>>>>> >>>>>>>>> ovs-appctl dpctl/add-flow >>>>>>>>> 'ufid:c5f9a0b1-3399-4436-b742-30825c64a1e5,recirc_id(0),in_port(2),eth_type(0x0800),eth(src=00:00:00:00:00:00/00:00:00:00:00:00,dst=fa:16:3e:2a:4e:23),tunnel(tun_id=0x65,src=10.10.11.3,dst=10.10.11.2,ttl=0/0,tp_dst=4789,flags(+key)),ipv4(src=0.0.0.0/0.0.0.0,dst=0.0.0.0/0.0.0.0,proto=0/0,tos=0/0x3,ttl=0/0,frag=no)' >>>>>>>>> >>>>>>>>> 'set(tunnel(tun_id=0x66,src=10.10.12.2,dst=10.10.12.3,tp_dst=4789,flags(key))),2' >>>>>>>>> >>>>>>>>> ovs-vswitchd: updating flow table (Invalid argument) >>>>>>>>> ovs-appctl: ovs-vswitchd: server returned an error >>>>>>>>> >>>>>>>>> >>>>>>>>> Other rule like the following that was offloaded to TC before this >>>>>>>>> commit now not added to TC. added ovs dbg and got the error in the >>>>>>>>> log. >>>>>>>>> >>>>>>>>> ovs-appctl dpctl/add-flow >>>>>>>>> 'ufid:c5f9a0b1-3399-4436-b742-30825c64a1e5,recirc_id(0),tunnel(tun_id=0x2a,src=2.2.2.3,dst=2.2.2.2,tp_dst=4789,ttl=64/0),in_port(3),eth(src=56:52:2d:21:4d:93,dst=92:c1:04:ce:fd:51),eth_type(0x0800),ipv4(src=1.1.1.1)' >>>>>>>>> 2 >>>>>>>>> >>>>>>>>> 2022-07-13T08:59:36.100Z|00053|netdev_offload_tc|DBG|offloading isn't >>>>>>>>> supported, unknown attribute >>>>>>>>> >>>>>>>>> I need to go over the commit again and debug for more detailed info. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Roi >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> In netdev_tc_flow_put() since you removed the memset on the tunnel >>>>>>>> and reset per field you need to reset also tp_src/dst to keep working >>>>>>>> and not break at this commit. >>>>>>>> >>>>>>>> + memset(&tnl_mask->tp_src, 0, sizeof tnl_mask->tp_src); >>>>>>>> + memset(&tnl_mask->tp_dst, 0, sizeof tnl_mask->tp_dst); >>>>>>>> >>>>>>>> >>>>>>>> this solves the issues I encountered and my tests pass. >>>>>>>> >>>>>>> >>>>>>> Good catch. Yes, we need to move that part from the patch #2 >>>>>>> to this one, even though we're not using these masks. We're >>>>>>> still using keys themselves, but with exact match instead. >>>>>>> >>>>>>> Is it the only issue you found with this change? >>>>>> >>>>>> I encountered another issue. >>>>>> I config ovs with vxlan interface and key:flow. >>>>>> I set the key using openflow rule and ping between 2 interfaces. >>>>>> the encap rule is not being added to tc. >>>>>> 2022-07-14T12:34:36.910Z|00001|netdev_offload_tc(handler5)|DBG|offloading >>>>>> isn't supported, unknown attribute >>>>>> >>>>>> I need to some prints and find which attribute like i did for tp_dst/src. >>>>>> >>>>>> ovs-vsctl add-br brv-1 >>>>>> ovs-vsctl add-port brv-1 veth1 >>>>>> >>>>>> ovs-vsctl add-port brv-1 vxlan0 -- set interface vxlan0 type=vxlan >>>>>> options:local_ip=$local_tun options:remote_ip=$remote_tun >>>>>> options:key=flow options:dst_port=4789 >>>>>> >>>>>> ovs-ofctl add-flow brv-1 "table=0,in_port=veth1 >>>>>> actions=set_field:42->tun_id,vxlan0" >>>>>> >>>>>> ovs-ofctl add-flow brv-1 "table=0,in_port=vxlan0 actions=veth1" >>>>>> >>>>>> >>>>> >>>>> added some prints and its mask->tunnel.tun_id but there is >>>>> zeroing of it so not sure why i get to this. >>>>> >>>>> 2022-07-14T12:43:58.543Z|00001|netdev_offload_tc(handler10)|DBG|offloading >>>>> isn't supported, unknown tunnel attribute >>>>> 2022-07-14T12:43:58.543Z|00002|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 40 value ff >>>>> 2022-07-14T12:43:58.543Z|00003|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 41 value ff >>>>> 2022-07-14T12:43:58.543Z|00004|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 42 value ff >>>>> 2022-07-14T12:43:58.543Z|00005|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 43 value ff >>>>> 2022-07-14T12:43:58.543Z|00006|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 44 value ff >>>>> 2022-07-14T12:43:58.543Z|00007|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 45 value ff >>>>> 2022-07-14T12:43:58.543Z|00008|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 46 value ff >>>>> 2022-07-14T12:43:58.543Z|00009|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 47 value ff >>>>> 2022-07-14T12:43:58.543Z|00010|netdev_offload_tc(handler10)|DBG|non zero >>>>> offset 48 value 8 >>>>> >>>> >>>> its also the tunnel->flags >>>> 2022-07-14T13:00:54.863Z|00002|netdev_offload_tc(handler10)|DBG|non zero >>>> offset 48 value 8 >>>> >>>> >>>> i did set df_default=false like your comment suggested. >>> >>> ok so found we dont get insite the tunnel if clause. >>> but the tunnel mask is filled with dp_dst and flags. >>> I have no idea why currently but instead of removing the memset >>> of tunnel mask done in this commit I moved it into an else caluse. >>> is it ok by you? >>> >>> >>> if (flow_tnl_dst_is_set(&key->tunnel) || >>> flow_tnl_src_is_set(&key->tunnel)) { >>> .... >>> } else { >>> memset(tnl_mask, 0, sizeof *tnl_mask); >>> } >>> >>> >> >> Makes sense. It looks like the issue fixed for rte_flow offload here: >> 0ef70536eb41 ("netdev-offload-dpdk: Support vxlan encap offload with >> load actions.") >> >> So, the soulution could be what you did. >> The same can also be fixed by the following patch: >> >> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatchwork.ozlabs.org%2Fproject%2Fopenvswitch%2Fpatch%2F1651219110-2264-1-git-send-email-wenxu%40chinatelecom.cn%2F&data=05%7C01%7Croid%40nvidia.com%7Cd5529f26731846561c5108da659b57a3%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637934015121728988%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=yMJgMsFj8B5xGA48T19gpiNJ8wxulrN9N4PwQTAhalA%3D&reserved=0 >> >> In general, I think, it's an artifact of tunnel metadata being >> supplied via action. That doesn't fit nicely into generic flow >> translation. >> >> Best regards, Ilya Maximets. > > sure both ok for me. > > > also, is it ok by you to add more debug into test_key_and_mask() for > easy getting non zero offsets in debug. > something like this > > +static void > +find_non_zero_fields(const void *p_, size_t n) > +{ > + const uint8_t *p = p_; > + size_t i; > + > + for (i = 0; i < n; i++) { > + if (p[i] != 0x00) { > + VLOG_DBG("non zero offset %lu value %x", i, p[i]); > + } > + } > +} > > > + if (!is_all_zeros(&mask->tunnel, sizeof mask->tunnel)) { > + VLOG_DBG_RL(&rl, "offloading isn't supported, unknown tunnel > attribute"); > + find_non_zero_fields(&mask->tunnel, sizeof mask->tunnel); > + return EOPNOTSUPP; > + } > + > if (!is_all_zeros(mask, sizeof *mask)) { > VLOG_DBG_RL(&rl, "offloading isn't supported, unknown attribute"); > + find_non_zero_fields(mask, sizeof *mask); > return EOPNOTSUPP; > } > > > > I guess also adding a way to avoid the loop in find_non_zero_fields() > entirely if debug not enabled for this module. > > I find myself adding this code when I need to find which masks > are not zeroed.
Yes, that makes a lot of sense. I would prefer a slighly different implementation though, by re-using bits of the ds_put_hex_dump(). I'll post some patches for that. Will also re-spin this patch set with discussed changes and more fixes. Best regards, Ilya Maximets. _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
