On 23 Mar 2023, at 10:28, Chris Mi wrote:

> On 3/22/2023 6:45 PM, 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 needshttps://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.
> Hi Eelco,
>
> How about this test case?
>
> AT_SETUP([offloads - sflow with tunnel set - offloads enabled])
> OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . 
> other_config:hw-offload=true])
>
> on_exit 'kill `cat test-sflow.pid`'
> AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 
> 0:127.0.0.1 > sflow.log], [0], [], [ignore])
> AT_CAPTURE_FILE([sflow.log])
> PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>
> AT_CHECK([ovs-appctl -t ovsdb-server exit])
> AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
> AT_CHECK([rm -f ovsdb-server.pid])
> AT_CHECK([rm -f ovs-vswitchd.pid])
> AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file 
> --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
> AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn 
> -vofproto_dpif -vunixctl], [0], [], [stderr])

I forgot to ask in previous reviews, but why do you need to restart the 
process? Can you not enable the logging with the ovs-appctl commands?

> on_exit "kill `cat ovsdb-server.pid`"
> on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>
> AT_CHECK([ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan \
>                     options:remote_ip=192.168.1.1 options:key=4 
> options:dst_port=4789 ofport_request=3])
> AT_CHECK([ovs-ofctl add-flow br0 "actions=3"])
> ADD_NAMESPACES(at_ns0, at_ns1)
> ADD_VETH(p0, at_ns0, br0, "1.1.1.1/16")
> mac=$(ip netns exec at_ns0 cat /sys/class/net/p0/address | sed 's/:/-/g')
> hdr="FF-FF-FF-FF-FF-FF-$mac-08-06"
> tunnel_hdr="tunnel4_out_length=0 tunnel4_out_protocol=17 
> tunnel4_out_src=0.0.0.0 tunnel4_out_dst=192.168.1.1 tunnel4_out_src_port=0 
> tunnel4_out_dst_port=46354 tunnel4_out_tcp_flags=0 tunnel4_out_tos=0 
> tunnel_out_vni=4"
> AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo 
> target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set 
> bridge br0 sflow=@sflow], [0], [ignore])
> NS_CHECK_EXEC([at_ns0], [arping -c 5 1.1.1.2], [1], [ignore])
>
> OVS_TRAFFIC_VSWITCHD_STOP
> OVS_APP_EXIT_AND_WAIT([test-sflow])
> count=`cat sflow.log | grep -i $hdr | grep "$tunnel_hdr" | wc -l`
> AT_CHECK([[[[ $count -eq 5 ]]]])
> AT_CLEANUP
>
> I ran it 100 times. All passed.

Visually inspecting this, it looks fine, however, is this failing without 
passing the actions parts?

Also, I think for the final version I would make sure a remote VXLAN port 
exists, so you can send actual traffic and verify you do not receive duplicate 
packets.

>>>>>>> +
>>>>>>> +/* 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

Reply via email to