Hi,

With a very simple notwork (two VMs on different chassis), 1 subnet, single LS and LR/Gateway. The two VMs can ping each other using their Logical IPs. Each has an "External IP", and each can be accessed from an external network on that external IP. BUT they can't ping each other using their external IPs. I would have expected that
either:

a) The packets are sent on the external net then hairpinned back to the OVN
     gateway by the external net router.

b) They are hairpinned by OVN.

It seems that OVN attempts the latter, but does not succeed. The details, NB network,
and pkt trace are as follows:

ovn-nbctl show
switch 2710eebe-f2b3-49e4-bcd6-dcfa48ed6470 (ls1_external)
    port ln-ls1_external
        type: localnet
        addresses: ["unknown"]
    port ls1_external-lr1
        type: router
        router-port: lr1-ls1_external

switch ff909b16-d863-4e3d-a10b-2f0010f17b23 (ls1)
    port 47433b54-ac10-42f1-ae84-cc6fbb580297
        addresses: ["52:54:00:be:06:16 192.16.1.6"]
    port 00bff7c0-2e2d-41ba-9485-3b5fa9801365
        addresses: ["52:54:00:e6:4f:46 192.16.1.5"]
    port ls1-lr1
        type: router
        router-port: lr1-ls1

router 63e1b6a2-327f-4a24-b0c9-3a0e951beb2b (lr1)
    port lr1-ls1_external
        mac: "40:44:00:00:01:a0"
        networks: ["253.255.80.10/16"]
        gateway chassis: [ca-rain06 ca-rain17 ca-rain05]
    port lr1-ls1
        mac: "40:44:00:00:01:30"
        networks: ["192.16.1.1/24"]
    nat f4675661-f4cc-4f7c-b534-ca75e090ed74
        external ip: "10.68.49.184"
        logical ip: "192.16.1.5"
        type: "dnat_and_snat"
    nat f5592262-5fbd-4cef-8773-903875ba34d6
        external ip: "10.68.49.185"
        logical ip: "192.16.1.6"
        type: "dnat_and_snat"

ovn-nbctl lr-route-list lr1
IPv4 Routes
                0.0.0.0/0               253.255.0.1 dst-ip lr1-ls1_external

ovn-trace --detailed ls1 'inport == "47433b54-ac10-42f1-ae84-cc6fbb580297" && eth.dst == 40:44:00:00:01:30 && eth.src == 52:54:00:be:06:16 && ip4.src == 192.16.1.6 && ip4.dst == 10.68.49.184 && ip.ttl == 64 && icmp4.type == 8' # icmp,reg14=0x1,vlan_tci=0x0000,dl_src=52:54:00:be:06:16,dl_dst=40:44:00:00:01:30,nw_src=192.16.1.6,nw_dst=10.68.49.184,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0

ingress(dp="ls1", inport="47433b")
----------------------------------
 0. ls_in_port_sec_l2 (ovn-northd.c:4834): inport == "47433b", priority 50, uuid ae50c799
    next;
22. ls_in_l2_lkup (ovn-northd.c:7587): eth.dst == 40:44:00:00:01:30, priority 50, uuid c29dec2a
    outport = "ls1-lr1";
    output;

egress(dp="ls1", inport="47433b", outport="ls1-lr1")
----------------------------------------------------
 0. ls_out_pre_lb (ovn-northd.c:4980): ip && outport == "ls1-lr1", priority 110, uuid d4d7c7af
    next;
 9. ls_out_port_sec_l2 (ovn-northd.c:4929): outport == "ls1-lr1", priority 50, uuid 36b335f9
    output;
    /* output to "ls1-lr1", type "patch" */

ingress(dp="lr1", inport="lr1-ls1")
-----------------------------------
 0. lr_in_admission (ovn-northd.c:9575): eth.dst == 40:44:00:00:01:30 && inport == "lr1-ls1", priority 50, uuid c67387d7
    xreg0[0..47] = 40:44:00:00:01:30;
    next;
 1. lr_in_lookup_neighbor (ovn-northd.c:9654): 1, priority 0, uuid c050ede1
    reg9[2] = 1;
    next;
 2. lr_in_learn_neighbor (ovn-northd.c:9663): reg9[2] == 1, priority 100, uuid e5780577
    next;
10. lr_in_ip_routing (ovn-northd.c:8622): ip4.dst == 0.0.0.0/0, priority 1, uuid 52d001c6
    ip.ttl--;
    reg8[0..15] = 0;
    reg0 = 253.255.0.1;
    reg1 = 253.255.80.10;
    eth.src = 40:44:00:00:01:a0;
    outport = "lr1-ls1_external";
    flags.loopback = 1;
    next;
11. lr_in_ip_routing_ecmp (ovn-northd.c:9921): reg8[0..15] == 0, priority 150, uuid 920ee40c
    next;
12. lr_in_policy (ovn-northd.c:10046): 1, priority 0, uuid e2014343
    reg8[0..15] = 0;
    next;
13. lr_in_policy_ecmp (ovn-northd.c:10048): reg8[0..15] == 0, priority 150, uuid ed8c4d4d
    next;
14. lr_in_arp_resolve (ovn-northd.c:10082): ip4, priority 0, uuid 2cfde30a
    get_arp(outport, reg0);
    /* MAC binding to 00:00:0c:07:ac:14. */
    next;
17. lr_in_gw_redirect (ovn-northd.c:10598): outport == "lr1-ls1_external", priority 50, uuid 521a9223
    outport = "cr-lr1-ls1_external";
    next;
18. lr_in_arp_request (ovn-northd.c:10671): 1, priority 0, uuid e43fdfbd
    output;
    /* Replacing type "chassisredirect" outport "cr-lr1-ls1_external" with distributed port "lr1-ls1_external". */

egress(dp="lr1", inport="lr1-ls1", outport="lr1-ls1_external")
--------------------------------------------------------------
 0. lr_out_undnat (ovn-northd.c:11459): ip && ip4.src == 192.16.1.6 && outport == "lr1-ls1_external" && is_chassis_resident("cr-lr1-ls1_external"), priority 100, uuid e8b081df
    ct_dnat;

ct_dnat /* assuming no un-dnat entry, so no change */
-----------------------------------------------------
 1. lr_out_snat (ovn-northd.c:11552): ip && ip4.src == 192.16.1.6 && outport == "lr1-ls1_external" && is_chassis_resident("cr-lr1-ls1_external"), priority 161, uuid f50e5215
    ct_snat(10.68.49.185);

ct_snat(ip4.src=10.68.49.185)
-----------------------------
 2. lr_out_egr_loop (ovn-northd.c:11846): ip4.dst == 10.68.49.184 && outport == "lr1-ls1_external" && is_chassis_resident("cr-lr1-ls1_external"), priority 100, uuid a6499050     clone { ct_clear; inport = outport; outport = ""; flags = 0; flags.loopback = 1; reg0 = 0; reg1 = 0; reg2 = 0; reg3 = 0; reg4 = 0; reg5 = 0; reg6 = 0; reg7 = 0; reg8 = 0; reg9 = 0; reg9[0] = 1; next(pipeline=ingress, table=0); };

clone
-----
    ct_clear;
    inport = outport;
    outport = "";
    flags = 0;
    flags.loopback = 1;
    reg0 = 0;
    reg1 = 0;
    reg2 = 0;
    reg3 = 0;
    reg4 = 0;
    reg5 = 0;
    reg6 = 0;
    reg7 = 0;
    reg8 = 0;
    reg9 = 0;
    reg9[0] = 1;
    next(pipeline=ingress, table=0);

ingress(dp="lr1", inport="lr1-ls1_external")
--------------------------------------------
 0. lr_in_admission: no match (implicit drop)

If we look at the section of code pointed to by ovn-northd.c:11846

       /* Egress Loopback table: For NAT on a distributed router.
         * If packets in the egress pipeline on the distributed
         * gateway port have ip.dst matching a NAT external IP, then
         * loop a clone of the packet back to the beginning of the
         * ingress pipeline with inport = outport. */
        if (od->l3dgw_port) {
            /* Distributed router. */
            ds_clear(match);
            ds_put_format(match, "ip%s.dst == %s && outport == %s",
                          is_v6 ? "6" : "4",
                          nat->external_ip,
                          od->l3dgw_port->json_key);
            if (!distributed) {
                ds_put_format(match, " && is_chassis_resident(%s)",
                              od->l3redirect_port->json_key);
            } else {
                ds_put_format(match, " && is_chassis_resident(\"%s\")",
                              nat->logical_port);
            }
           ds_clear(actions);
            ds_put_format(actions,
                          "clone { ct_clear; "
                          "inport = outport; outport = \"\"; "
                          "flags = 0; flags.loopback = 1; ");
            for (int j = 0; j < MFF_N_LOG_REGS; j++) {
                ds_put_format(actions, "reg%d = 0; ", j);
            }
            ds_put_format(actions, REGBIT_EGRESS_LOOPBACK" = 1; "
                          "next(pipeline=ingress, table=%d); };",
ovn_stage_get_table(S_ROUTER_IN_ADMISSION));
            ovn_lflow_add_with_hint(lflows, od, S_ROUTER_OUT_EGR_LOOP, 100,
                                    ds_cstr(match), ds_cstr(actions),
                                    &nat->header_);
        }

It seems clear what the intent is, but the pkt is dropped immediately when returned to the ingress
pipeline. Am I missing some config?


Thanks Brendan


_______________________________________________
discuss mailing list
disc...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss

Reply via email to