On 22 Mar 2023, at 11:45, Eelco Chaudron wrote:
> On 22 Mar 2023, at 7:15, Chris Mi wrote: > >> On 3/20/2023 6:04 PM, Eelco Chaudron wrote: >>> On 20 Mar 2023, at 6:44, Chris Mi wrote: >>> >>>> On 3/16/2023 5:09 PM, Eelco Chaudron wrote: >>>>> On 1 Mar 2023, at 8:22, Chris Mi wrote: >>>>> >>>>>> When offloading sample action to TC, userspace creates a unique ID >>>>>> to map sFlow action and tunnel info and passes this ID to kernel >>>>>> instead of the sFlow info. Psample will send this ID and sampled >>>>>> packet to userspace. Using the ID, userspace can recover the sFlow >>>>>> info and send sampled packet to the right sFlow monitoring host. >>>>> See some comments inline below. >>>>> >>>>> //Eelco >>>>> >>>>>> Signed-off-by: Chris Mi<c...@nvidia.com> >>>>>> Reviewed-by: Roi Dayan<r...@nvidia.com> >>>>>> --- >>>>>> lib/netdev-offload-tc.c | 233 +++++++++++++++++++++++++++++++++++++++- >>>>>> lib/tc.h | 1 + >>>>>> 2 files changed, 232 insertions(+), 2 deletions(-) >>>>>> >>>>>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c >>>>>> index 4fb9d9f21..4214337d8 100644 >>>>>> --- a/lib/netdev-offload-tc.c >>>>>> +++ b/lib/netdev-offload-tc.c >>>>>> @@ -41,6 +41,7 @@ >>>>>> #include "unaligned.h" >>>>>> #include "util.h" >>>>>> #include "dpif-provider.h" >>>>>> +#include "cmap.h" >>>>>> >>>>>> VLOG_DEFINE_THIS_MODULE(netdev_offload_tc); >>>>>> >>>>>> @@ -103,6 +104,226 @@ static void parse_tc_flower_to_stats(struct >>>>>> tc_flower *flower, >>>>>> static int get_ufid_adjust_stats(const ovs_u128 *ufid, >>>>>> struct dpif_flow_stats *stats); >>>>>> >>>>>> +/* When offloading sample action to TC, userspace creates a unique ID >>>>>> + * to map sFlow action and tunnel info and passes this ID to kernel >>>>>> + * instead of the sFlow info. Psample will send this ID and sampled >>>>>> + * packet to userspace. Using the ID, userspace can recover the sFlow >>>>>> + * info and send sampled packet to the right sFlow monitoring host. >>>>>> + */ >>>>>> +struct offload_sflow { >>>>> Should we maybe already give this a more general name, like >>>>> offload_sample? >>>>> This as you need the same structure later when you add support of offload >>>>> sent to a controller? >>>> OK. >>>>> We might need an offload_type field. >>>> OK. >>>>>> + struct nlattr *action; /* SFlow action. Used in flow_get. */ >>>>>> + struct nlattr *userdata; /* Struct user_action_cookie. */ >>>>>> + struct nlattr *actions; /* All actions to get output tunnel. */ >>>>> You should not need actions at all, see comments later. These are the >>>>> next actions, which are not of interest to sflow offload. >>>> As the comment describes, we need it to get the output tunnel. Otherwise, >>>> we'll lose the following info using sflowtool after offloading: >>>> >>>> extendedType out_VNI >>>> out_VNI 4 >>>> flowBlock_tag 0:1023 >>>> flowSampleType tunnel_ipv4_out_IPV4 >>>> tunnel_ipv4_out_sampledPacketSize 0 >>>> tunnel_ipv4_out_IPSize 0 >>>> tunnel_ipv4_out_srcIP 0.0.0.0 >>>> tunnel_ipv4_out_dstIP 192.168.1.66 >>>> tunnel_ipv4_out_IPProtocol 17 >>>> tunnel_ipv4_out_IPTOS 0 >>>> tunnel_ipv4_out_UDPSrcPort 0 >>>> tunnel_ipv4_out_UDPDstPort 46354 >>>> >>>> I don't think we can get the output tunnel info without mapping 'actions'. >>> I’m confused as from the code it looks like actions are the outer actions, >>> and your actions should come from the inner actions, i.e., they should be >>> part of action. >> In my understanding, 'actions' is all actions, for example: >> "actions:userspace(pid=4294967295,sFlow(vid=0,pcp=0,output=935),actions),set(tunnel(tun_id=0x4,dst=192.168.1.66,ttl=64,tp_dst=4789,flags(df|key))),vxlan_sys_4789" >> Not sure what do you mean by outer actions and inner actions. > > > actions: [userspace(pid=4294967295,sFlow(vid=0,pcp=0,output=935),actions)], > [set(tunnel(tun_id=0x4,dst=192.168.1.66,ttl=64,tp_dst=4789,flags(df|key))),vxlan_sys_4789] > +---------------------------------------------------------------- > ------------------------------------------------------------------------------------------ > | \ > These are the remaining (outer) actions and the sflow implementation should > not care about this at all. > \ These are the sflow actions and this is all what sflow should care > about! > > > So sflow should only use the sFlow actions, and the remaining (outer) actions > should not be touched by sFlow these should be implemented/using the existing > TC offloads. > If you supply these actions to the upcall they are also executed (again) in > userspace, which they should not. > >>> Maybe I’m not understanding this correctly, and as this is a more complex >>> case, we should have a test case fore it. >>> >>> If you can share the test case before the next revision of the patchset, I >>> can revisit it to safe another version… >> Our QA reported this bug using their test. It's written in python. I'm >> afraid it doesn't help even if I can share it. >> They said that sflowtool shows different results between hw-offload="true" >> and non-offload. >> >> I read the code and found this: >> dpif_sflow_received() >> { >> ... >> /* Output tunnel. */ >> if (sflow_actions >> && sflow_actions->encap_depth == 1 >> && !sflow_actions->tunnel_err >> && dpif_sflow_cookie_num_outputs(cookie) == 1) { >> tnlOutProto = sflow_actions->tunnel_ipproto; >> if (tnlOutProto == 0) { >> .. >> >> After mapping the 'actions', the output tunnel appeared. I'm not sure if we >> can create such complex test using m4. >> And it needs https://github.com/sflow/sflowtool. Usually I run sflowtool >> manually to verify it. >> Hopefully this test will not block the following reviews. > > I think we need to resolve this before you sent out the next revision, so we > don’t end up with more revisions. > > There are already some tunnel cases for normal SFLOW which you could use as a > base for your tests. > > ./ofproto-dpif.at:7523:AT_SETUP([ofproto-dpif - sFlow packet sampling - > tunnel set]) > ./ofproto-dpif.at:7592:AT_SETUP([ofproto-dpif - sFlow packet sampling - > tunnel push]) > ./ofproto-dpif.at:7694:AT_SETUP([ofproto-dpif - sFlow packet sampling - MPLS]) > > Please create a test case so I understand what’s going on, as for now, I do > not see it from just reading code. Some additional information, the kernel passes on OVS_USERSPACE_ATTR_ACTIONS to upcall.actions. https://elixir.bootlin.com/linux/latest/source/net/openvswitch/actions.c#L988 >>>>>> + >>>>>> +/* Allocate a unique group id for the given set of flow metadata and >>>>>> + * optional actions. >>>>>> + */ >>>>> So assuming the ufid is part of the offload_sflow data and we only >>>>> support a single sample per flow we will probably not re-use the >>>>> metadata. So I guess this only makes sense if we support multiple >>>>> offloads per flow in the future am I right? >>>> Actually, ufid was introduced just for easy hashing and comparing. I >>>> didn't noticed that with this change, >>>> metadata can't be reused. Without ufid, arp and ip metedata can be reused, >>>> for example: >>>> >>>> recirc_id(0),in_port(enp8s0f0_1),eth(src=02:25:d0:65:01:02,dst=24:25:d0:e1:00:00),eth_type(0x0800),ipv4(tos=0,frag=no), >>>> packets:16, bytes:2330, used:0.110s, >>>> actions:userspace(pid=4294967295,sFlow(vid=0,pcp=0,output=2429),actions),set(tunnel(tun_id=0x4,dst=192.168.1.66,ttl=64,tp_dst=4789,flags(key))),vxlan_sys_4789 >>>> recirc_id(0),in_port(enp8s0f0_1),eth(src=02:25:d0:65:01:02,dst=24:25:d0:e1:00:00),eth_type(0x0806), >>>> packets:0, bytes:0, used:never, >>>> actions:userspace(pid=4294967295,sFlow(vid=0,pcp=0,output=2429),actions),set(tunnel(tun_id=0x4,dst=192.168.1.66,ttl=64,tp_dst=4789,flags(key))),vxlan_sys_4789 >>>> >>>> Maybe we should remove ufid to re-use meterdata. Or maybe keep it. So >>>> there is a 1:1 mapping for sample group id and ufid. >>>> What do you think, Eelco? >>> I’m ok with both designs if you use the 1:1 mapping you can remove the ref >>> counting, if you remove it you need to fix the above refcount comment. >> OK, I'll use 1:1 mapping. > > ACK > > <SNIP> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev