Hi, Numan

This is snat rule bug,when a snat rule set,this issue is reproduced
you can find the different between snat rule and dnat_and_snat rule
Logical flow, ovs openflow and ovs datapath flow are all different

network topology and nat rules in last mail is not enough to reproduce this?

The switch and router table in northbound
switch 62b0ba88-554e-46dd-9c45-cff840af9626 
(neutron-27eb266a-de05-4db6-a142-8f8dda7ed0aa) (aka priv-net)
    port 484688a3-79dd-40e7-a075-66441b34e1c7
        type: localport
        addresses: ["fa:16:3e:cd:8d:1b 192.168.200.2"]
    port 478ccbbd-680c-4f70-a87b-178462695926
        type: router
        router-port: lrp-478ccbbd-680c-4f70-a87b-178462695926
    port e1d7711b-1d29-4f53-9527-4740ff8ee653
        type: router
        router-port: lrp-e1d7711b-1d29-4f53-9527-4740ff8ee653
    port babced4e-f5ba-4130-8d12-61f48d58592b (aka port100)
        addresses: ["fa:16:3e:42:31:df 192.168.200.238", "unknown"]
    port 940d7a3d-5262-49fa-b2f0-0055f9f70fd3 (aka port103)
        addresses: ["fa:16:3e:4c:e6:1f 192.168.210.103", "unknown"]
    port 139a94d3-1eac-49e9-b4f3-052d20c4001e (aka port101)
        addresses: ["fa:16:3e:a1:50:79 192.168.200.165", "unknown"]
    port 47ca6c1e-5045-4177-9da3-1535ee9cbed7 (aka port102)
        addresses: ["fa:16:3e:a5:44:f0 192.168.210.102", "unknown"]

router 2a180a00-3ccc-4537-8978-05f4fcf1b0ee 
(neutron-35b1a8c5-82dd-4fc4-83f9-8dfd2e4fb43c) (aka route2)
    port lrp-0e701852-85a0-4c57-8014-77a8607a9406
        mac: "fa:16:3e:ae:b5:e5"
        networks: ["1.1.1.124/24"]
        gateway chassis: [c7bcd287-db8b-4ad8-b38e-bbd69079a2cb]
    port lrp-e1d7711b-1d29-4f53-9527-4740ff8ee653
        mac: "fa:16:3e:39:69:0a"
        networks: ["192.168.200.1/24"]
    port lrp-478ccbbd-680c-4f70-a87b-178462695926
        mac: "fa:16:3e:c9:a7:6b"
        networks: ["192.168.210.1/24"]
    nat 1ba5d885-91ef-4c3b-a40e-ef0633c33b02
        external ip: "1.1.1.45"
        logical ip: "192.168.210.102"
        type: "dnat_and_snat"
    nat 88b9371b-a058-46b5-91f9-6741edf3391a
        external ip: "1.1.1.124"
        logical ip: "192.168.210.0/24"
        type: "snat"
    nat f9843d73-341a-4557-b996-ced76b4fa8e9
        external ip: "1.1.1.124"
        logical ip: "192.168.200.0/24"
        type: "snat"

B R
Wentao Jia

-----Original Message-----
From: Numan Siddique <[email protected]> 
Sent: Thursday, August 18, 2022 9:44 AM
To: Wentao Jia <[email protected]>
Cc: Ales Musil <[email protected]>; [email protected]
Subject: Re: [ovs-dev] [OVN PATCH] northd: add unsnat/undnat lflow for 
established connections

On Thu, Aug 11, 2022 at 4:57 PM Wentao Jia <[email protected]> wrote:
>
> Hi, Numan
>
> Thanks for you reply.
>
> The network topology as follows:
>
>      vm1 -----> logical switch 1
> (192.168.200.165)           \
>                            -----------> router ---------> extenel-net
>                           /
>      vm2 -----> logical switch 2
> (192.168.210.102)
>
> Nat rules of the rotuer:
> TYPE                EXTERNAL_IP            LOGICAL_IP
> dnat_and_snat         1.1.1.166             192.168.210.102
> snat                  1.1.1.124             192.168.200.0/24
> snat                  1.1.1.124             192.168.210.0/24
>
> there is only lr_out_snat logical flows for snat rules, no lr_out_undnat 
> logical flow.
>   table=3 (lr_out_snat        ), priority=153  , match=(ip && ip4.src == 
> 192.168.200.0/24 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_snat_in_czone(1.1.1.124);)
>   table=3 (lr_out_snat        ), priority=153  , match=(ip && ip4.src == 
> 192.168.210.0/24 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_snat_in_czone(1.1.1.124);)
>
> but there are lr_out_snat and lr_out_undnat logical flows for dnat_and_snat 
> rule
>   table=1 (lr_out_undnat      ), priority=100  , match=(ip && ip4.src == 
> 192.168.210.102 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_dnat_in_czone;)
>   table=3 (lr_out_snat        ), priority=161  , match=(ip && ip4.src == 
> 192.168.210.102 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_snat_in_czone(1.1.1.166);)
>
> and there are lr_in_dnat and lr_in_unsnat logical flows for dnat_and_snat 
> rule too
>   table=4 (lr_in_unsnat       ), priority=100  , match=(ip && ip4.dst == 
> 1.1.1.166 && inport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> flags.loopback == 0 && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_snat_in_czone;)
>   table=4 (lr_in_unsnat       ), priority=100  , match=(ip && ip4.dst == 
> 1.1.1.166 && inport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> flags.loopback == 1 && flags.use_snat_zone == 1 && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_snat;)
>   table=6 (lr_in_dnat         ), priority=100  , match=(ip && ip4.dst == 
> 1.1.1.166 && inport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_dnat_in_czone(192.168.210.102);)
>
> after patched, another lr_out_undnat logical flow for snat rule and another 
> lr_in_unsnat logical flow for dnat rule, lr_out_undnat logical flows as 
> follows:
>   table=1 (lr_out_undnat      ), priority=100  , match=(ip && ip4.src == 
> 192.168.200.0/24 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_dnat_in_czone;)
>   table=1 (lr_out_undnat      ), priority=100  , match=(ip && ip4.src == 
> 192.168.210.0/24 && outport == "lrp-0e701852-85a0-4c57-8014-77a8607a9406" && 
> is_chassis_resident("cr-lrp-0e701852-85a0-4c57-8014-77a8607a9406")), 
> action=(ct_dnat_in_czone;)


Can you share the ovn-nbctl commands to reproduce this ?  or even better if you 
can share your OVN Northbound database so that I can locally try ?

Thanks
Numan

>
> B R
> Wentao Jia
>
> -----Original Message-----
> From: Numan Siddique <[email protected]>
> Sent: Thursday, August 11, 2022 12:11 PM
> To: Ales Musil <[email protected]>
> Cc: Wentao Jia <[email protected]>; [email protected]
> Subject: Re: [ovs-dev] [OVN PATCH] northd: add unsnat/undnat lflow for 
> established connections
>
> On Tue, Aug 9, 2022 at 9:46 PM Ales Musil <[email protected]> wrote:
> >
> > On Tue, Aug 2, 2022 at 9:05 PM Wentao Jia <[email protected]> wrote:
> >
> > > snat/dnat rules of logical router, no logical flows for 
> > > established connection, all natted packets deliver to kernel 
> > > conntrack module by ct commit, this is low performance and difficult to 
> > > offload.
> > > add another logical flows without ct commit forestablished on 
> > > pipeline stage of unsnat/undnat for logical router
> > >
> > > before patched, datapath flows for nat with ct commit 
> > > ufid:db1fbd1b-8f16-4681-81b0-3796d60332a8,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0),dp_hash(0/0),in_port(rep0_0),packet
> > > _t 
> > > ype(ns=0/0,id=0/0),eth(src=fa:16:3e:a1:50:79,dst=fa:16:3e:39:69:0a
> > > ),
> > > eth_type(0x0800),ipv4(src=
> > > 192.168.200.128/255.255.255.192,dst=1.1.1.254,proto=6,tos=0/0,ttl=
> > > 64 ,frag=no),tcp(src=0/0,dst=0/0), packets:2969075, 
> > > bytes:4071176800, used:0.000s, dp:tc, 
> > > actions:set(eth(src=fa:16:3e:ae:b5:e5,dst=8c:1f:64:30:61:43)),set(
> > > ip
> > > v4(ttl=63)),ct(commit,zone=22,nat(src=1.1.1.124)),recirc(0x14b)
> > > ufid:e9c5df95-02df-4629-b399-ddeb5581e997,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0x14b),dp_hash(0/0),in_port(rep0_0),pa
> > > ck
> > > et_type(ns=0/0,id=0/0),eth(src=fa:16:3e:ae:b5:e5,dst=8c:1f:64:30:61:
> > > 43),eth_type(0x0800),ipv4(src=
> > > 0.0.0.0/0.0.0.0,dst=1.1.1.240/255.255.255.240,proto=0/0,tos=0/0,tt
> > > l= 0/0,frag=no), packets:2969075, bytes:4071176800, used:0.001s, 
> > > offloaded:yes, dp:tc,
> > > actions:ct_clear,enp1s0np1
> > >
> > > after patched, there is two flows for nat, the flow with ct commit 
> > > will be timeout and deleted after connection established. another 
> > > flow without ct commit for established connection 
> > > ufid:f6a591d6-de32-49cc-bf03-7a00a7601ad0,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0),dp_hash(0/0),in_port(rep0_0),packet
> > > _t 
> > > ype(ns=0/0,id=0/0),eth(src=fa:16:3e:a1:50:79,dst=fa:16:3e:39:69:0a
> > > ), 
> > > eth_type(0x0800),ipv4(src=192.168.200.165,dst=1.1.1.254,proto=6,to
> > > s= 0/0,ttl=64,frag=no),tcp(src=0/0,dst=0/0),
> > > packets:5518542, bytes:7924612730, used:0.040s, offloaded:yes, 
> > > dp:tc, 
> > > actions:set(eth(src=fa:16:3e:ae:b5:e5,dst=8c:1f:64:30:61:43)),set(
> > > ip
> > > v4(ttl=63)),ct(zone=22,nat),recirc(0x14d)
> > > ufid:6af5a3ed-5920-4f5b-923e-7e2cb5fc3d6c,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0x14d),dp_hash(0/0),in_port(rep0_0),pa
> > > ck 
> > > et_type(ns=0/0,id=0/0),eth(src=00:00:00:00:00:00/00:00:00:00:00:00
> > > ,d
> > > st=00:00:00:00:00:00/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=
> > > 19
> > > 2.168.200.165,dst=
> > > 0.0.0.0/0.0.0.0,proto=0/0,tos=0/0,ttl=0/0,frag=no), packets:1, 
> > > bytes:60, used:6.530s, dp:tc,
> > > actions:ct(commit,zone=22,nat(src=1.1.1.166)),recirc(0x14e)
> > > ufid:b3505ba7-9367-4533-a5df-f1f897376c54,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0x14d),dp_hash(0/0),in_port(rep0_0),pa
> > > ck
> > > et_type(ns=0/0,id=0/0),eth(src=fa:16:3e:ae:b5:e5,dst=8c:1f:64:30:61:
> > > 43),eth_type(0x0800),ipv4(src=
> > > 0.0.0.0/128.0.0.0,dst=1.1.1.240/255.255.255.240,proto=0/0,tos=0/0,
> > > tt l=0/0,frag=no), packets:5518539, bytes:7924612529, used:0.040s, 
> > > offloaded:yes, dp:tc,
> > > actions:ct_clear,enp1s0np1
> > > ufid:ac4c188c-5320-4376-a53e-b1561e5ca209,
> > > skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark
> > > (0 
> > > /0),ct_label(0/0),recirc_id(0x14e),dp_hash(0/0),in_port(rep0_0),pa
> > > ck
> > > et_type(ns=0/0,id=0/0),eth(src=fa:16:3e:ae:b5:e5,dst=8c:1f:64:30:61:
> > > 43),eth_type(0x0800),ipv4(src=
> > > 0.0.0.0/0.0.0.0,dst=1.1.1.240/255.255.255.240,proto=0/0,tos=0/0,tt
> > > l= 0/0,frag=no), packets:1, bytes:60, used:6.531s, offloaded:yes, 
> > > dp:tc,
> > > actions:ct_clear,enp1s0np1
> > >
> > > Signed-off-by: Wentao Jia <[email protected]>
> > > ---
> > > northd/northd.c | 10 +++-------
> > > 1 file changed, 3 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/northd/northd.c b/northd/northd.c index
> > > d31cb1688..1e7406a72 100644
> > > --- a/northd/northd.c
> > > +++ b/northd/northd.c
> > > @@ -12867,11 +12867,8 @@ build_lrouter_in_unsnat_flow(struct hmap 
> > > *lflows, struct ovn_datapath *od,
> > >      * Undoing SNAT has to happen before DNAT processing.  This is
> > >      * because when the packet was DNATed in ingress pipeline, it did
> > >      * not know about the possibility of eventual additional SNAT in
> > > -    * egress pipeline. */
> > > -    if (strcmp(nat->type, "snat") && strcmp(nat->type, "dnat_and_snat")) 
> > > {
> > > -        return;
> > > -    }
> > > -
> > > +    * egress pipeline.
> > > +    */
> > >      bool stateless = lrouter_nat_is_stateless(nat);
> > >      if (od->is_gw_router) {
> > >          ds_clear(match);
> > > @@ -13036,8 +13033,7 @@ build_lrouter_out_undnat_flow(struct hmap 
> > > *lflows, struct ovn_datapath *od,
> > >      *
> > >      * Note that this only applies for NAT on a distributed router.
> > >      */
> > > -    if (!od->n_l3dgw_ports ||
> > > -        (strcmp(nat->type, "dnat") && strcmp(nat->type,
> > > "dnat_and_snat"))) {
> > > +    if (!od->n_l3dgw_ports) {
> > >          return;
> > >      }
> > >
> > > --
> > > 2.31.1
> > >
> > > _______________________________________________
> > > dev mailing list
> > > [email protected]
> > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> > >
> > >
> > Hi,
> >
> > thank you for the patch. I am afraid that in current form the patch 
> > is not right. The changes presented here are adding additional 
> > undnat for snat and vice versa. I am not entirely sure how this 
> > helps with established connections. Could you please elaborate more 
> > on what are you trying to achieve?
>
>
> Hi Wentao Jia,
>
> I see your reply to Ales in the patchworks here - 
> https://patchwork.ozlabs.org/project/ovn/patch/BN6PR13MB1202629B22D067
> [email protected]/
>
> But it's weird that I don't see it in my mail.
>
> I am really confused with this patch.
>
> Can you please add a test case for this ? And also share the scenario with 
> ovn-nbctl commands so that we can test it out locally ?
>
> Thanks
> Numan
>
> >
> > Thanks,
> > Ales
> >
> > --
> >
> > Ales Musil
> >
> > Senior Software Engineer - OVN Core
> >
> > Red Hat EMEA <https://www.redhat.com>
> >
> > [email protected]    IM: amusil
> > <https://red.ht/sig>
> > _______________________________________________
> > 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
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to