On Mon, Oct 16, 2023 at 4:08 AM Roi Dayan via dev <ovs-dev@openvswitch.org> wrote: > > > On 16/10/2023 11:00, Roi Dayan wrote: > > > > On 16/10/2023 10:42, Eelco Chaudron wrote: > >> > >> > >> On 16 Oct 2023, at 9:09, Roi Dayan wrote: > >> > >>> On 09/10/2023 15:05, Roi Dayan wrote: > >>>> The cited commit fixed missing mirror packets by reset mirror when > >>>> packets are modified but setting geneve options was also treated as > >>>> a modified packet but should be treated as a part of set_tunnel > >>>> which doesn't reset mirror. > >>>> > >>>> Fixes: feed7f677505 ("ofproto-dpif-upcall: Mirror packets that are > >>>> modified.") > >>>> Signed-off-by: Roi Dayan <r...@nvidia.com> > >>>> Acked-by: Simon Horman <ho...@ovn.org> > >>>> Acked-by: Eelco Chaudron <echau...@redhat.com> > >>>> --- > >>>> > >>>> Notes: > >>>> v2: > >>>> - user correct sha in fixes line. > >>>> > >>>> ofproto/ofproto-dpif-xlate.c | 2 +- > >>>> 1 file changed, 1 insertion(+), 1 deletion(-) > >>>> > >>>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > >>>> index be4bd6657688..e243773307b7 100644 > >>>> --- a/ofproto/ofproto-dpif-xlate.c > >>>> +++ b/ofproto/ofproto-dpif-xlate.c > >>>> @@ -7097,7 +7097,7 @@ reset_mirror_ctx(struct xlate_ctx *ctx, const > >>>> struct flow *flow, > >>>> > >>>> set_field = ofpact_get_SET_FIELD(a); > >>>> mf = set_field->field; > >>>> - if (mf_are_prereqs_ok(mf, flow, NULL)) { > >>>> + if (mf_are_prereqs_ok(mf, flow, NULL) && > >>>> !mf_is_tun_metadata(mf)) { > >>>> ctx->mirrors = 0; > >>>> } > >>>> return; > >>> > >>> > >>> Hi, > >>> > >>> I would like to consult another related issue to the original commit. > >>> > >>> feed7f677505 ("ofproto-dpif-upcall: Mirror packets that are modified.") > >>> > >>> Now with geneve options the redundant mirror is removed but if there will > >>> be > >>> a real modification there will still be a mirror output but in an > >>> incorrect place. > >>> > >>> For example adding dec_ttl, the action list will be like this: > >>> > >>> actions:enp8s0f0_1,set(tunnel(tun_id=0x2a,src=7.7.7.7,dst=7.7.7.8,ttl=64,tp_dst=6081,geneve({class=0xffff,type=0x80,len=4,0x1234}),flags(df|key))),set(ipv4(ttl=63)),genev_sys_6081,enp8s0f0_1 > >>> > >>> A mirror output enp8s0f0_1 added at the end but the second mirror is with > >>> the tunnel header already. > >>> > >>> When not using tunnels the mirror is fine and the action list will look > >>> like this: > >>> > >>> actions:port1,dec_ttl,port2,port1 > >>> > >>> So with tunnel the second mirror shouldn't have been somehow with the > >>> dec_ttl action but without the tunnel header? > >>> > >>> Should the actions list somehow be like this > >>> > >>> actions:enp8s0f0_1,set(ipv4(ttl=63),enp8s0f0_1,set(tunnel(...),genev_sys_6081 > >> > >> Not sure I follow you, but do you think the dect ttl and set tunnel should > >> have been swapped? I guess this would depend on your OpenFlow rule. Can > >> you show an ofproto trace on your example, which might help clarify OVS’s > >> reasoning? > >> > >> //Eelco > >> > > > > yes. but not just dec_ttl. any header modification beside encap. > > after all original commit explains users could reverse the packet with > > rules so > > there won't be a real packet coming so add mirror after modification. > > but mirror is usually before encap or on recv after decap. > > > > I expected action list to be, maybe: mirrorPort, header mod like replace > > src/dst and ping type, mirrorPort, encap, tunnelPort. > > > > i'll check about the ofproto trace > > > >> > >>> > >>> Am I looking at this wrong? What do you think? > >>> > >>> Thanks, > >>> Roi > >> > > > > > > > # ovs-ofctl dump-flows br-ovs > cookie=0x0, duration=317.989s, table=0, n_packets=8, n_bytes=376, arp > actions=NORMAL > cookie=0x0, duration=317.982s, table=0, n_packets=21, n_bytes=2058, > ip,in_port=geneve1 > actions=set_field:0x1234->tun_metadata0,dec_ttl,output:"enp8s0f0_0" > cookie=0x0, duration=317.975s, table=0, n_packets=21, n_bytes=2058, > ip,in_port="enp8s0f0_0" > actions=set_field:0x1234->tun_metadata0,dec_ttl,output:geneve1 > cookie=0x0, duration=318.117s, table=0, n_packets=11, n_bytes=846, > priority=0 actions=NORMAL > > > > # ovs-appctl ofproto/trace br-ovs > in_port=enp8s0f0_0,tcp,nw_ttl=64,nw_src=1.1.1.7,tcp_dst=22 > Flow: > tcp,in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,nw_src=1.1.1.7,nw_dst=0.0.0.0,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=22,tcp_flags=0 > > bridge("br-ovs") > ---------------- > 0. ip,in_port=1, priority 32768 > set_field:0x1234->tun_metadata0 > dec_ttl > output:3 > -> output to kernel tunnel > > Final flow: > tcp,in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,nw_src=1.1.1.7,nw_dst=0.0.0.0,nw_tos=0,nw_ecn=0,nw_ttl=63,nw_frag=no,tp_src=0,tp_dst=22,tcp_flags=0 > Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_ecn=0,nw_ttl=64,nw_frag=no > Datapath actions: > 3,set(tunnel(tun_id=0x2a,src=7.7.7.7,dst=7.7.7.8,ttl=64,tp_dst=6081,geneve({class=0xffff,type=0x80,len=4,0x1234}),flags(df|key))),set(ipv4(ttl=63)),6,3 > > > so mirror port 3 is mirroring the tx packet and then after tunnel and dec ttl > the final packet > but we get packet with the encap header.
If I follow this correctly, that behaviour is the intended functionality. Each mirror port must receive one unique copy of every packet that ingresses or egresses a selected interface in OVS. I don't believe we want to mirror packets when they are in the middle of being modified but have not egressed yet. > > If we look in the original commit purpose is to have a mirror in case rule > modify the packet and return it back so > i would expect the second mirror to be before adding encap. > So in case of OVN like explained in the original commit > if not tunnel. you can get ping and ping-reply. > with tunnel. you can get ping and ping-reply-with-tunnel-header. > but a real mirror on rx port should have been after decap so without tunnel > header. Is this because part of the packet modification happens outside of OVS? Thanks, M > > also what happens now is that all packets with modify header being mirrored > again anyway? > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev