diff mbox series

[ovs-dev] northd: Consolidate register usage in logical flows.

Message ID 20250122170819.2050308-1-amusil@redhat.com
State Accepted
Headers show
Series [ovs-dev] northd: Consolidate register usage in logical flows. | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes success github build: passed

Commit Message

Ales Musil Jan. 22, 2025, 5:08 p.m. UTC
We were running out of space in registers. After the consolidation
there are several registers are free to use once again.
The consolidation is mainly done by reusing single register for LB
affinity flows.

Signed-off-by: Ales Musil <amusil@redhat.com>
---
 include/ovn/logical-fields.h |   7 +-
 lib/actions.c                |   6 +-
 northd/northd.c              | 254 +++++++++++++---------------------
 tests/ovn-northd.at          | 126 ++++++++---------
 tests/ovn.at                 | 258 +++++++++++++++++------------------
 tests/system-ovn-kmod.at     |  12 +-
 6 files changed, 297 insertions(+), 366 deletions(-)

Comments

Mark Michelson Jan. 22, 2025, 9:59 p.m. UTC | #1
Hi Ales,

Acked-by: Mark Michelson <mmichels@redhat.com>

My only suggestion would be to add a comment in northd.c above the 
definitions for REG_LB_IPV4, REG_LB_IPV6, and REG_LB_PORT that explains 
that on new connections, these contain the VIP[:port], and on 
established connections, these contain the backend[:port]. Otherwise, 
the register names are ambiguous, and the fact they are used for two 
purposes is not clear.

On 1/22/25 12:08, Ales Musil wrote:
> We were running out of space in registers. After the consolidation
> there are several registers are free to use once again.
> The consolidation is mainly done by reusing single register for LB
> affinity flows.
> 
> Signed-off-by: Ales Musil <amusil@redhat.com>
> ---
>   include/ovn/logical-fields.h |   7 +-
>   lib/actions.c                |   6 +-
>   northd/northd.c              | 254 +++++++++++++---------------------
>   tests/ovn-northd.at          | 126 ++++++++---------
>   tests/ovn.at                 | 258 +++++++++++++++++------------------
>   tests/system-ovn-kmod.at     |  12 +-
>   6 files changed, 297 insertions(+), 366 deletions(-)
> 
> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
> index 59e4ac3da..6a87fc386 100644
> --- a/include/ovn/logical-fields.h
> +++ b/include/ovn/logical-fields.h
> @@ -47,7 +47,7 @@ enum ovn_controller_event {
>    *
>    * Make sure these don't overlap with the logical fields! */
>   #define MFF_LOG_REG0             MFF_REG0
> -#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG1
> +#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG4
>   #define MFF_LOG_LB_ORIG_TP_DPORT MFF_REG2
>   
>   #define MFF_LOG_XXREG0           MFF_XXREG0
> @@ -56,9 +56,8 @@ enum ovn_controller_event {
>   #define MFF_N_LOG_REGS 10
>   
>   #define MFF_LOG_LB_AFF_MATCH_IP4_ADDR       MFF_REG4
> -#define MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR    MFF_XXREG0
> -#define MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR    MFF_XXREG1
> -#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG8
> +#define MFF_LOG_LB_AFF_MATCH_IP6_ADDR       MFF_XXREG1
> +#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG2
>   
>   #define MFF_LOG_CT_ORIG_NW_DST_ADDR         MFF_REG1   /* REG_ORIG_DIP_IPV4 */
>   #define MFF_LOG_CT_ORIG_IP6_DST_ADDR        MFF_XXREG1 /* REG_ORIG_DIP_IPV6 */
> diff --git a/lib/actions.c b/lib/actions.c
> index ea30be767..62e73b2c5 100644
> --- a/lib/actions.c
> +++ b/lib/actions.c
> @@ -5371,11 +5371,7 @@ encode_COMMIT_LB_AFF(const struct ovnact_commit_lb_aff *lb_aff,
>           imm_backend_ip = (union mf_value) {
>               .ipv6 =  lb_aff->backend,
>           };
> -        if (ep->is_switch) {
> -            ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR);
> -        } else {
> -            ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR);
> -        }
> +        ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_IP6_ADDR);
>       } else {
>           ovs_be32 ip4 = in6_addr_get_mapped_ipv4(&lb_aff->backend);
>           imm_backend_ip = (union mf_value) {
> diff --git a/northd/northd.c b/northd/northd.c
> index c41a7591b..2385c3b5e 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -125,20 +125,12 @@ static bool vxlan_mode;
>   #define REGBIT_FROM_ROUTER_PORT   "reg0[18]"
>   #define REGBIT_IP_FRAG            "reg0[19]"
>   
> -#define REG_ORIG_DIP_IPV4         "reg1"
> -#define REG_ORIG_DIP_IPV6         "xxreg1"
> -#define REG_ORIG_TP_DPORT         "reg2[0..15]"
> -
> -/* Register used to store backend ipv6 address
> - * for load balancer affinity. */
> -#define REG_LB_L2_AFF_BACKEND_IP6 "xxreg0"
> -
>   /* Register definitions for switches and routers. */
>   
> -/* Register used to store backend ipv4 address
> - * for load balancer affinity. */
> -#define REG_LB_AFF_BACKEND_IP4  "reg4"
> -#define REG_LB_AFF_MATCH_PORT   "reg8[0..15]"
> +/* Register used for LB. */
> +#define REG_LB_IPV4 "reg4"
> +#define REG_LB_IPV6 "xxreg1"
> +#define REG_LB_PORT "reg2[0..15]"
>   
>   /* Registers for ACL evaluation */
>   #define REGBIT_ACL_VERDICT_ALLOW "reg8[16]"
> @@ -192,12 +184,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>   #define REG_DHCP_RELAY_DIP_IPV4 "reg2"
>   #define REG_ROUTE_TABLE_ID "reg7"
>   
> -/* Register used to store backend ipv6 address
> - * for load balancer affinity. */
> -#define REG_LB_L3_AFF_BACKEND_IP6  "xxreg1"
> -
> -#define REG_ORIG_TP_DPORT_ROUTER   "reg9[16..31]"
> -
>   /* Registers used for pasing observability information for switches:
>    * domain and point ID. */
>   #define REG_OBS_POINT_ID_NEW "reg3"
> @@ -227,25 +213,27 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>    * |    |     REGBIT_{HAIRPIN/HAIRPIN_REPLY}           |   |                                   |
>    * |    | REGBIT_ACL_HINT_{ALLOW_NEW/ALLOW/DROP/BLOCK} |   |                                   |
>    * |    |     REGBIT_ACL_{LABEL/STATELESS}             | X |                                   |
> - * +----+----------------------------------------------+ X |       LB_L2_AFF_BACKEND_IP6       |
> - * | R1 |         ORIG_DIP_IPV4 (>= IN_PRE_STATEFUL)   | R |        (>= IN_LB_AFF_CHECK &&     |
> - * +----+----------------------------------------------+ E |         <= IN_LB_AFF_LEARN)       |
> - * | R2 |         ORIG_TP_DPORT (>= IN_PRE_STATEFUL)   | G |                                   |
> - * +----+----------------------------------------------+ 0 |                                   |
> + * +----+----------------------------------------------+ X |                                   |
> + * | R1 |                   UNUSED                     | R |                                   |
> + * +----+----------------------------------------------+ E |                                   |
> + * | R2 |                 REG_LB_PORT                  | G |                                   |
> + * |    |  (>= IN_PRE_STATEFUL && <= IN_LB_AFF_LEARN)  | 0 |                                   |
> + * +----+----------------------------------------------+   |                                   |
>    * | R3 |             OBS_POINT_ID_NEW                 |   |                                   |
>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   |                                   |
>    * +----+----------------------------------------------+---+-----------------------------------+
> - * | R4 |            REG_LB_AFF_BACKEND_IP4            |   |                                   |
> - * +----+----------------------------------------------+ X |                                   |
> - * | R5 |                   UNUSED                     | X | ORIG_DIP_IPV6(>= IN_PRE_STATEFUL) |
> - * +----+----------------------------------------------+ R |                                   |
> - * | R6 |                   UNUSED                     | E |                                   |
> - * +----+----------------------------------------------+ G |                                   |
> - * | R7 |                   UNUSED                     | 1 |                                   |
> + * | R4 |                 REG_LB_IPV4                  |   |                                   |
> + * | R4 |    (>= IN_PRE_STATEFUL && <= IN_HAIRPIN)     | X |                                   |
> + * +----+----------------------------------------------+ X |           REG_LB_IPV6             |
> + * | R5 |                   UNUSED                     | R |      (>= IN_PRE_STATEFUL &&       |
> + * +----+----------------------------------------------+ E |       <= IN_HAIRPIN)              |
> + * | R6 |                   UNUSED                     | G |                                   |
> + * +----+----------------------------------------------+ 1 |                                   |
> + * | R7 |                   UNUSED                     |   |                                   |
>    * +----+----------------------------------------------+---+-----------------------------------+
> - * | R8 |              LB_AFF_MATCH_PORT               | X |      REG_OBS_COLLECTOR_ID_NEW     |
> - * |    |  (>= IN_LB_AFF_CHECK && <= IN_LB_AFF_LEARN)  | R |      REG_OBS_COLLECTOR_ID_EST     |
> - * |    |                                              | E |  (>= ACL_EVAL* && <= ACL_ACTION*) |
> + * | R8 |           REG_OBS_COLLECTOR_ID_NEW           | X |                                   |
> + * |    |           REG_OBS_COLLECTOR_ID_EST           | R |                                   |
> + * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       | E |                                   |
>    * +----+----------------------------------------------+ G +-----------------------------------+
>    * | R9 |              OBS_POINT_ID_EST                | 4 |                                   |
>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   |                                   |
> @@ -256,23 +244,26 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>    * | R0  | REGBIT_ND_RA_OPTS_RESULT  |   |                 |   |                                    |
>    * |     |   (= IN_ND_RA_OPTIONS)    | X |                 |   |                                    |
>    * |     |      NEXT_HOP_IPV4        | R |                 |   |                                    |
> - * |     |      (>= IP_INPUT)        | E | INPORT_ETH_ADDR | X |                                    |
> + * |     |   (>= IN_IP_ROUTING)      | E | INPORT_ETH_ADDR | X |                                    |
>    * +-----+---------------------------+ G |   (< IP_INPUT)  | X |                                    |
>    * | R1  |        UNUSED             | 0 |                 | R |                                    |
> - * |     |                           |   |                 | E |     NEXT_HOP_IPV6 (>= DEFRAG )     |
> + * |     |                           |   |                 | E |  NEXT_HOP_IPV6 (>= IN_IP_ROUTING)  |
>    * +-----+---------------------------+---+-----------------+ G |                                    |
> - * | R2     REG_DHCP_RELAY_DIP_IPV4  | X |                 | 0 |                                    |
> - * |     |                           | R |                 |   |                                    |
> - * +-----+---------------------------+ E |     UNUSED      |   |                                    |
> - * | R3  |        UNUSED             | G |                 |   |                                    |
> - * |     |                           | 1 |                 |   |                                    |
> + * | R2  |  REG_DHCP_RELAY_DIP_IPV4  |   |                 | 0 |                                    |
> + * |     |       REG_LB_PORT         | X |                 | 0 |                                    |
> + * |     | (>= IN_LB_AFF_CHECK       | R |                 |   |                                    |
> + * |     |  <= IN_LB_AFF_LEARN)      | E |                 |   |                                    |
> + * +-----+---------------------------+ G |     UNUSED      |   |                                    |
> + * | R3  |        UNUSED             | 1 |                 |   |                                    |
> + * |     |                           |   |                 |   |                                    |
>    * +-----+---------------------------+---+-----------------+---+------------------------------------+
> - * | R4  |  REG_LB_AFF_BACKEND_IP4   | X |                 |   |                                    |
> - * |     |                           | R |                 |   |                                    |
> + * | R4  |        REG_LB_IPV4        | X |                 |   |                                    |
> + * |     |  (>= IN_LB_AFF_CHECK &&   | R |                 |   |                                    |
> + * |     |   <= IN_LB_AFF_LEARN)     | R |                 |   |                                    |
>    * +-----+---------------------------+ E |     UNUSED      | X |                                    |
> - * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X |                                    |
> - * |     |      (>= IP_INPUT)        | 2 |                 | R |        LB_L3_AFF_BACKEND_IP6       |
> - * +-----+---------------------------+---+-----------------+ E |           (<= IN_DNAT)             |
> + * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X |            REG_LB_IPV6             |
> + * |     |      (>= IP_INPUT)        | 2 |                 | R |        (>= IN_LB_AFF_CHECK &&      |
> + * +-----+---------------------------+---+-----------------+ E |         <= IN_LB_AFF_LEARN)        |
>    * | R6  |        UNUSED             | X |                 | G |                                    |
>    * |     |                           | R |                 | 1 |                                    |
>    * +-----+---------------------------+ E |     UNUSED      |   |                                    |
> @@ -282,7 +273,7 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>    * +-----+---------------------------+---+-----------------+---+------------------------------------+
>    * | R8  |     ECMP_GROUP_ID         |   |                 |
>    * |     |     ECMP_MEMBER_ID        |   |                 |
> - * |     |    LB_AFF_MATCH_PORT      | X |                 |
> + * |     |                           | X |                 |
>    * +-----+---------------------------+ R |                 |
>    * |     | REGBIT_{                  | E |                 |
>    * |     |   EGRESS_LOOPBACK/        | G |     UNUSED      |
> @@ -292,9 +283,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>    * |     |REGBIT_DHCP_RELAY_REQ_CHK/ |   |                 |
>    * |     |REGBIT_DHCP_RELAY_RESP_CHK |   |                 |
>    * |     |REGBIT_NEXTHOP_IS_IPV4}    |   |                 |
> - * |     |                           |   |                 |
> - * |     | REG_ORIG_TP_DPORT_ROUTER  |   |                 |
> - * |     |                           |   |                 |
>    * +-----+---------------------------+---+-----------------+
>    *
>    */
> @@ -3621,6 +3609,16 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
>       bool reject = !lb_vip->n_backends && lb_vip->empty_backend_rej;
>       bool drop = !lb_vip->n_backends && !lb_vip->empty_backend_rej;
>   
> +    if (ls_dp || lb->affinity_timeout) {
> +        const char *ip_reg =
> +            lb_vip->address_family == AF_INET ? REG_LB_IPV4 : REG_LB_IPV6;
> +        ds_put_format(action, "%s = %s; ", ip_reg, lb_vip->vip_str);
> +
> +        if (lb_vip->port_str) {
> +            ds_put_format(action, REG_LB_PORT" = %s; ", lb_vip->port_str);
> +        }
> +    }
> +
>       if (lb_vip_nb->lb_health_check) {
>           ds_put_cstr(action, "ct_lb_mark(backends=");
>   
> @@ -7867,29 +7865,19 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows,
>            */
>           if (lb->vips[i].address_family == AF_INET) {
>               ip_match = "ip4";
> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
> +            ds_put_format(action, REG_LB_IPV4 " = %s; ",
>                             lb_vip->vip_str);
>           } else {
>               ip_match = "ip6";
> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
> +            ds_put_format(action, REG_LB_IPV6 " = %s; ",
>                             lb_vip->vip_str);
>           }
>   
> -        const char *proto = NULL;
>           if (lb_vip->port_str) {
> -            proto = "tcp";
> -            if (lb->nlb->protocol) {
> -                if (!strcmp(lb->nlb->protocol, "udp")) {
> -                    proto = "udp";
> -                } else if (!strcmp(lb->nlb->protocol, "sctp")) {
> -                    proto = "sctp";
> -                }
> -            }
> -
>               /* Store the original destination port to be used when generating
>                * hairpin flows.
>                */
> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
> +            ds_put_format(action, REG_LB_PORT " = %s; ",
>                             lb_vip->port_str);
>           }
>           ds_put_cstr(action, "ct_lb_mark;");
> @@ -7897,7 +7885,8 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows,
>           ds_put_format(match, REGBIT_CONNTRACK_NAT" == 1 && %s.dst == %s",
>                         ip_match, lb_vip->vip_str);
>           if (lb_vip->port_str) {
> -            ds_put_format(match, " && %s.dst == %s", proto, lb_vip->port_str);
> +            ds_put_format(match, " && %s.dst == %s", lb->proto,
> +                          lb_vip->port_str);
>           }
>   
>           ovn_lflow_add_with_dp_group(
> @@ -7913,34 +7902,30 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows,
>    * - load balancing affinity check:
>    *   table=lr_in_lb_aff_check, priority=100
>    *      match=(new_lb_match)
> - *      action=(REG_NEXT_HOP_IPV4 = ip4.dst;
> - *              REG_ORIG_TP_DPORT_ROUTER = tcp.dst;
> - *              REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
> + *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
>    *
>    * - load balancing:
>    *   table=lr_in_dnat, priority=150
>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> - *             && REG_LB_AFF_BACKEND_IP4 == B1 && REG_LB_AFF_MATCH_PORT == BP1)
> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
> - *              ct_lb_mark(backends=B1:BP1; ct_flag);)
> + *             && REG_LB_IPV4 == B1 && REG_LB_PORT == BP1)
> + *      action=(lb_action; ct_lb_mark(backends=B1:BP1; ct_flag);)
>    *   table=lr_in_dnat, priority=150
>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> - *             && REG_LB_AFF_BACKEND_IP4 == B2 && REG_LB_AFF_MATCH_PORT == BP2)
> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
> - *              ct_lb_mark(backends=B2:BP2; ct_flag);)
> + *             && REG_LB_IPV4 == B2 && REG_LB_PORT == BP2)
> + *      action=(lb_action; ct_lb_mark(backends=B2:BP2; ct_flag);)
>    *
>    * - load balancing affinity learn:
>    *   table=lr_in_lb_aff_learn, priority=100
>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>    *             && ct.new && ip4
> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER = VP
> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
>    *             && ip4.dst == B1 && tcp.dst == BP1)
>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
>    *                            proto = tcp, timeout = T));
>    *   table=lr_in_lb_aff_learn, priority=100
>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>    *             && ct.new && ip4
> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER = VP
> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
>    *             && ip4.dst == B2 && tcp.dst == BP2)
>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
>    *                            proto = tcp, timeout = T));
> @@ -7963,14 +7948,11 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>       struct ds aff_action_learn = DS_EMPTY_INITIALIZER;
>       struct ds aff_match = DS_EMPTY_INITIALIZER;
>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
> -    struct ds aff_check_action = DS_EMPTY_INITIALIZER;
>   
>       bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
>       const char *ip_match = ipv6 ? "ip6" : "ip4";
>   
> -    const char *reg_vip = ipv6 ? REG_NEXT_HOP_IPV6 : REG_NEXT_HOP_IPV4;
> -    const char *reg_backend =
> -        ipv6 ? REG_LB_L3_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
>       const char *ct_flag = NULL;
>       if (lb_action && !strcmp(lb_action, "flags.skip_snat_for_lb = 1; ")) {
>           ct_flag = "; skip_snat";
> @@ -7980,22 +7962,12 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>       }
>   
>       /* Create affinity check flow. */
> -    ds_put_format(&aff_check_action, "%s = %s.dst; ", reg_vip, ip_match);
> -
> -    if (lb_vip->port_str) {
> -        ds_put_format(&aff_check_action, REG_ORIG_TP_DPORT_ROUTER" = %s.dst; ",
> -                      lb->proto);
> -    }
> -    ds_put_cstr(&aff_check_action, REGBIT_KNOWN_LB_SESSION
> -                " = chk_lb_aff(); next;");
> -
>       ovn_lflow_add_with_dp_group(
>           lflows, dp_bitmap, ods_size(lr_datapaths), S_ROUTER_IN_LB_AFF_CHECK,
> -        100, new_lb_match, ds_cstr(&aff_check_action), &lb->nlb->header_,
> -        lflow_ref);
> +        100, new_lb_match, REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;",
> +        &lb->nlb->header_, lflow_ref);
>   
>       /* Prepare common part of affinity LB and affinity learn action. */
> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
>   
>       if (lb_vip->port_str) {
> @@ -8015,19 +7987,19 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>       if (lb_vip->port_str) {
>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
>                         "ct.new && %s && %s == %s && "
> -                      REG_ORIG_TP_DPORT_ROUTER" == %s && "
> -                      "%s.dst == ", ip_match, reg_vip, lb_vip->vip_str,
> +                      REG_LB_PORT " == %s && "
> +                      "%s.dst == ", ip_match, reg_ip, lb_vip->vip_str,
>                         lb_vip->port_str, ip_match);
>       } else {
>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
>                         "ct.new && %s && %s == %s && %s.dst == ", ip_match,
> -                      reg_vip, lb_vip->vip_str, ip_match);
> +                      reg_ip, lb_vip->vip_str, ip_match);
>       }
>   
>       /* Prepare common part of affinity match. */
>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
>                     "ct.new && %s.dst == %s && %s == ", ip_match,
> -                  lb_vip->vip_str, reg_backend);
> +                  lb_vip->vip_str, reg_ip);
>   
>       /* Store the common part length. */
>       size_t aff_action_len = aff_action.length;
> @@ -8050,7 +8022,7 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>   
>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
>                             lb->proto, backend->port);
> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == %d",
> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
>                             backend->port);
>           } else {
>               ds_put_cstr(&aff_action, backend->ip_str);
> @@ -8094,7 +8066,6 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>       ds_destroy(&aff_action_learn);
>       ds_destroy(&aff_match);
>       ds_destroy(&aff_match_learn);
> -    ds_destroy(&aff_check_action);
>   }
>   
>   /* Builds the logical switch flows related to load balancer affinity.
> @@ -8102,35 +8073,33 @@ build_lb_affinity_lr_flows(struct lflow_table *lflows,
>    * affinity timeout set to T, it generates the following logical flows:
>    * - load balancing affinity check:
>    *   table=ls_in_lb_aff_check, priority=100
> - *      match=(ct.new && ip4
> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP)
> + *      match=(ct.new && ip4 && ip4.dst == V && PROTO && PROTO.dst == VP)
>    *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
>    *
>    * - load balancing:
>    *   table=ls_in_lb, priority=150
>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> - *             && REG_LB_AFF_BACKEND_IP4 == B1 && REG_LB_AFF_MATCH_PORT == BP1)
> - *      action=(REG_ORIG_DIP_IPV4 = V; REG_ORIG_TP_DPORT = VP;
> + *             && PROTO && PROTO.dst == VP)
> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
>    *              ct_lb_mark(backends=B1:BP1);)
>    *   table=ls_in_lb, priority=150
>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> - *             && REG_LB_AFF_BACKEND_IP4 == B2 && REG_LB_AFF_MATCH_PORT == BP2)
> - *      action=(REG_ORIG_DIP_IPV4 = V;
> - *              REG_ORIG_TP_DPORT = VP;
> + *             && PROTO && PROTO.dst == VP)
> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
>    *              ct_lb_mark(backends=B1:BP2);)
>    *
>    * - load balancing affinity learn:
>    *   table=ls_in_lb_aff_learn, priority=100
>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>    *             && ct.new && ip4
> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
>    *             && ip4.dst == B1 && tcp.dst == BP1)
>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
>    *                            proto = tcp, timeout = T));
>    *   table=ls_in_lb_aff_learn, priority=100
>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>    *             && ct.new && ip4
> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
>    *             && ip4.dst == B2 && tcp.dst == BP2)
>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
>    *                            proto = tcp, timeout = T));
> @@ -8149,19 +8118,16 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
>   
>       const struct ovn_northd_lb *lb = lb_dps->lb;
>       struct ds new_lb_match = DS_EMPTY_INITIALIZER;
> -    if (IN6_IS_ADDR_V4MAPPED(&lb_vip->vip)) {
> -        ds_put_format(&new_lb_match,
> -                      "ct.new && ip4 && "REG_ORIG_DIP_IPV4 " == %s",
> -                      lb_vip->vip_str);
> -    } else {
> -        ds_put_format(&new_lb_match,
> -                      "ct.new && ip6 && "REG_ORIG_DIP_IPV6 " == %s",
> -                      lb_vip->vip_str);
> -    }
> +    bool ipv6 = lb_vip->address_family == AF_INET6;
> +    const char *ip_match = ipv6 ? "ip6" : "ip4";
> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
> +
> +    ds_put_format(&new_lb_match, "ct.new && %s && %s.dst == %s",
> +                  ip_match, ip_match, lb_vip->vip_str);
>   
>       if (lb_vip->port_str) {
> -        ds_put_format(&new_lb_match, " && "REG_ORIG_TP_DPORT " == %s",
> -                      lb_vip->port_str);
> +        ds_put_format(&new_lb_match, " && %s && %s.dst == %s",
> +                      lb->proto, lb->proto, lb_vip->port_str);
>       }
>   
>       static char *aff_check = REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;";
> @@ -8177,19 +8143,12 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
>       struct ds aff_match = DS_EMPTY_INITIALIZER;
>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
>   
> -    bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
> -    const char *ip_match = ipv6 ? "ip6" : "ip4";
> -
> -    const char *reg_vip = ipv6 ? REG_ORIG_DIP_IPV6 : REG_ORIG_DIP_IPV4;
> -    const char *reg_backend =
> -        ipv6 ? REG_LB_L2_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
> -
>       /* Prepare common part of affinity LB and affinity learn action. */
> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
> +    ds_put_format(&aff_action, "%s = %s; ", reg_ip, lb_vip->vip_str);
>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
>   
>       if (lb_vip->port_str) {
> -        ds_put_format(&aff_action, REG_ORIG_TP_DPORT" = %s; ",
> +        ds_put_format(&aff_action, REG_LB_PORT" = %s; ",
>                         lb_vip->port_str);
>           ds_put_format(&aff_action_learn, ipv6 ? "[%s]:%s" : "%s:%s",
>                         lb_vip->vip_str, lb_vip->port_str);
> @@ -8204,19 +8163,19 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
>       if (lb_vip->port_str) {
>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
>                         "ct.new && %s && %s == %s && "
> -                      REG_ORIG_TP_DPORT" == %s && %s.dst == ",
> -                      ip_match, reg_vip, lb_vip->vip_str,
> +                      REG_LB_PORT" == %s && %s.dst == ",
> +                      ip_match, reg_ip, lb_vip->vip_str,
>                         lb_vip->port_str, ip_match);
>       } else {
>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
>                         "ct.new && %s && %s == %s && %s.dst == ",
> -                      ip_match, reg_vip, lb_vip->vip_str, ip_match);
> +                      ip_match, reg_ip, lb_vip->vip_str, ip_match);
>       }
>   
>       /* Prepare common part of affinity match. */
>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
>                     "ct.new && %s.dst == %s && %s == ", ip_match,
> -                  lb_vip->vip_str, reg_backend);
> +                  lb_vip->vip_str, reg_ip);
>   
>       /* Store the common part length. */
>       size_t aff_action_len = aff_action.length;
> @@ -8238,7 +8197,7 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
>   
>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
>                             lb->proto, backend->port);
> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == %d",
> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
>                             backend->port);
>           } else {
>               ds_put_cstr(&aff_action, backend->ip_str);
> @@ -8315,33 +8274,10 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
>       for (size_t i = 0; i < lb->n_vips; i++) {
>           struct ovn_lb_vip *lb_vip = &lb->vips[i];
>           struct ovn_northd_lb_vip *lb_vip_nb = &lb->vips_nb[i];
> -        const char *ip_match = NULL;
> +        const char *ip_match =
> +            lb_vip->address_family == AF_INET ? "ip4" : "ip6";
>   
>           ds_clear(action);
> -
> -        /* Store the original destination IP to be used when generating
> -         * hairpin flows.
> -         * If the packet is fragmented, then the flow which saves the
> -         * original destination IP (and port) in the "ls_in_pre_stateful"
> -         * stage will not be hit.
> -         */
> -        if (lb_vip->address_family == AF_INET) {
> -            ip_match = "ip4";
> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
> -                          lb_vip->vip_str);
> -        } else {
> -            ip_match = "ip6";
> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
> -                          lb_vip->vip_str);
> -        }
> -
> -        if (lb_vip->port_str) {
> -            /* Store the original destination port to be used when generating
> -             * hairpin flows.
> -             */
> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
> -                          lb_vip->port_str);
> -        }
>           ds_clear(match);
>   
>           /* New connections in Ingress table. */
> @@ -8489,13 +8425,13 @@ build_lb_hairpin(const struct ls_stateful_record *ls_stateful_rec,
>            * */
>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && ip4",
> -                      REG_ORIG_DIP_IPV4 " = ct_nw_dst(); "
> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
> +                      REG_LB_IPV4 " = ct_nw_dst(); "
> +                      REG_LB_PORT " = ct_tp_dst(); next;",
>                         lflow_ref);
>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && ip6",
> -                      REG_ORIG_DIP_IPV6 " = ct_ip6_dst(); "
> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
> +                      REG_LB_IPV6 " = ct_ip6_dst(); "
> +                      REG_LB_PORT " = ct_tp_dst(); next;",
>                         lflow_ref);
>   
>           /* Set REGBIT_HAIRPIN in the original direction and
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index edfd5764b..2b1791de0 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -1425,7 +1425,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
>   AT_CAPTURE_FILE([sbflows])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   
>   # disabled LSPs should not be a backend of Load Balancer
> @@ -1434,7 +1434,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 disabled
>   AT_CAPTURE_FILE([sbflows])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
>   ])
>   wait_row_count Service_Monitor 1
>   
> @@ -1443,7 +1443,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 enabled
>   AT_CAPTURE_FILE([sbflows])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   wait_row_count Service_Monitor 2
>   
> @@ -1454,7 +1454,7 @@ wait_row_count Service_Monitor 0
>   AT_CAPTURE_FILE([sbflows2])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows2 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Create the Load_Balancer_Health_Check again.])
> @@ -1466,7 +1466,7 @@ check ovn-nbctl --wait=sb sync
>   
>   ovn-sbctl dump-flows sw0 | grep backends | grep priority=120 > lflows.txt
>   AT_CHECK([cat lflows.txt | ovn_strip_lflows], [0], [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Get the uuid of both the service_monitor])
> @@ -1476,7 +1476,7 @@ sm_sw1_p1=$(fetch_column Service_Monitor _uuid logical_port=sw1-p1)
>   AT_CAPTURE_FILE([sbflows3])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows 3 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Set the service monitor for sw1-p1 to offline])
> @@ -1487,7 +1487,7 @@ check ovn-nbctl --wait=sb sync
>   AT_CAPTURE_FILE([sbflows4])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows4 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>   ])
>   
>   AS_BOX([Set the service monitor for sw0-p1 to offline])
> @@ -1516,7 +1516,7 @@ check ovn-nbctl --wait=sb sync
>   AT_CAPTURE_FILE([sbflows7])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows7 | grep backends | grep priority=120 | ovn_strip_lflows], 0,
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Set the service monitor for sw1-p1 to error])
> @@ -1527,7 +1527,7 @@ check ovn-nbctl --wait=sb sync
>   ovn-sbctl dump-flows sw0 | grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" \
>   | grep priority=120 > lflows.txt
>   AT_CHECK([cat lflows.txt | grep ls_in_lb | ovn_strip_lflows], [0], [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>   ])
>   
>   AS_BOX([Add one more vip to lb1])
> @@ -1553,8 +1553,8 @@ AT_CAPTURE_FILE([sbflows9])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows9 | grep backends | grep priority=120 | ovn_strip_lflows],
>     0,
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
>   ])
>   
>   AS_BOX([Set the service monitor for sw1-p1 to online])
> @@ -1567,8 +1567,8 @@ AT_CAPTURE_FILE([sbflows10])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw0 | tee sbflows10 | grep backends | grep priority=120 | ovn_strip_lflows],
>     0,
> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Associate lb1 to sw1])
> @@ -1577,8 +1577,8 @@ AT_CAPTURE_FILE([sbflows11])
>   OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows sw1 | tee sbflows11 | grep backends | grep priority=120 | ovn_strip_lflows],
>     0, [dnl
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>   ])
>   
>   AS_BOX([Now create lb2 same as lb1 but udp protocol.])
> @@ -4666,16 +4666,16 @@ check_stateful_flows() {
>     table=??(ls_in_pre_stateful ), priority=100  , match=(reg0[[0]] == 1), action=(ct_next;)
>     table=??(ls_in_pre_stateful ), priority=110  , match=(reg0[[2]] == 1), action=(ct_lb_mark;)
>     table=??(ls_in_pre_stateful ), priority=115  , match=(reg0[[2]] == 1 && ip.is_frag), action=(reg0[[19]] = 1; ct_lb_mark;)
> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark;)
> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark;)
>   ])
>   
>       AT_CHECK([grep "ls_in_lb " sw0flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
>   ])
>   
>       AT_CHECK([grep "ls_in_stateful" sw0flows | ovn_strip_lflows], [0], [dnl
> @@ -4780,7 +4780,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
>   AT_CHECK([ovn-sbctl dump-flows sw0 | grep "ls_in_lb " | ovn_strip_lflows ], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.20), action=(drop;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>   ])
>   
> @@ -7842,8 +7842,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
>   
>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>   ])
>   
> @@ -7899,8 +7899,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
>   
>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>   ])
>   
> @@ -7956,8 +7956,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
>   
>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>   ])
>   
> @@ -9345,13 +9345,13 @@ AT_CAPTURE_FILE([S1flows])
>   
>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>   ])
>   AT_CHECK([grep "ls_in_lb " S1flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>   ])
>   
>   ovn-sbctl get datapath S0 _uuid > dp_uuids
> @@ -9477,20 +9477,20 @@ AT_CAPTURE_FILE([S0flows])
>   
>   AT_CHECK([grep "ls_in_lb_aff_check" S0flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb_aff_check ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
> +  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
>   ])
>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.2:80);)
> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.2:80);)
>   ])
>   AT_CHECK([grep "ls_in_lb_aff_learn" S0flows | ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb_aff_learn ), priority=0    , match=(1), action=(next;)
> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
>   ])
>   
>   AS_BOX([Test LR flows])
> @@ -9499,13 +9499,13 @@ AT_CAPTURE_FILE([R1flows])
>   
>   AT_CHECK([grep "lr_in_lb_aff_check" R1flows | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_lb_aff_check ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg0 = ip4.dst; reg9[[16..31]] = tcp.dst; reg9[[6]] = chk_lb_aff(); next;)
> +  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
>   ])
>   AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; ct_lb_mark(backends=10.0.0.2:80);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; ct_lb_mark(backends=20.0.0.2:80);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(ct_lb_mark(backends=10.0.0.2:80);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(ct_lb_mark(backends=20.0.0.2:80);)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
> @@ -9515,8 +9515,8 @@ AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
>   ])
>   AT_CHECK([grep "lr_in_lb_aff_learn" R1flows | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_lb_aff_learn ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
>   ])
>   
>   AS_BOX([Test LR flows - skip_snat=true])
> @@ -9527,9 +9527,9 @@ AT_CAPTURE_FILE([R1flows_skip_snat])
>   
>   AT_CHECK([grep "lr_in_dnat " R1flows_skip_snat | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
> @@ -9548,9 +9548,9 @@ AT_CAPTURE_FILE([R1flows_force_snat])
>   
>   AT_CHECK([grep "lr_in_dnat " R1flows_force_snat | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
> @@ -9568,9 +9568,9 @@ AT_CAPTURE_FILE([R1flows_force_skip_snat])
>   
>   AT_CHECK([grep "lr_in_dnat " R1flows_force_skip_snat | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
> @@ -9592,12 +9592,12 @@ AT_CAPTURE_FILE([R1flows_2lbs])
>   
>   AT_CHECK([grep "lr_in_dnat " R1flows_2lbs | ovn_strip_lflows], [0], [dnl
>     table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
> @@ -14058,10 +14058,10 @@ ovn-sbctl dump-flows s1 > s1flows
>   AT_CAPTURE_FILE([s1flows])
>   
>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
>   ])
>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>   ])
>   
>   # Associate load balancer to lr1 with DGP
> @@ -14283,10 +14283,10 @@ ovn-sbctl dump-flows s1 > s1flows
>   AT_CAPTURE_FILE([s1flows])
>   
>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
>   ])
>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>   ])
>   
>   # Associate load balancer to lr1 with DGP
> diff --git a/tests/ovn.at b/tests/ovn.at
> index b49a63f3e..e9144b0cd 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -2161,13 +2161,13 @@ reg9[[5]] = chk_ecmp_nh();
>   
>   # commit_lb_aff
>   commit_lb_aff(vip = "172.16.0.123:8080", backend = "10.0.0.3:8080", proto = tcp, timeout = 30);
> -    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
> +    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
>   
>   commit_lb_aff(vip = "172.16.0.123", backend = "10.0.0.3", timeout = 30);
>       encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]])
>   
>   commit_lb_aff(vip = "[[::1]]:8080", backend = "[[::2]]:8080", proto = tcp, timeout = 30);
> -    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG0[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
> +    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
>   
>   # chk_lb_aff()
>   reg9[[6]] = chk_lb_aff();
> @@ -25576,8 +25576,8 @@ OVS_WAIT_FOR_OUTPUT(
>     [ovn-sbctl dump-flows > sbflows
>      ovn-sbctl dump-flows sw0 | grep ct_lb_mark | grep priority=120 | sed 's/table=..//'], 0,
>     [dnl
> -  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
> -  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
> +  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
> +  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
>   ])
>   
>   AT_CAPTURE_FILE([sbflows2])
> @@ -25621,7 +25621,7 @@ AT_CHECK(
>     [grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" sbflows3 | grep priority=120 |\
>      ovn_strip_lflows], [0], [dnl
>     table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(drop;)
> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
>   ])
>   
>   AT_CAPTURE_FILE([sbflows4])
> @@ -30627,7 +30627,7 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
> @@ -30635,7 +30635,7 @@ NXST_FLOW reply (xid=0x8):
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
> @@ -30654,9 +30654,9 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
> @@ -30664,8 +30664,8 @@ NXST_FLOW reply (xid=0x8):
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
> @@ -30687,17 +30687,17 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>   ])
>   
>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv4-udp
> @@ -30711,35 +30711,35 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>   ])
>   
>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-tcp
> @@ -30753,39 +30753,39 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>   ])
>   
>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-udp
> @@ -30799,11 +30799,11 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30811,19 +30811,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30831,10 +30831,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>   ])
>   
> @@ -30851,11 +30851,11 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30863,19 +30863,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30883,10 +30883,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>   ])
>   
> @@ -30900,12 +30900,12 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30913,21 +30913,21 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30935,12 +30935,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>   ])
>   
>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6
> @@ -30953,13 +30953,13 @@ OVS_WAIT_UNTIL(
>   )
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30967,23 +30967,23 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -30991,12 +30991,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>   ])
>   
>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
>   ])
>   
> @@ -31093,7 +31093,7 @@ OVS_WAIT_UNTIL(
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>    table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
> @@ -31103,7 +31103,7 @@ NXST_FLOW reply (xid=0x8):
>   
>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>    table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>   ])
>   
> @@ -36078,15 +36078,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int | grep 'nat(dst=85.85.85.44:8504)' -c], [
>   dnl Ensure hairpin flows are correct.
>   as hv1
>   AT_CHECK([ovs-ofctl dump-flows br-int | grep table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b01,reg2=0x10cd/0xffff,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cd/0xffff,reg4=0x2b2b2b01,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   dnl Change Chassis_Template_Var mappings
> @@ -36137,15 +36137,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int | grep 'nat(dst=84.84.84.44:8404)' -c], [
>   dnl Ensure hairpin flows are correct.
>   as hv1
>   AT_CHECK([ovs-ofctl dump-flows br-int | grep table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a01,reg2=0x1069/0xffff,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> - table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1069/0xffff,reg4=0x2a2a2a01,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> + table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>   ])
>   
>   dnl Remove Chassis_Template_Variables and check that everything is
> diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
> index 170024a61..f7745b979 100644
> --- a/tests/system-ovn-kmod.at
> +++ b/tests/system-ovn-kmod.at
> @@ -151,12 +151,12 @@ tcp,orig=(src=172.16.1.2,dst=172.16.1.100,sport=<cleared>,dport=<cleared>),reply
>   
>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key external_ids:name=R2))
>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 's/load:0xc0a80[[0-9]]02/load:0xc0a80<cleared>02/'], [0], [dnl
> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG8[[0..15]]
> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG2[[0..15]]
>   ])
>   
>   check_affinity_flows () {
> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
>   echo $?
>   }
> @@ -452,12 +452,12 @@ tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd
>   
>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key external_ids:name=R2))
>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 's/load:0xfd1[[0-9]]000000000000/load:0xfd1<cleared>000000000000/'], [0], [dnl
> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG8[[0..15]]
> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG2[[0..15]]
>   ])
>   
>   check_affinity_flows () {
> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
>   echo $?
>   }
Mark Michelson Jan. 23, 2025, 5:04 p.m. UTC | #2
On 1/22/25 16:59, Mark Michelson wrote:
> Hi Ales,
> 
> Acked-by: Mark Michelson <mmichels@redhat.com>
> 
> My only suggestion would be to add a comment in northd.c above the 
> definitions for REG_LB_IPV4, REG_LB_IPV6, and REG_LB_PORT that explains 
> that on new connections, these contain the VIP[:port], and on 
> established connections, these contain the backend[:port]. Otherwise, 
> the register names are ambiguous, and the fact they are used for two 
> purposes is not clear.
> 
> On 1/22/25 12:08, Ales Musil wrote:
>> We were running out of space in registers. After the consolidation
>> there are several registers are free to use once again.
>> The consolidation is mainly done by reusing single register for LB
>> affinity flows.
>>
>> Signed-off-by: Ales Musil <amusil@redhat.com>

I added the comment and pushed the patch to main. Thanks Ales!

>> ---
>>   include/ovn/logical-fields.h |   7 +-
>>   lib/actions.c                |   6 +-
>>   northd/northd.c              | 254 +++++++++++++---------------------
>>   tests/ovn-northd.at          | 126 ++++++++---------
>>   tests/ovn.at                 | 258 +++++++++++++++++------------------
>>   tests/system-ovn-kmod.at     |  12 +-
>>   6 files changed, 297 insertions(+), 366 deletions(-)
>>
>> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
>> index 59e4ac3da..6a87fc386 100644
>> --- a/include/ovn/logical-fields.h
>> +++ b/include/ovn/logical-fields.h
>> @@ -47,7 +47,7 @@ enum ovn_controller_event {
>>    *
>>    * Make sure these don't overlap with the logical fields! */
>>   #define MFF_LOG_REG0             MFF_REG0
>> -#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG1
>> +#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG4
>>   #define MFF_LOG_LB_ORIG_TP_DPORT MFF_REG2
>>   #define MFF_LOG_XXREG0           MFF_XXREG0
>> @@ -56,9 +56,8 @@ enum ovn_controller_event {
>>   #define MFF_N_LOG_REGS 10
>>   #define MFF_LOG_LB_AFF_MATCH_IP4_ADDR       MFF_REG4
>> -#define MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR    MFF_XXREG0
>> -#define MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR    MFF_XXREG1
>> -#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG8
>> +#define MFF_LOG_LB_AFF_MATCH_IP6_ADDR       MFF_XXREG1
>> +#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG2
>>   #define MFF_LOG_CT_ORIG_NW_DST_ADDR         MFF_REG1   /* 
>> REG_ORIG_DIP_IPV4 */
>>   #define MFF_LOG_CT_ORIG_IP6_DST_ADDR        MFF_XXREG1 /* 
>> REG_ORIG_DIP_IPV6 */
>> diff --git a/lib/actions.c b/lib/actions.c
>> index ea30be767..62e73b2c5 100644
>> --- a/lib/actions.c
>> +++ b/lib/actions.c
>> @@ -5371,11 +5371,7 @@ encode_COMMIT_LB_AFF(const struct 
>> ovnact_commit_lb_aff *lb_aff,
>>           imm_backend_ip = (union mf_value) {
>>               .ipv6 =  lb_aff->backend,
>>           };
>> -        if (ep->is_switch) {
>> -            ol_spec->dst.field = 
>> mf_from_id(MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR);
>> -        } else {
>> -            ol_spec->dst.field = 
>> mf_from_id(MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR);
>> -        }
>> +        ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_IP6_ADDR);
>>       } else {
>>           ovs_be32 ip4 = in6_addr_get_mapped_ipv4(&lb_aff->backend);
>>           imm_backend_ip = (union mf_value) {
>> diff --git a/northd/northd.c b/northd/northd.c
>> index c41a7591b..2385c3b5e 100644
>> --- a/northd/northd.c
>> +++ b/northd/northd.c
>> @@ -125,20 +125,12 @@ static bool vxlan_mode;
>>   #define REGBIT_FROM_ROUTER_PORT   "reg0[18]"
>>   #define REGBIT_IP_FRAG            "reg0[19]"
>> -#define REG_ORIG_DIP_IPV4         "reg1"
>> -#define REG_ORIG_DIP_IPV6         "xxreg1"
>> -#define REG_ORIG_TP_DPORT         "reg2[0..15]"
>> -
>> -/* Register used to store backend ipv6 address
>> - * for load balancer affinity. */
>> -#define REG_LB_L2_AFF_BACKEND_IP6 "xxreg0"
>> -
>>   /* Register definitions for switches and routers. */
>> -/* Register used to store backend ipv4 address
>> - * for load balancer affinity. */
>> -#define REG_LB_AFF_BACKEND_IP4  "reg4"
>> -#define REG_LB_AFF_MATCH_PORT   "reg8[0..15]"
>> +/* Register used for LB. */
>> +#define REG_LB_IPV4 "reg4"
>> +#define REG_LB_IPV6 "xxreg1"
>> +#define REG_LB_PORT "reg2[0..15]"
>>   /* Registers for ACL evaluation */
>>   #define REGBIT_ACL_VERDICT_ALLOW "reg8[16]"
>> @@ -192,12 +184,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>>   #define REG_DHCP_RELAY_DIP_IPV4 "reg2"
>>   #define REG_ROUTE_TABLE_ID "reg7"
>> -/* Register used to store backend ipv6 address
>> - * for load balancer affinity. */
>> -#define REG_LB_L3_AFF_BACKEND_IP6  "xxreg1"
>> -
>> -#define REG_ORIG_TP_DPORT_ROUTER   "reg9[16..31]"
>> -
>>   /* Registers used for pasing observability information for switches:
>>    * domain and point ID. */
>>   #define REG_OBS_POINT_ID_NEW "reg3"
>> @@ -227,25 +213,27 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>>    * |    |     REGBIT_{HAIRPIN/HAIRPIN_REPLY}           |   
>> |                                   |
>>    * |    | REGBIT_ACL_HINT_{ALLOW_NEW/ALLOW/DROP/BLOCK} |   
>> |                                   |
>>    * |    |     REGBIT_ACL_{LABEL/STATELESS}             | X 
>> |                                   |
>> - * +----+----------------------------------------------+ X |       
>> LB_L2_AFF_BACKEND_IP6       |
>> - * | R1 |         ORIG_DIP_IPV4 (>= IN_PRE_STATEFUL)   | R |        
>> (>= IN_LB_AFF_CHECK &&     |
>> - * +----+----------------------------------------------+ E |         
>> <= IN_LB_AFF_LEARN)       |
>> - * | R2 |         ORIG_TP_DPORT (>= IN_PRE_STATEFUL)   | G 
>> |                                   |
>> - * +----+----------------------------------------------+ 0 
>> |                                   |
>> + * +----+----------------------------------------------+ X 
>> |                                   |
>> + * | R1 |                   UNUSED                     | R 
>> |                                   |
>> + * +----+----------------------------------------------+ E 
>> |                                   |
>> + * | R2 |                 REG_LB_PORT                  | G 
>> |                                   |
>> + * |    |  (>= IN_PRE_STATEFUL && <= IN_LB_AFF_LEARN)  | 0 
>> |                                   |
>> + * +----+----------------------------------------------+   
>> |                                   |
>>    * | R3 |             OBS_POINT_ID_NEW                 |   
>> |                                   |
>>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   
>> |                                   |
>>    * 
>> +----+----------------------------------------------+---+-----------------------------------+
>> - * | R4 |            REG_LB_AFF_BACKEND_IP4            |   
>> |                                   |
>> - * +----+----------------------------------------------+ X 
>> |                                   |
>> - * | R5 |                   UNUSED                     | X | 
>> ORIG_DIP_IPV6(>= IN_PRE_STATEFUL) |
>> - * +----+----------------------------------------------+ R 
>> |                                   |
>> - * | R6 |                   UNUSED                     | E 
>> |                                   |
>> - * +----+----------------------------------------------+ G 
>> |                                   |
>> - * | R7 |                   UNUSED                     | 1 
>> |                                   |
>> + * | R4 |                 REG_LB_IPV4                  |   
>> |                                   |
>> + * | R4 |    (>= IN_PRE_STATEFUL && <= IN_HAIRPIN)     | X 
>> |                                   |
>> + * +----+----------------------------------------------+ X 
>> |           REG_LB_IPV6             |
>> + * | R5 |                   UNUSED                     | R |      (>= 
>> IN_PRE_STATEFUL &&       |
>> + * +----+----------------------------------------------+ E |       <= 
>> IN_HAIRPIN)              |
>> + * | R6 |                   UNUSED                     | G 
>> |                                   |
>> + * +----+----------------------------------------------+ 1 
>> |                                   |
>> + * | R7 |                   UNUSED                     |   
>> |                                   |
>>    * 
>> +----+----------------------------------------------+---+-----------------------------------+
>> - * | R8 |              LB_AFF_MATCH_PORT               | X |      
>> REG_OBS_COLLECTOR_ID_NEW     |
>> - * |    |  (>= IN_LB_AFF_CHECK && <= IN_LB_AFF_LEARN)  | R |      
>> REG_OBS_COLLECTOR_ID_EST     |
>> - * |    |                                              | E |  (>= 
>> ACL_EVAL* && <= ACL_ACTION*) |
>> + * | R8 |           REG_OBS_COLLECTOR_ID_NEW           | X 
>> |                                   |
>> + * |    |           REG_OBS_COLLECTOR_ID_EST           | R 
>> |                                   |
>> + * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       | E 
>> |                                   |
>>    * +----+----------------------------------------------+ G 
>> +-----------------------------------+
>>    * | R9 |              OBS_POINT_ID_EST                | 4 
>> |                                   |
>>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   
>> |                                   |
>> @@ -256,23 +244,26 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>>    * | R0  | REGBIT_ND_RA_OPTS_RESULT  |   |                 |   
>> |                                    |
>>    * |     |   (= IN_ND_RA_OPTIONS)    | X |                 |   
>> |                                    |
>>    * |     |      NEXT_HOP_IPV4        | R |                 |   
>> |                                    |
>> - * |     |      (>= IP_INPUT)        | E | INPORT_ETH_ADDR | X 
>> |                                    |
>> + * |     |   (>= IN_IP_ROUTING)      | E | INPORT_ETH_ADDR | X 
>> |                                    |
>>    * +-----+---------------------------+ G |   (< IP_INPUT)  | X 
>> |                                    |
>>    * | R1  |        UNUSED             | 0 |                 | R 
>> |                                    |
>> - * |     |                           |   |                 | E |     
>> NEXT_HOP_IPV6 (>= DEFRAG )     |
>> + * |     |                           |   |                 | E |  
>> NEXT_HOP_IPV6 (>= IN_IP_ROUTING)  |
>>    * +-----+---------------------------+---+-----------------+ G 
>> |                                    |
>> - * | R2     REG_DHCP_RELAY_DIP_IPV4  | X |                 | 0 
>> |                                    |
>> - * |     |                           | R |                 |   
>> |                                    |
>> - * +-----+---------------------------+ E |     UNUSED      |   
>> |                                    |
>> - * | R3  |        UNUSED             | G |                 |   
>> |                                    |
>> - * |     |                           | 1 |                 |   
>> |                                    |
>> + * | R2  |  REG_DHCP_RELAY_DIP_IPV4  |   |                 | 0 
>> |                                    |
>> + * |     |       REG_LB_PORT         | X |                 | 0 
>> |                                    |
>> + * |     | (>= IN_LB_AFF_CHECK       | R |                 |   
>> |                                    |
>> + * |     |  <= IN_LB_AFF_LEARN)      | E |                 |   
>> |                                    |
>> + * +-----+---------------------------+ G |     UNUSED      |   
>> |                                    |
>> + * | R3  |        UNUSED             | 1 |                 |   
>> |                                    |
>> + * |     |                           |   |                 |   
>> |                                    |
>>    * 
>> +-----+---------------------------+---+-----------------+---+------------------------------------+
>> - * | R4  |  REG_LB_AFF_BACKEND_IP4   | X |                 |   
>> |                                    |
>> - * |     |                           | R |                 |   
>> |                                    |
>> + * | R4  |        REG_LB_IPV4        | X |                 |   
>> |                                    |
>> + * |     |  (>= IN_LB_AFF_CHECK &&   | R |                 |   
>> |                                    |
>> + * |     |   <= IN_LB_AFF_LEARN)     | R |                 |   
>> |                                    |
>>    * +-----+---------------------------+ E |     UNUSED      | X 
>> |                                    |
>> - * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X 
>> |                                    |
>> - * |     |      (>= IP_INPUT)        | 2 |                 | R 
>> |        LB_L3_AFF_BACKEND_IP6       |
>> - * +-----+---------------------------+---+-----------------+ E 
>> |           (<= IN_DNAT)             |
>> + * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X 
>> |            REG_LB_IPV6             |
>> + * |     |      (>= IP_INPUT)        | 2 |                 | R 
>> |        (>= IN_LB_AFF_CHECK &&      |
>> + * +-----+---------------------------+---+-----------------+ E 
>> |         <= IN_LB_AFF_LEARN)        |
>>    * | R6  |        UNUSED             | X |                 | G 
>> |                                    |
>>    * |     |                           | R |                 | 1 
>> |                                    |
>>    * +-----+---------------------------+ E |     UNUSED      |   
>> |                                    |
>> @@ -282,7 +273,7 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>>    * 
>> +-----+---------------------------+---+-----------------+---+------------------------------------+
>>    * | R8  |     ECMP_GROUP_ID         |   |                 |
>>    * |     |     ECMP_MEMBER_ID        |   |                 |
>> - * |     |    LB_AFF_MATCH_PORT      | X |                 |
>> + * |     |                           | X |                 |
>>    * +-----+---------------------------+ R |                 |
>>    * |     | REGBIT_{                  | E |                 |
>>    * |     |   EGRESS_LOOPBACK/        | G |     UNUSED      |
>> @@ -292,9 +283,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
>>    * |     |REGBIT_DHCP_RELAY_REQ_CHK/ |   |                 |
>>    * |     |REGBIT_DHCP_RELAY_RESP_CHK |   |                 |
>>    * |     |REGBIT_NEXTHOP_IS_IPV4}    |   |                 |
>> - * |     |                           |   |                 |
>> - * |     | REG_ORIG_TP_DPORT_ROUTER  |   |                 |
>> - * |     |                           |   |                 |
>>    * +-----+---------------------------+---+-----------------+
>>    *
>>    */
>> @@ -3621,6 +3609,16 @@ build_lb_vip_actions(const struct ovn_northd_lb 
>> *lb,
>>       bool reject = !lb_vip->n_backends && lb_vip->empty_backend_rej;
>>       bool drop = !lb_vip->n_backends && !lb_vip->empty_backend_rej;
>> +    if (ls_dp || lb->affinity_timeout) {
>> +        const char *ip_reg =
>> +            lb_vip->address_family == AF_INET ? REG_LB_IPV4 : 
>> REG_LB_IPV6;
>> +        ds_put_format(action, "%s = %s; ", ip_reg, lb_vip->vip_str);
>> +
>> +        if (lb_vip->port_str) {
>> +            ds_put_format(action, REG_LB_PORT" = %s; ", 
>> lb_vip->port_str);
>> +        }
>> +    }
>> +
>>       if (lb_vip_nb->lb_health_check) {
>>           ds_put_cstr(action, "ct_lb_mark(backends=");
>> @@ -7867,29 +7865,19 @@ build_lb_rules_pre_stateful(struct lflow_table 
>> *lflows,
>>            */
>>           if (lb->vips[i].address_family == AF_INET) {
>>               ip_match = "ip4";
>> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
>> +            ds_put_format(action, REG_LB_IPV4 " = %s; ",
>>                             lb_vip->vip_str);
>>           } else {
>>               ip_match = "ip6";
>> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
>> +            ds_put_format(action, REG_LB_IPV6 " = %s; ",
>>                             lb_vip->vip_str);
>>           }
>> -        const char *proto = NULL;
>>           if (lb_vip->port_str) {
>> -            proto = "tcp";
>> -            if (lb->nlb->protocol) {
>> -                if (!strcmp(lb->nlb->protocol, "udp")) {
>> -                    proto = "udp";
>> -                } else if (!strcmp(lb->nlb->protocol, "sctp")) {
>> -                    proto = "sctp";
>> -                }
>> -            }
>> -
>>               /* Store the original destination port to be used when 
>> generating
>>                * hairpin flows.
>>                */
>> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
>> +            ds_put_format(action, REG_LB_PORT " = %s; ",
>>                             lb_vip->port_str);
>>           }
>>           ds_put_cstr(action, "ct_lb_mark;");
>> @@ -7897,7 +7885,8 @@ build_lb_rules_pre_stateful(struct lflow_table 
>> *lflows,
>>           ds_put_format(match, REGBIT_CONNTRACK_NAT" == 1 && %s.dst == 
>> %s",
>>                         ip_match, lb_vip->vip_str);
>>           if (lb_vip->port_str) {
>> -            ds_put_format(match, " && %s.dst == %s", proto, 
>> lb_vip->port_str);
>> +            ds_put_format(match, " && %s.dst == %s", lb->proto,
>> +                          lb_vip->port_str);
>>           }
>>           ovn_lflow_add_with_dp_group(
>> @@ -7913,34 +7902,30 @@ build_lb_rules_pre_stateful(struct lflow_table 
>> *lflows,
>>    * - load balancing affinity check:
>>    *   table=lr_in_lb_aff_check, priority=100
>>    *      match=(new_lb_match)
>> - *      action=(REG_NEXT_HOP_IPV4 = ip4.dst;
>> - *              REG_ORIG_TP_DPORT_ROUTER = tcp.dst;
>> - *              REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
>> + *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
>>    *
>>    * - load balancing:
>>    *   table=lr_in_dnat, priority=150
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
>> - *             && REG_LB_AFF_BACKEND_IP4 == B1 && 
>> REG_LB_AFF_MATCH_PORT == BP1)
>> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
>> - *              ct_lb_mark(backends=B1:BP1; ct_flag);)
>> + *             && REG_LB_IPV4 == B1 && REG_LB_PORT == BP1)
>> + *      action=(lb_action; ct_lb_mark(backends=B1:BP1; ct_flag);)
>>    *   table=lr_in_dnat, priority=150
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
>> - *             && REG_LB_AFF_BACKEND_IP4 == B2 && 
>> REG_LB_AFF_MATCH_PORT == BP2)
>> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
>> - *              ct_lb_mark(backends=B2:BP2; ct_flag);)
>> + *             && REG_LB_IPV4 == B2 && REG_LB_PORT == BP2)
>> + *      action=(lb_action; ct_lb_mark(backends=B2:BP2; ct_flag);)
>>    *
>>    * - load balancing affinity learn:
>>    *   table=lr_in_lb_aff_learn, priority=100
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>>    *             && ct.new && ip4
>> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER 
>> = VP
>> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
>>    *             && ip4.dst == B1 && tcp.dst == BP1)
>>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
>>    *                            proto = tcp, timeout = T));
>>    *   table=lr_in_lb_aff_learn, priority=100
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>>    *             && ct.new && ip4
>> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER 
>> = VP
>> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
>>    *             && ip4.dst == B2 && tcp.dst == BP2)
>>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
>>    *                            proto = tcp, timeout = T));
>> @@ -7963,14 +7948,11 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>       struct ds aff_action_learn = DS_EMPTY_INITIALIZER;
>>       struct ds aff_match = DS_EMPTY_INITIALIZER;
>>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
>> -    struct ds aff_check_action = DS_EMPTY_INITIALIZER;
>>       bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
>>       const char *ip_match = ipv6 ? "ip6" : "ip4";
>> -    const char *reg_vip = ipv6 ? REG_NEXT_HOP_IPV6 : REG_NEXT_HOP_IPV4;
>> -    const char *reg_backend =
>> -        ipv6 ? REG_LB_L3_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
>> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
>>       const char *ct_flag = NULL;
>>       if (lb_action && !strcmp(lb_action, "flags.skip_snat_for_lb = 1; 
>> ")) {
>>           ct_flag = "; skip_snat";
>> @@ -7980,22 +7962,12 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>       }
>>       /* Create affinity check flow. */
>> -    ds_put_format(&aff_check_action, "%s = %s.dst; ", reg_vip, 
>> ip_match);
>> -
>> -    if (lb_vip->port_str) {
>> -        ds_put_format(&aff_check_action, REG_ORIG_TP_DPORT_ROUTER" = 
>> %s.dst; ",
>> -                      lb->proto);
>> -    }
>> -    ds_put_cstr(&aff_check_action, REGBIT_KNOWN_LB_SESSION
>> -                " = chk_lb_aff(); next;");
>> -
>>       ovn_lflow_add_with_dp_group(
>>           lflows, dp_bitmap, ods_size(lr_datapaths), 
>> S_ROUTER_IN_LB_AFF_CHECK,
>> -        100, new_lb_match, ds_cstr(&aff_check_action), 
>> &lb->nlb->header_,
>> -        lflow_ref);
>> +        100, new_lb_match, REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); 
>> next;",
>> +        &lb->nlb->header_, lflow_ref);
>>       /* Prepare common part of affinity LB and affinity learn action. */
>> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
>>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
>>       if (lb_vip->port_str) {
>> @@ -8015,19 +7987,19 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>       if (lb_vip->port_str) {
>>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 
>> 0 && "
>>                         "ct.new && %s && %s == %s && "
>> -                      REG_ORIG_TP_DPORT_ROUTER" == %s && "
>> -                      "%s.dst == ", ip_match, reg_vip, lb_vip->vip_str,
>> +                      REG_LB_PORT " == %s && "
>> +                      "%s.dst == ", ip_match, reg_ip, lb_vip->vip_str,
>>                         lb_vip->port_str, ip_match);
>>       } else {
>>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 
>> 0 && "
>>                         "ct.new && %s && %s == %s && %s.dst == ", 
>> ip_match,
>> -                      reg_vip, lb_vip->vip_str, ip_match);
>> +                      reg_ip, lb_vip->vip_str, ip_match);
>>       }
>>       /* Prepare common part of affinity match. */
>>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
>>                     "ct.new && %s.dst == %s && %s == ", ip_match,
>> -                  lb_vip->vip_str, reg_backend);
>> +                  lb_vip->vip_str, reg_ip);
>>       /* Store the common part length. */
>>       size_t aff_action_len = aff_action.length;
>> @@ -8050,7 +8022,7 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
>>                             lb->proto, backend->port);
>> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == 
>> %d",
>> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
>>                             backend->port);
>>           } else {
>>               ds_put_cstr(&aff_action, backend->ip_str);
>> @@ -8094,7 +8066,6 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>       ds_destroy(&aff_action_learn);
>>       ds_destroy(&aff_match);
>>       ds_destroy(&aff_match_learn);
>> -    ds_destroy(&aff_check_action);
>>   }
>>   /* Builds the logical switch flows related to load balancer affinity.
>> @@ -8102,35 +8073,33 @@ build_lb_affinity_lr_flows(struct lflow_table 
>> *lflows,
>>    * affinity timeout set to T, it generates the following logical flows:
>>    * - load balancing affinity check:
>>    *   table=ls_in_lb_aff_check, priority=100
>> - *      match=(ct.new && ip4
>> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP)
>> + *      match=(ct.new && ip4 && ip4.dst == V && PROTO && PROTO.dst == 
>> VP)
>>    *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
>>    *
>>    * - load balancing:
>>    *   table=ls_in_lb, priority=150
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
>> - *             && REG_LB_AFF_BACKEND_IP4 == B1 && 
>> REG_LB_AFF_MATCH_PORT == BP1)
>> - *      action=(REG_ORIG_DIP_IPV4 = V; REG_ORIG_TP_DPORT = VP;
>> + *             && PROTO && PROTO.dst == VP)
>> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
>>    *              ct_lb_mark(backends=B1:BP1);)
>>    *   table=ls_in_lb, priority=150
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
>> - *             && REG_LB_AFF_BACKEND_IP4 == B2 && 
>> REG_LB_AFF_MATCH_PORT == BP2)
>> - *      action=(REG_ORIG_DIP_IPV4 = V;
>> - *              REG_ORIG_TP_DPORT = VP;
>> + *             && PROTO && PROTO.dst == VP)
>> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
>>    *              ct_lb_mark(backends=B1:BP2);)
>>    *
>>    * - load balancing affinity learn:
>>    *   table=ls_in_lb_aff_learn, priority=100
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>>    *             && ct.new && ip4
>> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
>> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
>>    *             && ip4.dst == B1 && tcp.dst == BP1)
>>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
>>    *                            proto = tcp, timeout = T));
>>    *   table=ls_in_lb_aff_learn, priority=100
>>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
>>    *             && ct.new && ip4
>> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
>> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
>>    *             && ip4.dst == B2 && tcp.dst == BP2)
>>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
>>    *                            proto = tcp, timeout = T));
>> @@ -8149,19 +8118,16 @@ build_lb_affinity_ls_flows(struct lflow_table 
>> *lflows,
>>       const struct ovn_northd_lb *lb = lb_dps->lb;
>>       struct ds new_lb_match = DS_EMPTY_INITIALIZER;
>> -    if (IN6_IS_ADDR_V4MAPPED(&lb_vip->vip)) {
>> -        ds_put_format(&new_lb_match,
>> -                      "ct.new && ip4 && "REG_ORIG_DIP_IPV4 " == %s",
>> -                      lb_vip->vip_str);
>> -    } else {
>> -        ds_put_format(&new_lb_match,
>> -                      "ct.new && ip6 && "REG_ORIG_DIP_IPV6 " == %s",
>> -                      lb_vip->vip_str);
>> -    }
>> +    bool ipv6 = lb_vip->address_family == AF_INET6;
>> +    const char *ip_match = ipv6 ? "ip6" : "ip4";
>> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
>> +
>> +    ds_put_format(&new_lb_match, "ct.new && %s && %s.dst == %s",
>> +                  ip_match, ip_match, lb_vip->vip_str);
>>       if (lb_vip->port_str) {
>> -        ds_put_format(&new_lb_match, " && "REG_ORIG_TP_DPORT " == %s",
>> -                      lb_vip->port_str);
>> +        ds_put_format(&new_lb_match, " && %s && %s.dst == %s",
>> +                      lb->proto, lb->proto, lb_vip->port_str);
>>       }
>>       static char *aff_check = REGBIT_KNOWN_LB_SESSION" = 
>> chk_lb_aff(); next;";
>> @@ -8177,19 +8143,12 @@ build_lb_affinity_ls_flows(struct lflow_table 
>> *lflows,
>>       struct ds aff_match = DS_EMPTY_INITIALIZER;
>>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
>> -    bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
>> -    const char *ip_match = ipv6 ? "ip6" : "ip4";
>> -
>> -    const char *reg_vip = ipv6 ? REG_ORIG_DIP_IPV6 : REG_ORIG_DIP_IPV4;
>> -    const char *reg_backend =
>> -        ipv6 ? REG_LB_L2_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
>> -
>>       /* Prepare common part of affinity LB and affinity learn action. */
>> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
>> +    ds_put_format(&aff_action, "%s = %s; ", reg_ip, lb_vip->vip_str);
>>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
>>       if (lb_vip->port_str) {
>> -        ds_put_format(&aff_action, REG_ORIG_TP_DPORT" = %s; ",
>> +        ds_put_format(&aff_action, REG_LB_PORT" = %s; ",
>>                         lb_vip->port_str);
>>           ds_put_format(&aff_action_learn, ipv6 ? "[%s]:%s" : "%s:%s",
>>                         lb_vip->vip_str, lb_vip->port_str);
>> @@ -8204,19 +8163,19 @@ build_lb_affinity_ls_flows(struct lflow_table 
>> *lflows,
>>       if (lb_vip->port_str) {
>>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 
>> 0 && "
>>                         "ct.new && %s && %s == %s && "
>> -                      REG_ORIG_TP_DPORT" == %s && %s.dst == ",
>> -                      ip_match, reg_vip, lb_vip->vip_str,
>> +                      REG_LB_PORT" == %s && %s.dst == ",
>> +                      ip_match, reg_ip, lb_vip->vip_str,
>>                         lb_vip->port_str, ip_match);
>>       } else {
>>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 
>> 0 && "
>>                         "ct.new && %s && %s == %s && %s.dst == ",
>> -                      ip_match, reg_vip, lb_vip->vip_str, ip_match);
>> +                      ip_match, reg_ip, lb_vip->vip_str, ip_match);
>>       }
>>       /* Prepare common part of affinity match. */
>>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
>>                     "ct.new && %s.dst == %s && %s == ", ip_match,
>> -                  lb_vip->vip_str, reg_backend);
>> +                  lb_vip->vip_str, reg_ip);
>>       /* Store the common part length. */
>>       size_t aff_action_len = aff_action.length;
>> @@ -8238,7 +8197,7 @@ build_lb_affinity_ls_flows(struct lflow_table 
>> *lflows,
>>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
>>                             lb->proto, backend->port);
>> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == 
>> %d",
>> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
>>                             backend->port);
>>           } else {
>>               ds_put_cstr(&aff_action, backend->ip_str);
>> @@ -8315,33 +8274,10 @@ build_lb_rules(struct lflow_table *lflows, 
>> struct ovn_lb_datapaths *lb_dps,
>>       for (size_t i = 0; i < lb->n_vips; i++) {
>>           struct ovn_lb_vip *lb_vip = &lb->vips[i];
>>           struct ovn_northd_lb_vip *lb_vip_nb = &lb->vips_nb[i];
>> -        const char *ip_match = NULL;
>> +        const char *ip_match =
>> +            lb_vip->address_family == AF_INET ? "ip4" : "ip6";
>>           ds_clear(action);
>> -
>> -        /* Store the original destination IP to be used when generating
>> -         * hairpin flows.
>> -         * If the packet is fragmented, then the flow which saves the
>> -         * original destination IP (and port) in the 
>> "ls_in_pre_stateful"
>> -         * stage will not be hit.
>> -         */
>> -        if (lb_vip->address_family == AF_INET) {
>> -            ip_match = "ip4";
>> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
>> -                          lb_vip->vip_str);
>> -        } else {
>> -            ip_match = "ip6";
>> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
>> -                          lb_vip->vip_str);
>> -        }
>> -
>> -        if (lb_vip->port_str) {
>> -            /* Store the original destination port to be used when 
>> generating
>> -             * hairpin flows.
>> -             */
>> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
>> -                          lb_vip->port_str);
>> -        }
>>           ds_clear(match);
>>           /* New connections in Ingress table. */
>> @@ -8489,13 +8425,13 @@ build_lb_hairpin(const struct 
>> ls_stateful_record *ls_stateful_rec,
>>            * */
>>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
>>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && 
>> ip4",
>> -                      REG_ORIG_DIP_IPV4 " = ct_nw_dst(); "
>> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
>> +                      REG_LB_IPV4 " = ct_nw_dst(); "
>> +                      REG_LB_PORT " = ct_tp_dst(); next;",
>>                         lflow_ref);
>>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
>>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && 
>> ip6",
>> -                      REG_ORIG_DIP_IPV6 " = ct_ip6_dst(); "
>> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
>> +                      REG_LB_IPV6 " = ct_ip6_dst(); "
>> +                      REG_LB_PORT " = ct_tp_dst(); next;",
>>                         lflow_ref);
>>           /* Set REGBIT_HAIRPIN in the original direction and
>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
>> index edfd5764b..2b1791de0 100644
>> --- a/tests/ovn-northd.at
>> +++ b/tests/ovn-northd.at
>> @@ -1425,7 +1425,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
>>   AT_CAPTURE_FILE([sbflows])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   # disabled LSPs should not be a backend of Load Balancer
>> @@ -1434,7 +1434,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 disabled
>>   AT_CAPTURE_FILE([sbflows])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
>>   ])
>>   wait_row_count Service_Monitor 1
>> @@ -1443,7 +1443,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 enabled
>>   AT_CAPTURE_FILE([sbflows])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   wait_row_count Service_Monitor 2
>> @@ -1454,7 +1454,7 @@ wait_row_count Service_Monitor 0
>>   AT_CAPTURE_FILE([sbflows2])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows2 | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], [0],
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Create the Load_Balancer_Health_Check again.])
>> @@ -1466,7 +1466,7 @@ check ovn-nbctl --wait=sb sync
>>   ovn-sbctl dump-flows sw0 | grep backends | grep priority=120 > 
>> lflows.txt
>>   AT_CHECK([cat lflows.txt | ovn_strip_lflows], [0], [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Get the uuid of both the service_monitor])
>> @@ -1476,7 +1476,7 @@ sm_sw1_p1=$(fetch_column Service_Monitor _uuid 
>> logical_port=sw1-p1)
>>   AT_CAPTURE_FILE([sbflows3])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows 3 | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], [0],
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Set the service monitor for sw1-p1 to offline])
>> @@ -1487,7 +1487,7 @@ check ovn-nbctl --wait=sb sync
>>   AT_CAPTURE_FILE([sbflows4])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows4 | grep 
>> 'priority=120.*backends' | ovn_strip_lflows], [0],
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>>   ])
>>   AS_BOX([Set the service monitor for sw0-p1 to offline])
>> @@ -1516,7 +1516,7 @@ check ovn-nbctl --wait=sb sync
>>   AT_CAPTURE_FILE([sbflows7])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows7 | grep backends | grep 
>> priority=120 | ovn_strip_lflows], 0,
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Set the service monitor for sw1-p1 to error])
>> @@ -1527,7 +1527,7 @@ check ovn-nbctl --wait=sb sync
>>   ovn-sbctl dump-flows sw0 | grep "ip4.dst == 10.0.0.10 && tcp.dst == 
>> 80" \
>>   | grep priority=120 > lflows.txt
>>   AT_CHECK([cat lflows.txt | grep ls_in_lb | ovn_strip_lflows], [0], [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>>   ])
>>   AS_BOX([Add one more vip to lb1])
>> @@ -1553,8 +1553,8 @@ AT_CAPTURE_FILE([sbflows9])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows9 | grep backends | grep 
>> priority=120 | ovn_strip_lflows],
>>     0,
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
>>   ])
>>   AS_BOX([Set the service monitor for sw1-p1 to online])
>> @@ -1567,8 +1567,8 @@ AT_CAPTURE_FILE([sbflows10])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw0 | tee sbflows10 | grep backends | grep 
>> priority=120 | ovn_strip_lflows],
>>     0,
>> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Associate lb1 to sw1])
>> @@ -1577,8 +1577,8 @@ AT_CAPTURE_FILE([sbflows11])
>>   OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows sw1 | tee sbflows11 | grep backends | grep 
>> priority=120 | ovn_strip_lflows],
>>     0, [dnl
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; 
>> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
>>   ])
>>   AS_BOX([Now create lb2 same as lb1 but udp protocol.])
>> @@ -4666,16 +4666,16 @@ check_stateful_flows() {
>>     table=??(ls_in_pre_stateful ), priority=100  , match=(reg0[[0]] == 
>> 1), action=(ct_next;)
>>     table=??(ls_in_pre_stateful ), priority=110  , match=(reg0[[2]] == 
>> 1), action=(ct_lb_mark;)
>>     table=??(ls_in_pre_stateful ), priority=115  , match=(reg0[[2]] == 
>> 1 && ip.is_frag), action=(reg0[[19]] = 1; ct_lb_mark;)
>> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>>   ])
>>       AT_CHECK([grep "ls_in_lb " sw0flows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
>>   ])
>>       AT_CHECK([grep "ls_in_stateful" sw0flows | ovn_strip_lflows], 
>> [0], [dnl
>> @@ -4780,7 +4780,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
>>   AT_CHECK([ovn-sbctl dump-flows sw0 | grep "ls_in_lb " | 
>> ovn_strip_lflows ], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.20), action=(drop;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>   ])
>> @@ -7842,8 +7842,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e 
>> "ls_in_acl_hint" lsflows | ovn_strip_lflo
>>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>   ])
>> @@ -7899,8 +7899,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e 
>> "ls_in_acl_hint" lsflows | ovn_strip_lflo
>>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>   ])
>> @@ -7956,8 +7956,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e 
>> "ls_in_acl_hint" lsflows | ovn_strip_lflo
>>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; 
>> ct_lb_mark(backends=10.0.0.10);)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>   ])
>> @@ -9345,13 +9345,13 @@ AT_CAPTURE_FILE([S1flows])
>>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 
>> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 
>> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>>   ])
>>   AT_CHECK([grep "ls_in_lb " S1flows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 
>> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 
>> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
>>   ])
>>   ovn-sbctl get datapath S0 _uuid > dp_uuids
>> @@ -9477,20 +9477,20 @@ AT_CAPTURE_FILE([S0flows])
>>   AT_CHECK([grep "ls_in_lb_aff_check" S0flows | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(ls_in_lb_aff_check ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 
>> && reg1 == 172.16.0.10 && reg2[[0..15]] == 80), action=(reg9[[6]] = 
>> chk_lb_aff(); next;)
>> +  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 
>> && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]] 
>> = chk_lb_aff(); next;)
>>   ])
>>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk && 
>> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); 
>> reg2[[0..15]] = ct_tp_dst(); next;)
>> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
>> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; 
>> ct_lb_mark(backends=10.0.0.2:80);)
>> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; 
>> ct_lb_mark(backends=20.0.0.2:80);)
>> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
>> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; 
>> ct_lb_mark(backends=10.0.0.2:80);)
>> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; 
>> ct_lb_mark(backends=20.0.0.2:80);)
>>   ])
>>   AT_CHECK([grep "ls_in_lb_aff_learn" S0flows | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(ls_in_lb_aff_learn ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>>   ])
>>   AS_BOX([Test LR flows])
>> @@ -9499,13 +9499,13 @@ AT_CAPTURE_FILE([R1flows])
>>   AT_CHECK([grep "lr_in_lb_aff_check" R1flows | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(lr_in_lb_aff_check ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(reg0 = ip4.dst; reg9[[16..31]] = tcp.dst; reg9[[6]] = 
>> chk_lb_aff(); next;)
>> +  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(reg9[[6]] = chk_lb_aff(); next;)
>>   ])
>>   AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
>>     table=??(lr_in_dnat         ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> ct_lb_mark(backends=10.0.0.2:80);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> ct_lb_mark(backends=20.0.0.2:80);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(ct_lb_mark(backends=10.0.0.2:80);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(ct_lb_mark(backends=20.0.0.2:80);)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && 
>> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat 
>> == 1), action=(flags.force_snat_for_lb = 1; next;)
>> @@ -9515,8 +9515,8 @@ AT_CHECK([grep "lr_in_dnat " R1flows | 
>> ovn_strip_lflows], [0], [dnl
>>   ])
>>   AT_CHECK([grep "lr_in_lb_aff_learn" R1flows | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(lr_in_lb_aff_learn ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && 
>> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && 
>> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 
>> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && 
>> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = 
>> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); 
>> /* drop */)
>>   ])
>>   AS_BOX([Test LR flows - skip_snat=true])
>> @@ -9527,9 +9527,9 @@ AT_CAPTURE_FILE([R1flows_skip_snat])
>>   AT_CHECK([grep "lr_in_dnat " R1flows_skip_snat | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(lr_in_dnat         ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] 
>> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && 
>> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat 
>> == 1), action=(flags.force_snat_for_lb = 1; next;)
>> @@ -9548,9 +9548,9 @@ AT_CAPTURE_FILE([R1flows_force_snat])
>>   AT_CHECK([grep "lr_in_dnat " R1flows_force_snat | ovn_strip_lflows], 
>> [0], [dnl
>>     table=??(lr_in_dnat         ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; 
>> force_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; 
>> force_snat);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] 
>> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80; force_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=20.0.0.2:80; force_snat);)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && 
>> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat 
>> == 1), action=(flags.force_snat_for_lb = 1; next;)
>> @@ -9568,9 +9568,9 @@ AT_CAPTURE_FILE([R1flows_force_skip_snat])
>>   AT_CHECK([grep "lr_in_dnat " R1flows_force_skip_snat | 
>> ovn_strip_lflows], [0], [dnl
>>     table=??(lr_in_dnat         ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] 
>> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && 
>> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat 
>> == 1), action=(flags.force_snat_for_lb = 1; next;)
>> @@ -9592,12 +9592,12 @@ AT_CAPTURE_FILE([R1flows_2lbs])
>>   AT_CHECK([grep "lr_in_dnat " R1flows_2lbs | ovn_strip_lflows], [0], 
>> [dnl
>>     table=??(lr_in_dnat         ), priority=0    , match=(1), 
>> action=(next;)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), 
>> action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; 
>> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; 
>> flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; 
>> force_snat);)
>> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && 
>> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; 
>> flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; 
>> force_snat);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), 
>> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] 
>> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && 
>> !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), 
>> action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.20; reg2[[0..15]] 
>> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; 
>> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=10.0.0.2:80; force_snat);)
>> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 
>> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && 
>> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; 
>> ct_lb_mark(backends=20.0.0.2:80; force_snat);)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
>>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && 
>> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
>>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est && 
>> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat 
>> == 1), action=(flags.force_snat_for_lb = 1; next;)
>> @@ -14058,10 +14058,10 @@ ovn-sbctl dump-flows s1 > s1flows
>>   AT_CAPTURE_FILE([s1flows])
>>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | 
>> grep "30.0.0.1"], [0], [dnl
>> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
>> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
>>   ])
>>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep 
>> "30.0.0.1"], [0], [dnl
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; 
>> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; 
>> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>>   ])
>>   # Associate load balancer to lr1 with DGP
>> @@ -14283,10 +14283,10 @@ ovn-sbctl dump-flows s1 > s1flows
>>   AT_CAPTURE_FILE([s1flows])
>>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | 
>> grep "30.0.0.1"], [0], [dnl
>> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
>> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
>>   ])
>>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep 
>> "30.0.0.1"], [0], [dnl
>> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; 
>> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new && 
>> ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; 
>> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
>>   ])
>>   # Associate load balancer to lr1 with DGP
>> diff --git a/tests/ovn.at b/tests/ovn.at
>> index b49a63f3e..e9144b0cd 100644
>> --- a/tests/ovn.at
>> +++ b/tests/ovn.at
>> @@ -2161,13 +2161,13 @@ reg9[[5]] = chk_ecmp_nh();
>>   # commit_lb_aff
>>   commit_lb_aff(vip = "172.16.0.123:8080", backend = "10.0.0.3:8080", 
>> proto = tcp, timeout = 30);
>> -    encodes as 
>> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
>> +    encodes as 
>> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
>>   commit_lb_aff(vip = "172.16.0.123", backend = "10.0.0.3", timeout = 
>> 30);
>>       encodes as 
>> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]])
>>   commit_lb_aff(vip = "[[::1]]:8080", backend = "[[::2]]:8080", proto 
>> = tcp, timeout = 30);
>> -    encodes as 
>> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG0[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
>> +    encodes as 
>> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
>>   # chk_lb_aff()
>>   reg9[[6]] = chk_lb_aff();
>> @@ -25576,8 +25576,8 @@ OVS_WAIT_FOR_OUTPUT(
>>     [ovn-sbctl dump-flows > sbflows
>>      ovn-sbctl dump-flows sw0 | grep ct_lb_mark | grep priority=120 | 
>> sed 's/table=..//'], 0,
>>     [dnl
>> -  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> -  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 
>> 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 
>> 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; 
>> hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
>> +  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> +  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 
>> 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 
>> 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; 
>> hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
>>   ])
>>   AT_CAPTURE_FILE([sbflows2])
>> @@ -25621,7 +25621,7 @@ AT_CHECK(
>>     [grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" sbflows3 | grep 
>> priority=120 |\
>>      ovn_strip_lflows], [0], [dnl
>>     table=??(ls_in_lb           ), priority=120  , match=(ct.new && 
>> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(drop;)
>> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 
>> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; 
>> reg2[[0..15]] = 80; ct_lb_mark;)
>>   ])
>>   AT_CAPTURE_FILE([sbflows4])
>> @@ -30627,7 +30627,7 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
>> @@ -30635,7 +30635,7 @@ NXST_FLOW reply (xid=0x8):
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
>> @@ -30654,9 +30654,9 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
>> @@ -30664,8 +30664,8 @@ NXST_FLOW reply (xid=0x8):
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
>> @@ -30687,17 +30687,17 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>   ])
>>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv4-udp
>> @@ -30711,35 +30711,35 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>   ])
>>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-tcp
>> @@ -30753,39 +30753,39 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>   ])
>>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-udp
>> @@ -30799,11 +30799,11 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30811,19 +30811,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30831,10 +30831,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>>   ])
>> @@ -30851,11 +30851,11 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30863,19 +30863,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30883,10 +30883,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>>   ])
>> @@ -30900,12 +30900,12 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30913,21 +30913,21 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30935,12 +30935,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>>   ])
>>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6
>> @@ -30953,13 +30953,13 @@ OVS_WAIT_UNTIL(
>>   )
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30967,23 +30967,23 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -30991,12 +30991,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
>>   ])
>>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
>>   ])
>> @@ -31093,7 +31093,7 @@ OVS_WAIT_UNTIL(
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>    table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>> @@ -31103,7 +31103,7 @@ NXST_FLOW reply (xid=0x8):
>>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], 
>> [dnl
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>> - table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>> + table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 
>> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
>>    table=OFTABLE_CT_SNAT_HAIRPIN, 
>> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
>>   ])
>> @@ -36078,15 +36078,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int | 
>> grep 'nat(dst=85.85.85.44:8504)' -c], [
>>   dnl Ensure hairpin flows are correct.
>>   as hv1
>>   AT_CHECK([ovs-ofctl dump-flows br-int | grep 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b01,reg2=0x10cd/0xffff,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cd/0xffff,reg4=0x2b2b2b01,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=68, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   dnl Change Chassis_Template_Var mappings
>> @@ -36137,15 +36137,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int | 
>> grep 'nat(dst=84.84.84.44:8404)' -c], [
>>   dnl Ensure hairpin flows are correct.
>>   as hv1
>>   AT_CHECK([ovs-ofctl dump-flows br-int | grep 
>> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a01,reg2=0x1069/0xffff,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> - table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1069/0xffff,reg4=0x2a2a2a01,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>> + table=OFTABLE_CHK_LB_HAIRPIN, 
>> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
>>   ])
>>   dnl Remove Chassis_Template_Variables and check that everything is
>> diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
>> index 170024a61..f7745b979 100644
>> --- a/tests/system-ovn-kmod.at
>> +++ b/tests/system-ovn-kmod.at
>> @@ -151,12 +151,12 @@ 
>> tcp,orig=(src=172.16.1.2,dst=172.16.1.100,sport=<cleared>,dport=<cleared>),reply
>>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key 
>> external_ids:name=R2))
>>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 
>> 's/load:0xc0a80[[0-9]]02/load:0xc0a80<cleared>02/'], [0], [dnl
>> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, 
>> tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 
>> actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG8[[0..15]]
>> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, 
>> tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 
>> actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG2[[0..15]]
>>   ])
>>   check_affinity_flows () {
>> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
>> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
>> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
>> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
>>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
>>   echo $?
>>   }
>> @@ -452,12 +452,12 @@ 
>> tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd
>>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key 
>> external_ids:name=R2))
>>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int 
>> table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 
>> 's/load:0xfd1[[0-9]]000000000000/load:0xfd1<cleared>000000000000/'], 
>> [0], [dnl
>> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, 
>> tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 
>> actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG8[[0..15]]
>> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, 
>> tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 
>> actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG2[[0..15]]
>>   ])
>>   check_affinity_flows () {
>> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
>> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
>> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
>> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
>> '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
>>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
>>   echo $?
>>   }
>
Xavier Simonart Jan. 28, 2025, 9:56 a.m. UTC | #3
Hi Ales, Mark

Thanks for the patch!
I am late on this patch, but I had some questions related to it.

I think that we might have some issues with upgrades.
With this patch, if we upgrade ovn-controller first, ovn-controller will
use registers such as MFF_LOG_LB_AFF_MATCH_PORT in OFTABLE_CHK_LB_AFFINITY
table, using the new value for the register
But until ovn-northd is upgraded, ovn-northd still uses old value, and lb
affinity won't work.
I did run the system test "load balancing affinity sessions", using "old"
northd (i.e. 24.09.0) and ovn-controller from main, and it fails: test was
expecting to hit one backend (thanks to lb affinity) but hit multiple
backends.

I see that you just posted
https://patchwork.ozlabs.org/project/ovn/patch/20250128094539.508298-1-amusil@redhat.com/
We will continue the conversation there.

Thanks
Xavier

On Thu, Jan 23, 2025 at 6:05 PM Mark Michelson <mmichels@redhat.com> wrote:

> On 1/22/25 16:59, Mark Michelson wrote:
> > Hi Ales,
> >
> > Acked-by: Mark Michelson <mmichels@redhat.com>
> >
> > My only suggestion would be to add a comment in northd.c above the
> > definitions for REG_LB_IPV4, REG_LB_IPV6, and REG_LB_PORT that explains
> > that on new connections, these contain the VIP[:port], and on
> > established connections, these contain the backend[:port]. Otherwise,
> > the register names are ambiguous, and the fact they are used for two
> > purposes is not clear.
> >
> > On 1/22/25 12:08, Ales Musil wrote:
> >> We were running out of space in registers. After the consolidation
> >> there are several registers are free to use once again.
> >> The consolidation is mainly done by reusing single register for LB
> >> affinity flows.
> >>
> >> Signed-off-by: Ales Musil <amusil@redhat.com>
>
> I added the comment and pushed the patch to main. Thanks Ales!
>
> >> ---
> >>   include/ovn/logical-fields.h |   7 +-
> >>   lib/actions.c                |   6 +-
> >>   northd/northd.c              | 254 +++++++++++++---------------------
> >>   tests/ovn-northd.at          | 126 ++++++++---------
> >>   tests/ovn.at                 | 258
> +++++++++++++++++------------------
> >>   tests/system-ovn-kmod.at     |  12 +-
> >>   6 files changed, 297 insertions(+), 366 deletions(-)
> >>
> >> diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
> >> index 59e4ac3da..6a87fc386 100644
> >> --- a/include/ovn/logical-fields.h
> >> +++ b/include/ovn/logical-fields.h
> >> @@ -47,7 +47,7 @@ enum ovn_controller_event {
> >>    *
> >>    * Make sure these don't overlap with the logical fields! */
> >>   #define MFF_LOG_REG0             MFF_REG0
> >> -#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG1
> >> +#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG4
> >>   #define MFF_LOG_LB_ORIG_TP_DPORT MFF_REG2
> >>   #define MFF_LOG_XXREG0           MFF_XXREG0
> >> @@ -56,9 +56,8 @@ enum ovn_controller_event {
> >>   #define MFF_N_LOG_REGS 10
> >>   #define MFF_LOG_LB_AFF_MATCH_IP4_ADDR       MFF_REG4
> >> -#define MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR    MFF_XXREG0
> >> -#define MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR    MFF_XXREG1
> >> -#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG8
> >> +#define MFF_LOG_LB_AFF_MATCH_IP6_ADDR       MFF_XXREG1
> >> +#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG2
> >>   #define MFF_LOG_CT_ORIG_NW_DST_ADDR         MFF_REG1   /*
> >> REG_ORIG_DIP_IPV4 */
> >>   #define MFF_LOG_CT_ORIG_IP6_DST_ADDR        MFF_XXREG1 /*
> >> REG_ORIG_DIP_IPV6 */
> >> diff --git a/lib/actions.c b/lib/actions.c
> >> index ea30be767..62e73b2c5 100644
> >> --- a/lib/actions.c
> >> +++ b/lib/actions.c
> >> @@ -5371,11 +5371,7 @@ encode_COMMIT_LB_AFF(const struct
> >> ovnact_commit_lb_aff *lb_aff,
> >>           imm_backend_ip = (union mf_value) {
> >>               .ipv6 =  lb_aff->backend,
> >>           };
> >> -        if (ep->is_switch) {
> >> -            ol_spec->dst.field =
> >> mf_from_id(MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR);
> >> -        } else {
> >> -            ol_spec->dst.field =
> >> mf_from_id(MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR);
> >> -        }
> >> +        ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_IP6_ADDR);
> >>       } else {
> >>           ovs_be32 ip4 = in6_addr_get_mapped_ipv4(&lb_aff->backend);
> >>           imm_backend_ip = (union mf_value) {
> >> diff --git a/northd/northd.c b/northd/northd.c
> >> index c41a7591b..2385c3b5e 100644
> >> --- a/northd/northd.c
> >> +++ b/northd/northd.c
> >> @@ -125,20 +125,12 @@ static bool vxlan_mode;
> >>   #define REGBIT_FROM_ROUTER_PORT   "reg0[18]"
> >>   #define REGBIT_IP_FRAG            "reg0[19]"
> >> -#define REG_ORIG_DIP_IPV4         "reg1"
> >> -#define REG_ORIG_DIP_IPV6         "xxreg1"
> >> -#define REG_ORIG_TP_DPORT         "reg2[0..15]"
> >> -
> >> -/* Register used to store backend ipv6 address
> >> - * for load balancer affinity. */
> >> -#define REG_LB_L2_AFF_BACKEND_IP6 "xxreg0"
> >> -
> >>   /* Register definitions for switches and routers. */
> >> -/* Register used to store backend ipv4 address
> >> - * for load balancer affinity. */
> >> -#define REG_LB_AFF_BACKEND_IP4  "reg4"
> >> -#define REG_LB_AFF_MATCH_PORT   "reg8[0..15]"
> >> +/* Register used for LB. */
> >> +#define REG_LB_IPV4 "reg4"
> >> +#define REG_LB_IPV6 "xxreg1"
> >> +#define REG_LB_PORT "reg2[0..15]"
> >>   /* Registers for ACL evaluation */
> >>   #define REGBIT_ACL_VERDICT_ALLOW "reg8[16]"
> >> @@ -192,12 +184,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> >>   #define REG_DHCP_RELAY_DIP_IPV4 "reg2"
> >>   #define REG_ROUTE_TABLE_ID "reg7"
> >> -/* Register used to store backend ipv6 address
> >> - * for load balancer affinity. */
> >> -#define REG_LB_L3_AFF_BACKEND_IP6  "xxreg1"
> >> -
> >> -#define REG_ORIG_TP_DPORT_ROUTER   "reg9[16..31]"
> >> -
> >>   /* Registers used for pasing observability information for switches:
> >>    * domain and point ID. */
> >>   #define REG_OBS_POINT_ID_NEW "reg3"
> >> @@ -227,25 +213,27 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> >>    * |    |     REGBIT_{HAIRPIN/HAIRPIN_REPLY}           |
> >> |                                   |
> >>    * |    | REGBIT_ACL_HINT_{ALLOW_NEW/ALLOW/DROP/BLOCK} |
> >> |                                   |
> >>    * |    |     REGBIT_ACL_{LABEL/STATELESS}             | X
> >> |                                   |
> >> - * +----+----------------------------------------------+ X |
> >> LB_L2_AFF_BACKEND_IP6       |
> >> - * | R1 |         ORIG_DIP_IPV4 (>= IN_PRE_STATEFUL)   | R |
> >> (>= IN_LB_AFF_CHECK &&     |
> >> - * +----+----------------------------------------------+ E |
> >> <= IN_LB_AFF_LEARN)       |
> >> - * | R2 |         ORIG_TP_DPORT (>= IN_PRE_STATEFUL)   | G
> >> |                                   |
> >> - * +----+----------------------------------------------+ 0
> >> |                                   |
> >> + * +----+----------------------------------------------+ X
> >> |                                   |
> >> + * | R1 |                   UNUSED                     | R
> >> |                                   |
> >> + * +----+----------------------------------------------+ E
> >> |                                   |
> >> + * | R2 |                 REG_LB_PORT                  | G
> >> |                                   |
> >> + * |    |  (>= IN_PRE_STATEFUL && <= IN_LB_AFF_LEARN)  | 0
> >> |                                   |
> >> + * +----+----------------------------------------------+
> >> |                                   |
> >>    * | R3 |             OBS_POINT_ID_NEW                 |
> >> |                                   |
> >>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |
> >> |                                   |
> >>    *
> >>
> +----+----------------------------------------------+---+-----------------------------------+
> >> - * | R4 |            REG_LB_AFF_BACKEND_IP4            |
> >> |                                   |
> >> - * +----+----------------------------------------------+ X
> >> |                                   |
> >> - * | R5 |                   UNUSED                     | X |
> >> ORIG_DIP_IPV6(>= IN_PRE_STATEFUL) |
> >> - * +----+----------------------------------------------+ R
> >> |                                   |
> >> - * | R6 |                   UNUSED                     | E
> >> |                                   |
> >> - * +----+----------------------------------------------+ G
> >> |                                   |
> >> - * | R7 |                   UNUSED                     | 1
> >> |                                   |
> >> + * | R4 |                 REG_LB_IPV4                  |
> >> |                                   |
> >> + * | R4 |    (>= IN_PRE_STATEFUL && <= IN_HAIRPIN)     | X
> >> |                                   |
> >> + * +----+----------------------------------------------+ X
> >> |           REG_LB_IPV6             |
> >> + * | R5 |                   UNUSED                     | R |      (>=
> >> IN_PRE_STATEFUL &&       |
> >> + * +----+----------------------------------------------+ E |       <=
> >> IN_HAIRPIN)              |
> >> + * | R6 |                   UNUSED                     | G
> >> |                                   |
> >> + * +----+----------------------------------------------+ 1
> >> |                                   |
> >> + * | R7 |                   UNUSED                     |
> >> |                                   |
> >>    *
> >>
> +----+----------------------------------------------+---+-----------------------------------+
> >> - * | R8 |              LB_AFF_MATCH_PORT               | X |
> >> REG_OBS_COLLECTOR_ID_NEW     |
> >> - * |    |  (>= IN_LB_AFF_CHECK && <= IN_LB_AFF_LEARN)  | R |
> >> REG_OBS_COLLECTOR_ID_EST     |
> >> - * |    |                                              | E |  (>=
> >> ACL_EVAL* && <= ACL_ACTION*) |
> >> + * | R8 |           REG_OBS_COLLECTOR_ID_NEW           | X
> >> |                                   |
> >> + * |    |           REG_OBS_COLLECTOR_ID_EST           | R
> >> |                                   |
> >> + * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       | E
> >> |                                   |
> >>    * +----+----------------------------------------------+ G
> >> +-----------------------------------+
> >>    * | R9 |              OBS_POINT_ID_EST                | 4
> >> |                                   |
> >>    * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |
> >> |                                   |
> >> @@ -256,23 +244,26 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> >>    * | R0  | REGBIT_ND_RA_OPTS_RESULT  |   |                 |
> >> |                                    |
> >>    * |     |   (= IN_ND_RA_OPTIONS)    | X |                 |
> >> |                                    |
> >>    * |     |      NEXT_HOP_IPV4        | R |                 |
> >> |                                    |
> >> - * |     |      (>= IP_INPUT)        | E | INPORT_ETH_ADDR | X
> >> |                                    |
> >> + * |     |   (>= IN_IP_ROUTING)      | E | INPORT_ETH_ADDR | X
> >> |                                    |
> >>    * +-----+---------------------------+ G |   (< IP_INPUT)  | X
> >> |                                    |
> >>    * | R1  |        UNUSED             | 0 |                 | R
> >> |                                    |
> >> - * |     |                           |   |                 | E |
> >> NEXT_HOP_IPV6 (>= DEFRAG )     |
> >> + * |     |                           |   |                 | E |
> >> NEXT_HOP_IPV6 (>= IN_IP_ROUTING)  |
> >>    * +-----+---------------------------+---+-----------------+ G
> >> |                                    |
> >> - * | R2     REG_DHCP_RELAY_DIP_IPV4  | X |                 | 0
> >> |                                    |
> >> - * |     |                           | R |                 |
> >> |                                    |
> >> - * +-----+---------------------------+ E |     UNUSED      |
> >> |                                    |
> >> - * | R3  |        UNUSED             | G |                 |
> >> |                                    |
> >> - * |     |                           | 1 |                 |
> >> |                                    |
> >> + * | R2  |  REG_DHCP_RELAY_DIP_IPV4  |   |                 | 0
> >> |                                    |
> >> + * |     |       REG_LB_PORT         | X |                 | 0
> >> |                                    |
> >> + * |     | (>= IN_LB_AFF_CHECK       | R |                 |
> >> |                                    |
> >> + * |     |  <= IN_LB_AFF_LEARN)      | E |                 |
> >> |                                    |
> >> + * +-----+---------------------------+ G |     UNUSED      |
> >> |                                    |
> >> + * | R3  |        UNUSED             | 1 |                 |
> >> |                                    |
> >> + * |     |                           |   |                 |
> >> |                                    |
> >>    *
> >>
> +-----+---------------------------+---+-----------------+---+------------------------------------+
> >> - * | R4  |  REG_LB_AFF_BACKEND_IP4   | X |                 |
> >> |                                    |
> >> - * |     |                           | R |                 |
> >> |                                    |
> >> + * | R4  |        REG_LB_IPV4        | X |                 |
> >> |                                    |
> >> + * |     |  (>= IN_LB_AFF_CHECK &&   | R |                 |
> >> |                                    |
> >> + * |     |   <= IN_LB_AFF_LEARN)     | R |                 |
> >> |                                    |
> >>    * +-----+---------------------------+ E |     UNUSED      | X
> >> |                                    |
> >> - * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X
> >> |                                    |
> >> - * |     |      (>= IP_INPUT)        | 2 |                 | R
> >> |        LB_L3_AFF_BACKEND_IP6       |
> >> - * +-----+---------------------------+---+-----------------+ E
> >> |           (<= IN_DNAT)             |
> >> + * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X
> >> |            REG_LB_IPV6             |
> >> + * |     |      (>= IP_INPUT)        | 2 |                 | R
> >> |        (>= IN_LB_AFF_CHECK &&      |
> >> + * +-----+---------------------------+---+-----------------+ E
> >> |         <= IN_LB_AFF_LEARN)        |
> >>    * | R6  |        UNUSED             | X |                 | G
> >> |                                    |
> >>    * |     |                           | R |                 | 1
> >> |                                    |
> >>    * +-----+---------------------------+ E |     UNUSED      |
> >> |                                    |
> >> @@ -282,7 +273,7 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> >>    *
> >>
> +-----+---------------------------+---+-----------------+---+------------------------------------+
> >>    * | R8  |     ECMP_GROUP_ID         |   |                 |
> >>    * |     |     ECMP_MEMBER_ID        |   |                 |
> >> - * |     |    LB_AFF_MATCH_PORT      | X |                 |
> >> + * |     |                           | X |                 |
> >>    * +-----+---------------------------+ R |                 |
> >>    * |     | REGBIT_{                  | E |                 |
> >>    * |     |   EGRESS_LOOPBACK/        | G |     UNUSED      |
> >> @@ -292,9 +283,6 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
> >>    * |     |REGBIT_DHCP_RELAY_REQ_CHK/ |   |                 |
> >>    * |     |REGBIT_DHCP_RELAY_RESP_CHK |   |                 |
> >>    * |     |REGBIT_NEXTHOP_IS_IPV4}    |   |                 |
> >> - * |     |                           |   |                 |
> >> - * |     | REG_ORIG_TP_DPORT_ROUTER  |   |                 |
> >> - * |     |                           |   |                 |
> >>    * +-----+---------------------------+---+-----------------+
> >>    *
> >>    */
> >> @@ -3621,6 +3609,16 @@ build_lb_vip_actions(const struct ovn_northd_lb
> >> *lb,
> >>       bool reject = !lb_vip->n_backends && lb_vip->empty_backend_rej;
> >>       bool drop = !lb_vip->n_backends && !lb_vip->empty_backend_rej;
> >> +    if (ls_dp || lb->affinity_timeout) {
> >> +        const char *ip_reg =
> >> +            lb_vip->address_family == AF_INET ? REG_LB_IPV4 :
> >> REG_LB_IPV6;
> >> +        ds_put_format(action, "%s = %s; ", ip_reg, lb_vip->vip_str);
> >> +
> >> +        if (lb_vip->port_str) {
> >> +            ds_put_format(action, REG_LB_PORT" = %s; ",
> >> lb_vip->port_str);
> >> +        }
> >> +    }
> >> +
> >>       if (lb_vip_nb->lb_health_check) {
> >>           ds_put_cstr(action, "ct_lb_mark(backends=");
> >> @@ -7867,29 +7865,19 @@ build_lb_rules_pre_stateful(struct lflow_table
> >> *lflows,
> >>            */
> >>           if (lb->vips[i].address_family == AF_INET) {
> >>               ip_match = "ip4";
> >> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
> >> +            ds_put_format(action, REG_LB_IPV4 " = %s; ",
> >>                             lb_vip->vip_str);
> >>           } else {
> >>               ip_match = "ip6";
> >> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
> >> +            ds_put_format(action, REG_LB_IPV6 " = %s; ",
> >>                             lb_vip->vip_str);
> >>           }
> >> -        const char *proto = NULL;
> >>           if (lb_vip->port_str) {
> >> -            proto = "tcp";
> >> -            if (lb->nlb->protocol) {
> >> -                if (!strcmp(lb->nlb->protocol, "udp")) {
> >> -                    proto = "udp";
> >> -                } else if (!strcmp(lb->nlb->protocol, "sctp")) {
> >> -                    proto = "sctp";
> >> -                }
> >> -            }
> >> -
> >>               /* Store the original destination port to be used when
> >> generating
> >>                * hairpin flows.
> >>                */
> >> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
> >> +            ds_put_format(action, REG_LB_PORT " = %s; ",
> >>                             lb_vip->port_str);
> >>           }
> >>           ds_put_cstr(action, "ct_lb_mark;");
> >> @@ -7897,7 +7885,8 @@ build_lb_rules_pre_stateful(struct lflow_table
> >> *lflows,
> >>           ds_put_format(match, REGBIT_CONNTRACK_NAT" == 1 && %s.dst ==
> >> %s",
> >>                         ip_match, lb_vip->vip_str);
> >>           if (lb_vip->port_str) {
> >> -            ds_put_format(match, " && %s.dst == %s", proto,
> >> lb_vip->port_str);
> >> +            ds_put_format(match, " && %s.dst == %s", lb->proto,
> >> +                          lb_vip->port_str);
> >>           }
> >>           ovn_lflow_add_with_dp_group(
> >> @@ -7913,34 +7902,30 @@ build_lb_rules_pre_stateful(struct lflow_table
> >> *lflows,
> >>    * - load balancing affinity check:
> >>    *   table=lr_in_lb_aff_check, priority=100
> >>    *      match=(new_lb_match)
> >> - *      action=(REG_NEXT_HOP_IPV4 = ip4.dst;
> >> - *              REG_ORIG_TP_DPORT_ROUTER = tcp.dst;
> >> - *              REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
> >> + *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
> >>    *
> >>    * - load balancing:
> >>    *   table=lr_in_dnat, priority=150
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> >> - *             && REG_LB_AFF_BACKEND_IP4 == B1 &&
> >> REG_LB_AFF_MATCH_PORT == BP1)
> >> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
> >> - *              ct_lb_mark(backends=B1:BP1; ct_flag);)
> >> + *             && REG_LB_IPV4 == B1 && REG_LB_PORT == BP1)
> >> + *      action=(lb_action; ct_lb_mark(backends=B1:BP1; ct_flag);)
> >>    *   table=lr_in_dnat, priority=150
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> >> - *             && REG_LB_AFF_BACKEND_IP4 == B2 &&
> >> REG_LB_AFF_MATCH_PORT == BP2)
> >> - *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
> >> - *              ct_lb_mark(backends=B2:BP2; ct_flag);)
> >> + *             && REG_LB_IPV4 == B2 && REG_LB_PORT == BP2)
> >> + *      action=(lb_action; ct_lb_mark(backends=B2:BP2; ct_flag);)
> >>    *
> >>    * - load balancing affinity learn:
> >>    *   table=lr_in_lb_aff_learn, priority=100
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
> >>    *             && ct.new && ip4
> >> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER
> >> = VP
> >> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
> >>    *             && ip4.dst == B1 && tcp.dst == BP1)
> >>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
> >>    *                            proto = tcp, timeout = T));
> >>    *   table=lr_in_lb_aff_learn, priority=100
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
> >>    *             && ct.new && ip4
> >> - *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER
> >> = VP
> >> + *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
> >>    *             && ip4.dst == B2 && tcp.dst == BP2)
> >>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
> >>    *                            proto = tcp, timeout = T));
> >> @@ -7963,14 +7948,11 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>       struct ds aff_action_learn = DS_EMPTY_INITIALIZER;
> >>       struct ds aff_match = DS_EMPTY_INITIALIZER;
> >>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
> >> -    struct ds aff_check_action = DS_EMPTY_INITIALIZER;
> >>       bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
> >>       const char *ip_match = ipv6 ? "ip6" : "ip4";
> >> -    const char *reg_vip = ipv6 ? REG_NEXT_HOP_IPV6 : REG_NEXT_HOP_IPV4;
> >> -    const char *reg_backend =
> >> -        ipv6 ? REG_LB_L3_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
> >> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
> >>       const char *ct_flag = NULL;
> >>       if (lb_action && !strcmp(lb_action, "flags.skip_snat_for_lb = 1;
> >> ")) {
> >>           ct_flag = "; skip_snat";
> >> @@ -7980,22 +7962,12 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>       }
> >>       /* Create affinity check flow. */
> >> -    ds_put_format(&aff_check_action, "%s = %s.dst; ", reg_vip,
> >> ip_match);
> >> -
> >> -    if (lb_vip->port_str) {
> >> -        ds_put_format(&aff_check_action, REG_ORIG_TP_DPORT_ROUTER" =
> >> %s.dst; ",
> >> -                      lb->proto);
> >> -    }
> >> -    ds_put_cstr(&aff_check_action, REGBIT_KNOWN_LB_SESSION
> >> -                " = chk_lb_aff(); next;");
> >> -
> >>       ovn_lflow_add_with_dp_group(
> >>           lflows, dp_bitmap, ods_size(lr_datapaths),
> >> S_ROUTER_IN_LB_AFF_CHECK,
> >> -        100, new_lb_match, ds_cstr(&aff_check_action),
> >> &lb->nlb->header_,
> >> -        lflow_ref);
> >> +        100, new_lb_match, REGBIT_KNOWN_LB_SESSION" = chk_lb_aff();
> >> next;",
> >> +        &lb->nlb->header_, lflow_ref);
> >>       /* Prepare common part of affinity LB and affinity learn action.
> */
> >> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
> >>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
> >>       if (lb_vip->port_str) {
> >> @@ -8015,19 +7987,19 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>       if (lb_vip->port_str) {
> >>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" ==
> >> 0 && "
> >>                         "ct.new && %s && %s == %s && "
> >> -                      REG_ORIG_TP_DPORT_ROUTER" == %s && "
> >> -                      "%s.dst == ", ip_match, reg_vip, lb_vip->vip_str,
> >> +                      REG_LB_PORT " == %s && "
> >> +                      "%s.dst == ", ip_match, reg_ip, lb_vip->vip_str,
> >>                         lb_vip->port_str, ip_match);
> >>       } else {
> >>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" ==
> >> 0 && "
> >>                         "ct.new && %s && %s == %s && %s.dst == ",
> >> ip_match,
> >> -                      reg_vip, lb_vip->vip_str, ip_match);
> >> +                      reg_ip, lb_vip->vip_str, ip_match);
> >>       }
> >>       /* Prepare common part of affinity match. */
> >>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
> >>                     "ct.new && %s.dst == %s && %s == ", ip_match,
> >> -                  lb_vip->vip_str, reg_backend);
> >> +                  lb_vip->vip_str, reg_ip);
> >>       /* Store the common part length. */
> >>       size_t aff_action_len = aff_action.length;
> >> @@ -8050,7 +8022,7 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
> >>                             lb->proto, backend->port);
> >> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" ==
> >> %d",
> >> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
> >>                             backend->port);
> >>           } else {
> >>               ds_put_cstr(&aff_action, backend->ip_str);
> >> @@ -8094,7 +8066,6 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>       ds_destroy(&aff_action_learn);
> >>       ds_destroy(&aff_match);
> >>       ds_destroy(&aff_match_learn);
> >> -    ds_destroy(&aff_check_action);
> >>   }
> >>   /* Builds the logical switch flows related to load balancer affinity.
> >> @@ -8102,35 +8073,33 @@ build_lb_affinity_lr_flows(struct lflow_table
> >> *lflows,
> >>    * affinity timeout set to T, it generates the following logical
> flows:
> >>    * - load balancing affinity check:
> >>    *   table=ls_in_lb_aff_check, priority=100
> >> - *      match=(ct.new && ip4
> >> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP)
> >> + *      match=(ct.new && ip4 && ip4.dst == V && PROTO && PROTO.dst ==
> >> VP)
> >>    *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
> >>    *
> >>    * - load balancing:
> >>    *   table=ls_in_lb, priority=150
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> >> - *             && REG_LB_AFF_BACKEND_IP4 == B1 &&
> >> REG_LB_AFF_MATCH_PORT == BP1)
> >> - *      action=(REG_ORIG_DIP_IPV4 = V; REG_ORIG_TP_DPORT = VP;
> >> + *             && PROTO && PROTO.dst == VP)
> >> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
> >>    *              ct_lb_mark(backends=B1:BP1);)
> >>    *   table=ls_in_lb, priority=150
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
> >> - *             && REG_LB_AFF_BACKEND_IP4 == B2 &&
> >> REG_LB_AFF_MATCH_PORT == BP2)
> >> - *      action=(REG_ORIG_DIP_IPV4 = V;
> >> - *              REG_ORIG_TP_DPORT = VP;
> >> + *             && PROTO && PROTO.dst == VP)
> >> + *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
> >>    *              ct_lb_mark(backends=B1:BP2);)
> >>    *
> >>    * - load balancing affinity learn:
> >>    *   table=ls_in_lb_aff_learn, priority=100
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
> >>    *             && ct.new && ip4
> >> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
> >> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
> >>    *             && ip4.dst == B1 && tcp.dst == BP1)
> >>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
> >>    *                            proto = tcp, timeout = T));
> >>    *   table=ls_in_lb_aff_learn, priority=100
> >>    *      match=(REGBIT_KNOWN_LB_SESSION == 0
> >>    *             && ct.new && ip4
> >> - *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
> >> + *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
> >>    *             && ip4.dst == B2 && tcp.dst == BP2)
> >>    *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
> >>    *                            proto = tcp, timeout = T));
> >> @@ -8149,19 +8118,16 @@ build_lb_affinity_ls_flows(struct lflow_table
> >> *lflows,
> >>       const struct ovn_northd_lb *lb = lb_dps->lb;
> >>       struct ds new_lb_match = DS_EMPTY_INITIALIZER;
> >> -    if (IN6_IS_ADDR_V4MAPPED(&lb_vip->vip)) {
> >> -        ds_put_format(&new_lb_match,
> >> -                      "ct.new && ip4 && "REG_ORIG_DIP_IPV4 " == %s",
> >> -                      lb_vip->vip_str);
> >> -    } else {
> >> -        ds_put_format(&new_lb_match,
> >> -                      "ct.new && ip6 && "REG_ORIG_DIP_IPV6 " == %s",
> >> -                      lb_vip->vip_str);
> >> -    }
> >> +    bool ipv6 = lb_vip->address_family == AF_INET6;
> >> +    const char *ip_match = ipv6 ? "ip6" : "ip4";
> >> +    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
> >> +
> >> +    ds_put_format(&new_lb_match, "ct.new && %s && %s.dst == %s",
> >> +                  ip_match, ip_match, lb_vip->vip_str);
> >>       if (lb_vip->port_str) {
> >> -        ds_put_format(&new_lb_match, " && "REG_ORIG_TP_DPORT " == %s",
> >> -                      lb_vip->port_str);
> >> +        ds_put_format(&new_lb_match, " && %s && %s.dst == %s",
> >> +                      lb->proto, lb->proto, lb_vip->port_str);
> >>       }
> >>       static char *aff_check = REGBIT_KNOWN_LB_SESSION" =
> >> chk_lb_aff(); next;";
> >> @@ -8177,19 +8143,12 @@ build_lb_affinity_ls_flows(struct lflow_table
> >> *lflows,
> >>       struct ds aff_match = DS_EMPTY_INITIALIZER;
> >>       struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
> >> -    bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
> >> -    const char *ip_match = ipv6 ? "ip6" : "ip4";
> >> -
> >> -    const char *reg_vip = ipv6 ? REG_ORIG_DIP_IPV6 : REG_ORIG_DIP_IPV4;
> >> -    const char *reg_backend =
> >> -        ipv6 ? REG_LB_L2_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
> >> -
> >>       /* Prepare common part of affinity LB and affinity learn action.
> */
> >> -    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
> >> +    ds_put_format(&aff_action, "%s = %s; ", reg_ip, lb_vip->vip_str);
> >>       ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
> >>       if (lb_vip->port_str) {
> >> -        ds_put_format(&aff_action, REG_ORIG_TP_DPORT" = %s; ",
> >> +        ds_put_format(&aff_action, REG_LB_PORT" = %s; ",
> >>                         lb_vip->port_str);
> >>           ds_put_format(&aff_action_learn, ipv6 ? "[%s]:%s" : "%s:%s",
> >>                         lb_vip->vip_str, lb_vip->port_str);
> >> @@ -8204,19 +8163,19 @@ build_lb_affinity_ls_flows(struct lflow_table
> >> *lflows,
> >>       if (lb_vip->port_str) {
> >>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" ==
> >> 0 && "
> >>                         "ct.new && %s && %s == %s && "
> >> -                      REG_ORIG_TP_DPORT" == %s && %s.dst == ",
> >> -                      ip_match, reg_vip, lb_vip->vip_str,
> >> +                      REG_LB_PORT" == %s && %s.dst == ",
> >> +                      ip_match, reg_ip, lb_vip->vip_str,
> >>                         lb_vip->port_str, ip_match);
> >>       } else {
> >>           ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" ==
> >> 0 && "
> >>                         "ct.new && %s && %s == %s && %s.dst == ",
> >> -                      ip_match, reg_vip, lb_vip->vip_str, ip_match);
> >> +                      ip_match, reg_ip, lb_vip->vip_str, ip_match);
> >>       }
> >>       /* Prepare common part of affinity match. */
> >>       ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
> >>                     "ct.new && %s.dst == %s && %s == ", ip_match,
> >> -                  lb_vip->vip_str, reg_backend);
> >> +                  lb_vip->vip_str, reg_ip);
> >>       /* Store the common part length. */
> >>       size_t aff_action_len = aff_action.length;
> >> @@ -8238,7 +8197,7 @@ build_lb_affinity_ls_flows(struct lflow_table
> >> *lflows,
> >>               ds_put_format(&aff_match_learn, " && %s.dst == %d",
> >>                             lb->proto, backend->port);
> >> -            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" ==
> >> %d",
> >> +            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
> >>                             backend->port);
> >>           } else {
> >>               ds_put_cstr(&aff_action, backend->ip_str);
> >> @@ -8315,33 +8274,10 @@ build_lb_rules(struct lflow_table *lflows,
> >> struct ovn_lb_datapaths *lb_dps,
> >>       for (size_t i = 0; i < lb->n_vips; i++) {
> >>           struct ovn_lb_vip *lb_vip = &lb->vips[i];
> >>           struct ovn_northd_lb_vip *lb_vip_nb = &lb->vips_nb[i];
> >> -        const char *ip_match = NULL;
> >> +        const char *ip_match =
> >> +            lb_vip->address_family == AF_INET ? "ip4" : "ip6";
> >>           ds_clear(action);
> >> -
> >> -        /* Store the original destination IP to be used when generating
> >> -         * hairpin flows.
> >> -         * If the packet is fragmented, then the flow which saves the
> >> -         * original destination IP (and port) in the
> >> "ls_in_pre_stateful"
> >> -         * stage will not be hit.
> >> -         */
> >> -        if (lb_vip->address_family == AF_INET) {
> >> -            ip_match = "ip4";
> >> -            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
> >> -                          lb_vip->vip_str);
> >> -        } else {
> >> -            ip_match = "ip6";
> >> -            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
> >> -                          lb_vip->vip_str);
> >> -        }
> >> -
> >> -        if (lb_vip->port_str) {
> >> -            /* Store the original destination port to be used when
> >> generating
> >> -             * hairpin flows.
> >> -             */
> >> -            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
> >> -                          lb_vip->port_str);
> >> -        }
> >>           ds_clear(match);
> >>           /* New connections in Ingress table. */
> >> @@ -8489,13 +8425,13 @@ build_lb_hairpin(const struct
> >> ls_stateful_record *ls_stateful_rec,
> >>            * */
> >>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
> >>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 &&
> >> ip4",
> >> -                      REG_ORIG_DIP_IPV4 " = ct_nw_dst(); "
> >> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
> >> +                      REG_LB_IPV4 " = ct_nw_dst(); "
> >> +                      REG_LB_PORT " = ct_tp_dst(); next;",
> >>                         lflow_ref);
> >>           ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
> >>                         "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 &&
> >> ip6",
> >> -                      REG_ORIG_DIP_IPV6 " = ct_ip6_dst(); "
> >> -                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
> >> +                      REG_LB_IPV6 " = ct_ip6_dst(); "
> >> +                      REG_LB_PORT " = ct_tp_dst(); next;",
> >>                         lflow_ref);
> >>           /* Set REGBIT_HAIRPIN in the original direction and
> >> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> >> index edfd5764b..2b1791de0 100644
> >> --- a/tests/ovn-northd.at
> >> +++ b/tests/ovn-northd.at
> >> @@ -1425,7 +1425,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
> >>   AT_CAPTURE_FILE([sbflows])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   # disabled LSPs should not be a backend of Load Balancer
> >> @@ -1434,7 +1434,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 disabled
> >>   AT_CAPTURE_FILE([sbflows])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
> >>   ])
> >>   wait_row_count Service_Monitor 1
> >> @@ -1443,7 +1443,7 @@ check ovn-nbctl lsp-set-enabled sw0-p1 enabled
> >>   AT_CAPTURE_FILE([sbflows])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   wait_row_count Service_Monitor 2
> >> @@ -1454,7 +1454,7 @@ wait_row_count Service_Monitor 0
> >>   AT_CAPTURE_FILE([sbflows2])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows2 | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], [0],
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Create the Load_Balancer_Health_Check again.])
> >> @@ -1466,7 +1466,7 @@ check ovn-nbctl --wait=sb sync
> >>   ovn-sbctl dump-flows sw0 | grep backends | grep priority=120 >
> >> lflows.txt
> >>   AT_CHECK([cat lflows.txt | ovn_strip_lflows], [0], [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Get the uuid of both the service_monitor])
> >> @@ -1476,7 +1476,7 @@ sm_sw1_p1=$(fetch_column Service_Monitor _uuid
> >> logical_port=sw1-p1)
> >>   AT_CAPTURE_FILE([sbflows3])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows 3 | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], [0],
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Set the service monitor for sw1-p1 to offline])
> >> @@ -1487,7 +1487,7 @@ check ovn-nbctl --wait=sb sync
> >>   AT_CAPTURE_FILE([sbflows4])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows4 | grep
> >> 'priority=120.*backends' | ovn_strip_lflows], [0],
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Set the service monitor for sw0-p1 to offline])
> >> @@ -1516,7 +1516,7 @@ check ovn-nbctl --wait=sb sync
> >>   AT_CAPTURE_FILE([sbflows7])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows7 | grep backends | grep
> >> priority=120 | ovn_strip_lflows], 0,
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Set the service monitor for sw1-p1 to error])
> >> @@ -1527,7 +1527,7 @@ check ovn-nbctl --wait=sb sync
> >>   ovn-sbctl dump-flows sw0 | grep "ip4.dst == 10.0.0.10 && tcp.dst ==
> >> 80" \
> >>   | grep priority=120 > lflows.txt
> >>   AT_CHECK([cat lflows.txt | grep ls_in_lb | ovn_strip_lflows], [0],
> [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Add one more vip to lb1])
> >> @@ -1553,8 +1553,8 @@ AT_CAPTURE_FILE([sbflows9])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows9 | grep backends | grep
> >> priority=120 | ovn_strip_lflows],
> >>     0,
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
> >>   ])
> >>   AS_BOX([Set the service monitor for sw1-p1 to online])
> >> @@ -1567,8 +1567,8 @@ AT_CAPTURE_FILE([sbflows10])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw0 | tee sbflows10 | grep backends | grep
> >> priority=120 | ovn_strip_lflows],
> >>     0,
> >> -[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> >> +[  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Associate lb1 to sw1])
> >> @@ -1577,8 +1577,8 @@ AT_CAPTURE_FILE([sbflows11])
> >>   OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows sw1 | tee sbflows11 | grep backends | grep
> >> priority=120 | ovn_strip_lflows],
> >>     0, [dnl
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40;
> >> reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
> >>   ])
> >>   AS_BOX([Now create lb2 same as lb1 but udp protocol.])
> >> @@ -4666,16 +4666,16 @@ check_stateful_flows() {
> >>     table=??(ls_in_pre_stateful ), priority=100  , match=(reg0[[0]] ==
> >> 1), action=(ct_next;)
> >>     table=??(ls_in_pre_stateful ), priority=110  , match=(reg0[[2]] ==
> >> 1), action=(ct_lb_mark;)
> >>     table=??(ls_in_pre_stateful ), priority=115  , match=(reg0[[2]] ==
> >> 1 && ip.is_frag), action=(reg0[[19]] = 1; ct_lb_mark;)
> >> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >>   ])
> >>       AT_CHECK([grep "ls_in_lb " sw0flows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
> >>   ])
> >>       AT_CHECK([grep "ls_in_stateful" sw0flows | ovn_strip_lflows],
> >> [0], [dnl
> >> @@ -4780,7 +4780,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
> >>   AT_CHECK([ovn-sbctl dump-flows sw0 | grep "ls_in_lb " |
> >> ovn_strip_lflows ], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.20), action=(drop;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>   ])
> >> @@ -7842,8 +7842,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e
> >> "ls_in_acl_hint" lsflows | ovn_strip_lflo
> >>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>   ])
> >> @@ -7899,8 +7899,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e
> >> "ls_in_acl_hint" lsflows | ovn_strip_lflo
> >>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>   ])
> >> @@ -7956,8 +7956,8 @@ AT_CHECK([grep -e "ls_in_acl.*eval" -e
> >> "ls_in_acl_hint" lsflows | ovn_strip_lflo
> >>   AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2;
> >> ct_lb_mark(backends=10.0.0.10);)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>   ])
> >> @@ -9345,13 +9345,13 @@ AT_CAPTURE_FILE([S1flows])
> >>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 =
> >> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 =
> >> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> >>   ])
> >>   AT_CHECK([grep "ls_in_lb " S1flows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 =
> >> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 =
> >> 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
> >>   ])
> >>   ovn-sbctl get datapath S0 _uuid > dp_uuids
> >> @@ -9477,20 +9477,20 @@ AT_CAPTURE_FILE([S0flows])
> >>   AT_CHECK([grep "ls_in_lb_aff_check" S0flows | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(ls_in_lb_aff_check ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4
> >> && reg1 == 172.16.0.10 && reg2[[0..15]] == 80), action=(reg9[[6]] =
> >> chk_lb_aff(); next;)
> >> +  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4
> >> && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]]
> >> = chk_lb_aff(); next;)
> >>   ])
> >>   AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >>     table=??(ls_in_lb           ), priority=110  , match=(ct.trk &&
> >> !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst();
> >> reg2[[0..15]] = ct_tp_dst(); next;)
> >> -  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> >> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80;
> >> ct_lb_mark(backends=10.0.0.2:80);)
> >> -  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80;
> >> ct_lb_mark(backends=20.0.0.2:80);)
> >> +  table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> >> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80;
> >> ct_lb_mark(backends=10.0.0.2:80);)
> >> +  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80;
> >> ct_lb_mark(backends=20.0.0.2:80);)
> >>   ])
> >>   AT_CHECK([grep "ls_in_lb_aff_learn" S0flows | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(ls_in_lb_aff_learn ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> -  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> +  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >>   ])
> >>   AS_BOX([Test LR flows])
> >> @@ -9499,13 +9499,13 @@ AT_CAPTURE_FILE([R1flows])
> >>   AT_CHECK([grep "lr_in_lb_aff_check" R1flows | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(lr_in_lb_aff_check ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(reg0 = ip4.dst; reg9[[16..31]] = tcp.dst; reg9[[6]] =
> >> chk_lb_aff(); next;)
> >> +  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(reg9[[6]] = chk_lb_aff(); next;)
> >>   ])
> >>   AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
> >>     table=??(lr_in_dnat         ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> ct_lb_mark(backends=10.0.0.2:80);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> ct_lb_mark(backends=20.0.0.2:80);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(ct_lb_mark(backends=10.0.0.2:80);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(ct_lb_mark(backends=20.0.0.2:80);)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel &&
> >> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
> >>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat
> >> == 1), action=(flags.force_snat_for_lb = 1; next;)
> >> @@ -9515,8 +9515,8 @@ AT_CHECK([grep "lr_in_dnat " R1flows |
> >> ovn_strip_lflows], [0], [dnl
> >>   ])
> >>   AT_CHECK([grep "lr_in_lb_aff_learn" R1flows | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(lr_in_lb_aff_learn ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 &&
> >> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> -  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 &&
> >> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >> +  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] ==
> >> 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 &&
> >> ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip =
> >> "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60);
> >> /* drop */)
> >>   ])
> >>   AS_BOX([Test LR flows - skip_snat=true])
> >> @@ -9527,9 +9527,9 @@ AT_CAPTURE_FILE([R1flows_skip_snat])
> >>   AT_CHECK([grep "lr_in_dnat " R1flows_skip_snat | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(lr_in_dnat         ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80;
> skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80;
> skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]]
> >> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel &&
> >> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
> >>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat
> >> == 1), action=(flags.force_snat_for_lb = 1; next;)
> >> @@ -9548,9 +9548,9 @@ AT_CAPTURE_FILE([R1flows_force_snat])
> >>   AT_CHECK([grep "lr_in_dnat " R1flows_force_snat | ovn_strip_lflows],
> >> [0], [dnl
> >>     table=??(lr_in_dnat         ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80;
> >> force_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80;
> >> force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]]
> >> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=20.0.0.2:80; force_snat);)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel &&
> >> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
> >>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat
> >> == 1), action=(flags.force_snat_for_lb = 1; next;)
> >> @@ -9568,9 +9568,9 @@ AT_CAPTURE_FILE([R1flows_force_skip_snat])
> >>   AT_CHECK([grep "lr_in_dnat " R1flows_force_skip_snat |
> >> ovn_strip_lflows], [0], [dnl
> >>     table=??(lr_in_dnat         ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80;
> skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80;
> skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]]
> >> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel &&
> >> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
> >>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat
> >> == 1), action=(flags.force_snat_for_lb = 1; next;)
> >> @@ -9592,12 +9592,12 @@ AT_CAPTURE_FILE([R1flows_2lbs])
> >>   AT_CHECK([grep "lr_in_dnat " R1flows_2lbs | ovn_strip_lflows], [0],
> >> [dnl
> >>     table=??(lr_in_dnat         ), priority=0    , match=(1),
> >> action=(next;)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80),
> >> action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80;
> skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10;
> >> flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80;
> skip_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20;
> >> flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80;
> >> force_snat);)
> >> -  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 &&
> >> reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20;
> >> flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80;
> >> force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80),
> >> action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]]
> >> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=120  , match=(ct.new &&
> >> !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80),
> >> action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.20; reg2[[0..15]]
> >> = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1;
> >> ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=10.0.0.2:80; force_snat);)
> >> +  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] ==
> >> 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 &&
> >> reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1;
> >> ct_lb_mark(backends=20.0.0.2:80; force_snat);)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
> >>     table=??(lr_in_dnat         ), priority=50   , match=(ct.rel &&
> >> !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
> >>     table=??(lr_in_dnat         ), priority=70   , match=(ct.est &&
> >> !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat
> >> == 1), action=(flags.force_snat_for_lb = 1; next;)
> >> @@ -14058,10 +14058,10 @@ ovn-sbctl dump-flows s1 > s1flows
> >>   AT_CAPTURE_FILE([s1flows])
> >>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows |
> >> grep "30.0.0.1"], [0], [dnl
> >> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
> >> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
> >>   ])
> >>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep
> >> "30.0.0.1"], [0], [dnl
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1;
> >> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1;
> >> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> >>   ])
> >>   # Associate load balancer to lr1 with DGP
> >> @@ -14283,10 +14283,10 @@ ovn-sbctl dump-flows s1 > s1flows
> >>   AT_CAPTURE_FILE([s1flows])
> >>   AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows |
> >> grep "30.0.0.1"], [0], [dnl
> >> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
> >> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
> >>   ])
> >>   AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep
> >> "30.0.0.1"], [0], [dnl
> >> -  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1;
> >> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> >> +  table=??(ls_in_lb           ), priority=110  , match=(ct.new &&
> >> ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1;
> >> ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
> >>   ])
> >>   # Associate load balancer to lr1 with DGP
> >> diff --git a/tests/ovn.at b/tests/ovn.at
> >> index b49a63f3e..e9144b0cd 100644
> >> --- a/tests/ovn.at
> >> +++ b/tests/ovn.at
> >> @@ -2161,13 +2161,13 @@ reg9[[5]] = chk_ecmp_nh();
> >>   # commit_lb_aff
> >>   commit_lb_aff(vip = "172.16.0.123:8080", backend = "10.0.0.3:8080",
> >> proto = tcp, timeout = 30);
> >> -    encodes as
> >>
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
> >> +    encodes as
> >>
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
> >>   commit_lb_aff(vip = "172.16.0.123", backend = "10.0.0.3", timeout =
> >> 30);
> >>       encodes as
> >>
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]])
> >>   commit_lb_aff(vip = "[[::1]]:8080", backend = "[[::2]]:8080", proto
> >> = tcp, timeout = 30);
> >> -    encodes as
> >>
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG0[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
> >> +    encodes as
> >>
> learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
> >>   # chk_lb_aff()
> >>   reg9[[6]] = chk_lb_aff();
> >> @@ -25576,8 +25576,8 @@ OVS_WAIT_FOR_OUTPUT(
> >>     [ovn-sbctl dump-flows > sbflows
> >>      ovn-sbctl dump-flows sw0 | grep ct_lb_mark | grep priority=120 |
> >> sed 's/table=..//'], 0,
> >>     [dnl
> >> -  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> -  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst ==
> >> 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] =
> >> 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80;
> >> hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
> >> +  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> +  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst ==
> >> 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] =
> >> 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80;
> >> hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
> >>   ])
> >>   AT_CAPTURE_FILE([sbflows2])
> >> @@ -25621,7 +25621,7 @@ AT_CHECK(
> >>     [grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" sbflows3 | grep
> >> priority=120 |\
> >>      ovn_strip_lflows], [0], [dnl
> >>     table=??(ls_in_lb           ), priority=120  , match=(ct.new &&
> >> ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(drop;)
> >> -  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >> +  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] ==
> >> 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10;
> >> reg2[[0..15]] = 80; ct_lb_mark;)
> >>   ])
> >>   AT_CAPTURE_FILE([sbflows4])
> >> @@ -30627,7 +30627,7 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
> >> @@ -30635,7 +30635,7 @@ NXST_FLOW reply (xid=0x8):
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
> >> @@ -30654,9 +30654,9 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
> >> @@ -30664,8 +30664,8 @@ NXST_FLOW reply (xid=0x8):
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
> >> @@ -30687,17 +30687,17 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>   ])
> >>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv4-udp
> >> @@ -30711,35 +30711,35 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>   ])
> >>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-tcp
> >> @@ -30753,39 +30753,39 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>   ])
> >>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-udp
> >> @@ -30799,11 +30799,11 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30811,19 +30811,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30831,10 +30831,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >>   ])
> >> @@ -30851,11 +30851,11 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30863,19 +30863,19 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30883,10 +30883,10 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >>   ])
> >> @@ -30900,12 +30900,12 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30913,21 +30913,21 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30935,12 +30935,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >>   ])
> >>   check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6
> >> @@ -30953,13 +30953,13 @@ OVS_WAIT_UNTIL(
> >>   )
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30967,23 +30967,23 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -30991,12 +30991,12 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN_REPLY
> >>   ])
> >>   AT_CHECK([as hv2 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
> >>   ])
> >> @@ -31093,7 +31093,7 @@ OVS_WAIT_UNTIL(
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> [dnl
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>    table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >> @@ -31103,7 +31103,7 @@ NXST_FLOW reply (xid=0x8):
> >>   AT_CHECK([as hv1 ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0],
> >> [dnl
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >> - table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >> + table=OFTABLE_CT_SNAT_HAIRPIN,
> >> priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858
> >> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
> >>    table=OFTABLE_CT_SNAT_HAIRPIN,
> >>
> priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88
> actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
> >>   ])
> >> @@ -36078,15 +36078,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int |
> >> grep 'nat(dst=85.85.85.44:8504)' -c], [
> >>   dnl Ensure hairpin flows are correct.
> >>   as hv1
> >>   AT_CHECK([ovs-ofctl dump-flows br-int | grep
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b01,reg2=0x10cd/0xffff,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cd/0xffff,reg4=0x2b2b2b01,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=68,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   dnl Change Chassis_Template_Var mappings
> >> @@ -36137,15 +36137,15 @@ AT_CHECK([ovs-ofctl dump-groups br-int |
> >> grep 'nat(dst=84.84.84.44:8404)' -c], [
> >>   dnl Ensure hairpin flows are correct.
> >>   as hv1
> >>   AT_CHECK([ovs-ofctl dump-flows br-int | grep
> >> table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a01,reg2=0x1069/0xffff,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> - table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1069/0xffff,reg4=0x2a2a2a01,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >> + table=OFTABLE_CHK_LB_HAIRPIN,
> >>
> priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404
> actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
> >>   ])
> >>   dnl Remove Chassis_Template_Variables and check that everything is
> >> diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
> >> index 170024a61..f7745b979 100644
> >> --- a/tests/system-ovn-kmod.at
> >> +++ b/tests/system-ovn-kmod.at
> >> @@ -151,12 +151,12 @@
> >>
> tcp,orig=(src=172.16.1.2,dst=172.16.1.100,sport=<cleared>,dport=<cleared>),reply
> >>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key
> >> external_ids:name=R2))
> >>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e
> >> 's/load:0xc0a80[[0-9]]02/load:0xc0a80<cleared>02/'], [0], [dnl
> >> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60,
> >> tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080
> >>
> actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG8[[0..15]]
> >> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60,
> >> tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080
> >>
> actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG2[[0..15]]
> >>   ])
> >>   check_affinity_flows () {
> >> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >> '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80102,.*nw_dst=
> 172.16.1.100/{print <http://172.16.1.100/%7Bprint>
> substr($4,11,length($4)-11)}')
> >> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >> '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80202,.*nw_dst=
> 172.16.1.100/{print <http://172.16.1.100/%7Bprint>
> substr($4,11,length($4)-11)}')
> >> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80102,.*nw_dst=
> 172.16.1.100/{print <http://172.16.1.100/%7Bprint>
> substr($4,11,length($4)-11)}')
> >> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80202,.*nw_dst=
> 172.16.1.100/{print <http://172.16.1.100/%7Bprint>
> substr($4,11,length($4)-11)}')
> >>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
> >>   echo $?
> >>   }
> >> @@ -452,12 +452,12 @@
> >>
> tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd
> >>   dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key
> >> external_ids:name=R2))
> >>   AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int
> >> table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e
> >> 's/load:0xfd1[[0-9]]000000000000/load:0xfd1<cleared>000000000000/'],
> >> [0], [dnl
> >> - table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60,
> >> tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080
> >>
> actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG8[[0..15]]
> >> + table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60,
> >> tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080
> >>
> actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG2[[0..15]]
> >>   ])
> >>   check_affinity_flows () {
> >> -n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print
> substr($4,11,length($4)-11)}')
> >> -n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print
> substr($4,11,length($4)-11)}')
> >> +n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print
> substr($4,11,length($4)-11)}')
> >> +n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk
> >>
> '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print
> substr($4,11,length($4)-11)}')
> >>   [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
> >>   echo $?
> >>   }
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

diff --git a/include/ovn/logical-fields.h b/include/ovn/logical-fields.h
index 59e4ac3da..6a87fc386 100644
--- a/include/ovn/logical-fields.h
+++ b/include/ovn/logical-fields.h
@@ -47,7 +47,7 @@  enum ovn_controller_event {
  *
  * Make sure these don't overlap with the logical fields! */
 #define MFF_LOG_REG0             MFF_REG0
-#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG1
+#define MFF_LOG_LB_ORIG_DIP_IPV4 MFF_REG4
 #define MFF_LOG_LB_ORIG_TP_DPORT MFF_REG2
 
 #define MFF_LOG_XXREG0           MFF_XXREG0
@@ -56,9 +56,8 @@  enum ovn_controller_event {
 #define MFF_N_LOG_REGS 10
 
 #define MFF_LOG_LB_AFF_MATCH_IP4_ADDR       MFF_REG4
-#define MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR    MFF_XXREG0
-#define MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR    MFF_XXREG1
-#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG8
+#define MFF_LOG_LB_AFF_MATCH_IP6_ADDR       MFF_XXREG1
+#define MFF_LOG_LB_AFF_MATCH_PORT           MFF_REG2
 
 #define MFF_LOG_CT_ORIG_NW_DST_ADDR         MFF_REG1   /* REG_ORIG_DIP_IPV4 */
 #define MFF_LOG_CT_ORIG_IP6_DST_ADDR        MFF_XXREG1 /* REG_ORIG_DIP_IPV6 */
diff --git a/lib/actions.c b/lib/actions.c
index ea30be767..62e73b2c5 100644
--- a/lib/actions.c
+++ b/lib/actions.c
@@ -5371,11 +5371,7 @@  encode_COMMIT_LB_AFF(const struct ovnact_commit_lb_aff *lb_aff,
         imm_backend_ip = (union mf_value) {
             .ipv6 =  lb_aff->backend,
         };
-        if (ep->is_switch) {
-            ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_LS_IP6_ADDR);
-        } else {
-            ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_LR_IP6_ADDR);
-        }
+        ol_spec->dst.field = mf_from_id(MFF_LOG_LB_AFF_MATCH_IP6_ADDR);
     } else {
         ovs_be32 ip4 = in6_addr_get_mapped_ipv4(&lb_aff->backend);
         imm_backend_ip = (union mf_value) {
diff --git a/northd/northd.c b/northd/northd.c
index c41a7591b..2385c3b5e 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -125,20 +125,12 @@  static bool vxlan_mode;
 #define REGBIT_FROM_ROUTER_PORT   "reg0[18]"
 #define REGBIT_IP_FRAG            "reg0[19]"
 
-#define REG_ORIG_DIP_IPV4         "reg1"
-#define REG_ORIG_DIP_IPV6         "xxreg1"
-#define REG_ORIG_TP_DPORT         "reg2[0..15]"
-
-/* Register used to store backend ipv6 address
- * for load balancer affinity. */
-#define REG_LB_L2_AFF_BACKEND_IP6 "xxreg0"
-
 /* Register definitions for switches and routers. */
 
-/* Register used to store backend ipv4 address
- * for load balancer affinity. */
-#define REG_LB_AFF_BACKEND_IP4  "reg4"
-#define REG_LB_AFF_MATCH_PORT   "reg8[0..15]"
+/* Register used for LB. */
+#define REG_LB_IPV4 "reg4"
+#define REG_LB_IPV6 "xxreg1"
+#define REG_LB_PORT "reg2[0..15]"
 
 /* Registers for ACL evaluation */
 #define REGBIT_ACL_VERDICT_ALLOW "reg8[16]"
@@ -192,12 +184,6 @@  BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
 #define REG_DHCP_RELAY_DIP_IPV4 "reg2"
 #define REG_ROUTE_TABLE_ID "reg7"
 
-/* Register used to store backend ipv6 address
- * for load balancer affinity. */
-#define REG_LB_L3_AFF_BACKEND_IP6  "xxreg1"
-
-#define REG_ORIG_TP_DPORT_ROUTER   "reg9[16..31]"
-
 /* Registers used for pasing observability information for switches:
  * domain and point ID. */
 #define REG_OBS_POINT_ID_NEW "reg3"
@@ -227,25 +213,27 @@  BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
  * |    |     REGBIT_{HAIRPIN/HAIRPIN_REPLY}           |   |                                   |
  * |    | REGBIT_ACL_HINT_{ALLOW_NEW/ALLOW/DROP/BLOCK} |   |                                   |
  * |    |     REGBIT_ACL_{LABEL/STATELESS}             | X |                                   |
- * +----+----------------------------------------------+ X |       LB_L2_AFF_BACKEND_IP6       |
- * | R1 |         ORIG_DIP_IPV4 (>= IN_PRE_STATEFUL)   | R |        (>= IN_LB_AFF_CHECK &&     |
- * +----+----------------------------------------------+ E |         <= IN_LB_AFF_LEARN)       |
- * | R2 |         ORIG_TP_DPORT (>= IN_PRE_STATEFUL)   | G |                                   |
- * +----+----------------------------------------------+ 0 |                                   |
+ * +----+----------------------------------------------+ X |                                   |
+ * | R1 |                   UNUSED                     | R |                                   |
+ * +----+----------------------------------------------+ E |                                   |
+ * | R2 |                 REG_LB_PORT                  | G |                                   |
+ * |    |  (>= IN_PRE_STATEFUL && <= IN_LB_AFF_LEARN)  | 0 |                                   |
+ * +----+----------------------------------------------+   |                                   |
  * | R3 |             OBS_POINT_ID_NEW                 |   |                                   |
  * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   |                                   |
  * +----+----------------------------------------------+---+-----------------------------------+
- * | R4 |            REG_LB_AFF_BACKEND_IP4            |   |                                   |
- * +----+----------------------------------------------+ X |                                   |
- * | R5 |                   UNUSED                     | X | ORIG_DIP_IPV6(>= IN_PRE_STATEFUL) |
- * +----+----------------------------------------------+ R |                                   |
- * | R6 |                   UNUSED                     | E |                                   |
- * +----+----------------------------------------------+ G |                                   |
- * | R7 |                   UNUSED                     | 1 |                                   |
+ * | R4 |                 REG_LB_IPV4                  |   |                                   |
+ * | R4 |    (>= IN_PRE_STATEFUL && <= IN_HAIRPIN)     | X |                                   |
+ * +----+----------------------------------------------+ X |           REG_LB_IPV6             |
+ * | R5 |                   UNUSED                     | R |      (>= IN_PRE_STATEFUL &&       |
+ * +----+----------------------------------------------+ E |       <= IN_HAIRPIN)              |
+ * | R6 |                   UNUSED                     | G |                                   |
+ * +----+----------------------------------------------+ 1 |                                   |
+ * | R7 |                   UNUSED                     |   |                                   |
  * +----+----------------------------------------------+---+-----------------------------------+
- * | R8 |              LB_AFF_MATCH_PORT               | X |      REG_OBS_COLLECTOR_ID_NEW     |
- * |    |  (>= IN_LB_AFF_CHECK && <= IN_LB_AFF_LEARN)  | R |      REG_OBS_COLLECTOR_ID_EST     |
- * |    |                                              | E |  (>= ACL_EVAL* && <= ACL_ACTION*) |
+ * | R8 |           REG_OBS_COLLECTOR_ID_NEW           | X |                                   |
+ * |    |           REG_OBS_COLLECTOR_ID_EST           | R |                                   |
+ * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       | E |                                   |
  * +----+----------------------------------------------+ G +-----------------------------------+
  * | R9 |              OBS_POINT_ID_EST                | 4 |                                   |
  * |    |       (>= ACL_EVAL* && <= ACL_ACTION*)       |   |                                   |
@@ -256,23 +244,26 @@  BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
  * | R0  | REGBIT_ND_RA_OPTS_RESULT  |   |                 |   |                                    |
  * |     |   (= IN_ND_RA_OPTIONS)    | X |                 |   |                                    |
  * |     |      NEXT_HOP_IPV4        | R |                 |   |                                    |
- * |     |      (>= IP_INPUT)        | E | INPORT_ETH_ADDR | X |                                    |
+ * |     |   (>= IN_IP_ROUTING)      | E | INPORT_ETH_ADDR | X |                                    |
  * +-----+---------------------------+ G |   (< IP_INPUT)  | X |                                    |
  * | R1  |        UNUSED             | 0 |                 | R |                                    |
- * |     |                           |   |                 | E |     NEXT_HOP_IPV6 (>= DEFRAG )     |
+ * |     |                           |   |                 | E |  NEXT_HOP_IPV6 (>= IN_IP_ROUTING)  |
  * +-----+---------------------------+---+-----------------+ G |                                    |
- * | R2     REG_DHCP_RELAY_DIP_IPV4  | X |                 | 0 |                                    |
- * |     |                           | R |                 |   |                                    |
- * +-----+---------------------------+ E |     UNUSED      |   |                                    |
- * | R3  |        UNUSED             | G |                 |   |                                    |
- * |     |                           | 1 |                 |   |                                    |
+ * | R2  |  REG_DHCP_RELAY_DIP_IPV4  |   |                 | 0 |                                    |
+ * |     |       REG_LB_PORT         | X |                 | 0 |                                    |
+ * |     | (>= IN_LB_AFF_CHECK       | R |                 |   |                                    |
+ * |     |  <= IN_LB_AFF_LEARN)      | E |                 |   |                                    |
+ * +-----+---------------------------+ G |     UNUSED      |   |                                    |
+ * | R3  |        UNUSED             | 1 |                 |   |                                    |
+ * |     |                           |   |                 |   |                                    |
  * +-----+---------------------------+---+-----------------+---+------------------------------------+
- * | R4  |  REG_LB_AFF_BACKEND_IP4   | X |                 |   |                                    |
- * |     |                           | R |                 |   |                                    |
+ * | R4  |        REG_LB_IPV4        | X |                 |   |                                    |
+ * |     |  (>= IN_LB_AFF_CHECK &&   | R |                 |   |                                    |
+ * |     |   <= IN_LB_AFF_LEARN)     | R |                 |   |                                    |
  * +-----+---------------------------+ E |     UNUSED      | X |                                    |
- * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X |                                    |
- * |     |      (>= IP_INPUT)        | 2 |                 | R |        LB_L3_AFF_BACKEND_IP6       |
- * +-----+---------------------------+---+-----------------+ E |           (<= IN_DNAT)             |
+ * | R5  |  SRC_IPV4 for ARP-REQ     | G |                 | X |            REG_LB_IPV6             |
+ * |     |      (>= IP_INPUT)        | 2 |                 | R |        (>= IN_LB_AFF_CHECK &&      |
+ * +-----+---------------------------+---+-----------------+ E |         <= IN_LB_AFF_LEARN)        |
  * | R6  |        UNUSED             | X |                 | G |                                    |
  * |     |                           | R |                 | 1 |                                    |
  * +-----+---------------------------+ E |     UNUSED      |   |                                    |
@@ -282,7 +273,7 @@  BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
  * +-----+---------------------------+---+-----------------+---+------------------------------------+
  * | R8  |     ECMP_GROUP_ID         |   |                 |
  * |     |     ECMP_MEMBER_ID        |   |                 |
- * |     |    LB_AFF_MATCH_PORT      | X |                 |
+ * |     |                           | X |                 |
  * +-----+---------------------------+ R |                 |
  * |     | REGBIT_{                  | E |                 |
  * |     |   EGRESS_LOOPBACK/        | G |     UNUSED      |
@@ -292,9 +283,6 @@  BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
  * |     |REGBIT_DHCP_RELAY_REQ_CHK/ |   |                 |
  * |     |REGBIT_DHCP_RELAY_RESP_CHK |   |                 |
  * |     |REGBIT_NEXTHOP_IS_IPV4}    |   |                 |
- * |     |                           |   |                 |
- * |     | REG_ORIG_TP_DPORT_ROUTER  |   |                 |
- * |     |                           |   |                 |
  * +-----+---------------------------+---+-----------------+
  *
  */
@@ -3621,6 +3609,16 @@  build_lb_vip_actions(const struct ovn_northd_lb *lb,
     bool reject = !lb_vip->n_backends && lb_vip->empty_backend_rej;
     bool drop = !lb_vip->n_backends && !lb_vip->empty_backend_rej;
 
+    if (ls_dp || lb->affinity_timeout) {
+        const char *ip_reg =
+            lb_vip->address_family == AF_INET ? REG_LB_IPV4 : REG_LB_IPV6;
+        ds_put_format(action, "%s = %s; ", ip_reg, lb_vip->vip_str);
+
+        if (lb_vip->port_str) {
+            ds_put_format(action, REG_LB_PORT" = %s; ", lb_vip->port_str);
+        }
+    }
+
     if (lb_vip_nb->lb_health_check) {
         ds_put_cstr(action, "ct_lb_mark(backends=");
 
@@ -7867,29 +7865,19 @@  build_lb_rules_pre_stateful(struct lflow_table *lflows,
          */
         if (lb->vips[i].address_family == AF_INET) {
             ip_match = "ip4";
-            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
+            ds_put_format(action, REG_LB_IPV4 " = %s; ",
                           lb_vip->vip_str);
         } else {
             ip_match = "ip6";
-            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
+            ds_put_format(action, REG_LB_IPV6 " = %s; ",
                           lb_vip->vip_str);
         }
 
-        const char *proto = NULL;
         if (lb_vip->port_str) {
-            proto = "tcp";
-            if (lb->nlb->protocol) {
-                if (!strcmp(lb->nlb->protocol, "udp")) {
-                    proto = "udp";
-                } else if (!strcmp(lb->nlb->protocol, "sctp")) {
-                    proto = "sctp";
-                }
-            }
-
             /* Store the original destination port to be used when generating
              * hairpin flows.
              */
-            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
+            ds_put_format(action, REG_LB_PORT " = %s; ",
                           lb_vip->port_str);
         }
         ds_put_cstr(action, "ct_lb_mark;");
@@ -7897,7 +7885,8 @@  build_lb_rules_pre_stateful(struct lflow_table *lflows,
         ds_put_format(match, REGBIT_CONNTRACK_NAT" == 1 && %s.dst == %s",
                       ip_match, lb_vip->vip_str);
         if (lb_vip->port_str) {
-            ds_put_format(match, " && %s.dst == %s", proto, lb_vip->port_str);
+            ds_put_format(match, " && %s.dst == %s", lb->proto,
+                          lb_vip->port_str);
         }
 
         ovn_lflow_add_with_dp_group(
@@ -7913,34 +7902,30 @@  build_lb_rules_pre_stateful(struct lflow_table *lflows,
  * - load balancing affinity check:
  *   table=lr_in_lb_aff_check, priority=100
  *      match=(new_lb_match)
- *      action=(REG_NEXT_HOP_IPV4 = ip4.dst;
- *              REG_ORIG_TP_DPORT_ROUTER = tcp.dst;
- *              REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
+ *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
  *
  * - load balancing:
  *   table=lr_in_dnat, priority=150
  *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
- *             && REG_LB_AFF_BACKEND_IP4 == B1 && REG_LB_AFF_MATCH_PORT == BP1)
- *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
- *              ct_lb_mark(backends=B1:BP1; ct_flag);)
+ *             && REG_LB_IPV4 == B1 && REG_LB_PORT == BP1)
+ *      action=(lb_action; ct_lb_mark(backends=B1:BP1; ct_flag);)
  *   table=lr_in_dnat, priority=150
  *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
- *             && REG_LB_AFF_BACKEND_IP4 == B2 && REG_LB_AFF_MATCH_PORT == BP2)
- *      action=(REG_NEXT_HOP_IPV4 = V; lb_action;
- *              ct_lb_mark(backends=B2:BP2; ct_flag);)
+ *             && REG_LB_IPV4 == B2 && REG_LB_PORT == BP2)
+ *      action=(lb_action; ct_lb_mark(backends=B2:BP2; ct_flag);)
  *
  * - load balancing affinity learn:
  *   table=lr_in_lb_aff_learn, priority=100
  *      match=(REGBIT_KNOWN_LB_SESSION == 0
  *             && ct.new && ip4
- *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER = VP
+ *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
  *             && ip4.dst == B1 && tcp.dst == BP1)
  *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
  *                            proto = tcp, timeout = T));
  *   table=lr_in_lb_aff_learn, priority=100
  *      match=(REGBIT_KNOWN_LB_SESSION == 0
  *             && ct.new && ip4
- *             && REG_NEXT_HOP_IPV4 == V && REG_ORIG_TP_DPORT_ROUTER = VP
+ *             && REG_LB_IPV4 == V && REG_LB_PORT = VP
  *             && ip4.dst == B2 && tcp.dst == BP2)
  *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
  *                            proto = tcp, timeout = T));
@@ -7963,14 +7948,11 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
     struct ds aff_action_learn = DS_EMPTY_INITIALIZER;
     struct ds aff_match = DS_EMPTY_INITIALIZER;
     struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
-    struct ds aff_check_action = DS_EMPTY_INITIALIZER;
 
     bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
     const char *ip_match = ipv6 ? "ip6" : "ip4";
 
-    const char *reg_vip = ipv6 ? REG_NEXT_HOP_IPV6 : REG_NEXT_HOP_IPV4;
-    const char *reg_backend =
-        ipv6 ? REG_LB_L3_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
+    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
     const char *ct_flag = NULL;
     if (lb_action && !strcmp(lb_action, "flags.skip_snat_for_lb = 1; ")) {
         ct_flag = "; skip_snat";
@@ -7980,22 +7962,12 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
     }
 
     /* Create affinity check flow. */
-    ds_put_format(&aff_check_action, "%s = %s.dst; ", reg_vip, ip_match);
-
-    if (lb_vip->port_str) {
-        ds_put_format(&aff_check_action, REG_ORIG_TP_DPORT_ROUTER" = %s.dst; ",
-                      lb->proto);
-    }
-    ds_put_cstr(&aff_check_action, REGBIT_KNOWN_LB_SESSION
-                " = chk_lb_aff(); next;");
-
     ovn_lflow_add_with_dp_group(
         lflows, dp_bitmap, ods_size(lr_datapaths), S_ROUTER_IN_LB_AFF_CHECK,
-        100, new_lb_match, ds_cstr(&aff_check_action), &lb->nlb->header_,
-        lflow_ref);
+        100, new_lb_match, REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;",
+        &lb->nlb->header_, lflow_ref);
 
     /* Prepare common part of affinity LB and affinity learn action. */
-    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
     ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
 
     if (lb_vip->port_str) {
@@ -8015,19 +7987,19 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
     if (lb_vip->port_str) {
         ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
                       "ct.new && %s && %s == %s && "
-                      REG_ORIG_TP_DPORT_ROUTER" == %s && "
-                      "%s.dst == ", ip_match, reg_vip, lb_vip->vip_str,
+                      REG_LB_PORT " == %s && "
+                      "%s.dst == ", ip_match, reg_ip, lb_vip->vip_str,
                       lb_vip->port_str, ip_match);
     } else {
         ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
                       "ct.new && %s && %s == %s && %s.dst == ", ip_match,
-                      reg_vip, lb_vip->vip_str, ip_match);
+                      reg_ip, lb_vip->vip_str, ip_match);
     }
 
     /* Prepare common part of affinity match. */
     ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
                   "ct.new && %s.dst == %s && %s == ", ip_match,
-                  lb_vip->vip_str, reg_backend);
+                  lb_vip->vip_str, reg_ip);
 
     /* Store the common part length. */
     size_t aff_action_len = aff_action.length;
@@ -8050,7 +8022,7 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
 
             ds_put_format(&aff_match_learn, " && %s.dst == %d",
                           lb->proto, backend->port);
-            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == %d",
+            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
                           backend->port);
         } else {
             ds_put_cstr(&aff_action, backend->ip_str);
@@ -8094,7 +8066,6 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
     ds_destroy(&aff_action_learn);
     ds_destroy(&aff_match);
     ds_destroy(&aff_match_learn);
-    ds_destroy(&aff_check_action);
 }
 
 /* Builds the logical switch flows related to load balancer affinity.
@@ -8102,35 +8073,33 @@  build_lb_affinity_lr_flows(struct lflow_table *lflows,
  * affinity timeout set to T, it generates the following logical flows:
  * - load balancing affinity check:
  *   table=ls_in_lb_aff_check, priority=100
- *      match=(ct.new && ip4
- *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP)
+ *      match=(ct.new && ip4 && ip4.dst == V && PROTO && PROTO.dst == VP)
  *      action=(REGBIT_KNOWN_LB_SESSION = chk_lb_aff(); next;)
  *
  * - load balancing:
  *   table=ls_in_lb, priority=150
  *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
- *             && REG_LB_AFF_BACKEND_IP4 == B1 && REG_LB_AFF_MATCH_PORT == BP1)
- *      action=(REG_ORIG_DIP_IPV4 = V; REG_ORIG_TP_DPORT = VP;
+ *             && PROTO && PROTO.dst == VP)
+ *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
  *              ct_lb_mark(backends=B1:BP1);)
  *   table=ls_in_lb, priority=150
  *      match=(REGBIT_KNOWN_LB_SESSION == 1 && ct.new && ip4.dst == V
- *             && REG_LB_AFF_BACKEND_IP4 == B2 && REG_LB_AFF_MATCH_PORT == BP2)
- *      action=(REG_ORIG_DIP_IPV4 = V;
- *              REG_ORIG_TP_DPORT = VP;
+ *             && PROTO && PROTO.dst == VP)
+ *      action=(REG_LB_IPV4 = V; REG_LB_PORT = VP;
  *              ct_lb_mark(backends=B1:BP2);)
  *
  * - load balancing affinity learn:
  *   table=ls_in_lb_aff_learn, priority=100
  *      match=(REGBIT_KNOWN_LB_SESSION == 0
  *             && ct.new && ip4
- *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
+ *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
  *             && ip4.dst == B1 && tcp.dst == BP1)
  *      action=(commit_lb_aff(vip = "V:VP", backend = "B1:BP1",
  *                            proto = tcp, timeout = T));
  *   table=ls_in_lb_aff_learn, priority=100
  *      match=(REGBIT_KNOWN_LB_SESSION == 0
  *             && ct.new && ip4
- *             && REG_ORIG_DIP_IPV4 == V && REG_ORIG_TP_DPORT == VP
+ *             && REG_LB_IPV4 == V && REG_LB_PORT == VP
  *             && ip4.dst == B2 && tcp.dst == BP2)
  *      action=(commit_lb_aff(vip = "V:VP", backend = "B2:BP2",
  *                            proto = tcp, timeout = T));
@@ -8149,19 +8118,16 @@  build_lb_affinity_ls_flows(struct lflow_table *lflows,
 
     const struct ovn_northd_lb *lb = lb_dps->lb;
     struct ds new_lb_match = DS_EMPTY_INITIALIZER;
-    if (IN6_IS_ADDR_V4MAPPED(&lb_vip->vip)) {
-        ds_put_format(&new_lb_match,
-                      "ct.new && ip4 && "REG_ORIG_DIP_IPV4 " == %s",
-                      lb_vip->vip_str);
-    } else {
-        ds_put_format(&new_lb_match,
-                      "ct.new && ip6 && "REG_ORIG_DIP_IPV6 " == %s",
-                      lb_vip->vip_str);
-    }
+    bool ipv6 = lb_vip->address_family == AF_INET6;
+    const char *ip_match = ipv6 ? "ip6" : "ip4";
+    const char *reg_ip = ipv6 ? REG_LB_IPV6 : REG_LB_IPV4;
+
+    ds_put_format(&new_lb_match, "ct.new && %s && %s.dst == %s",
+                  ip_match, ip_match, lb_vip->vip_str);
 
     if (lb_vip->port_str) {
-        ds_put_format(&new_lb_match, " && "REG_ORIG_TP_DPORT " == %s",
-                      lb_vip->port_str);
+        ds_put_format(&new_lb_match, " && %s && %s.dst == %s",
+                      lb->proto, lb->proto, lb_vip->port_str);
     }
 
     static char *aff_check = REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;";
@@ -8177,19 +8143,12 @@  build_lb_affinity_ls_flows(struct lflow_table *lflows,
     struct ds aff_match = DS_EMPTY_INITIALIZER;
     struct ds aff_match_learn = DS_EMPTY_INITIALIZER;
 
-    bool ipv6 = !IN6_IS_ADDR_V4MAPPED(&lb_vip->vip);
-    const char *ip_match = ipv6 ? "ip6" : "ip4";
-
-    const char *reg_vip = ipv6 ? REG_ORIG_DIP_IPV6 : REG_ORIG_DIP_IPV4;
-    const char *reg_backend =
-        ipv6 ? REG_LB_L2_AFF_BACKEND_IP6 : REG_LB_AFF_BACKEND_IP4;
-
     /* Prepare common part of affinity LB and affinity learn action. */
-    ds_put_format(&aff_action, "%s = %s; ", reg_vip, lb_vip->vip_str);
+    ds_put_format(&aff_action, "%s = %s; ", reg_ip, lb_vip->vip_str);
     ds_put_cstr(&aff_action_learn, "commit_lb_aff(vip = \"");
 
     if (lb_vip->port_str) {
-        ds_put_format(&aff_action, REG_ORIG_TP_DPORT" = %s; ",
+        ds_put_format(&aff_action, REG_LB_PORT" = %s; ",
                       lb_vip->port_str);
         ds_put_format(&aff_action_learn, ipv6 ? "[%s]:%s" : "%s:%s",
                       lb_vip->vip_str, lb_vip->port_str);
@@ -8204,19 +8163,19 @@  build_lb_affinity_ls_flows(struct lflow_table *lflows,
     if (lb_vip->port_str) {
         ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
                       "ct.new && %s && %s == %s && "
-                      REG_ORIG_TP_DPORT" == %s && %s.dst == ",
-                      ip_match, reg_vip, lb_vip->vip_str,
+                      REG_LB_PORT" == %s && %s.dst == ",
+                      ip_match, reg_ip, lb_vip->vip_str,
                       lb_vip->port_str, ip_match);
     } else {
         ds_put_format(&aff_match_learn, REGBIT_KNOWN_LB_SESSION" == 0 && "
                       "ct.new && %s && %s == %s && %s.dst == ",
-                      ip_match, reg_vip, lb_vip->vip_str, ip_match);
+                      ip_match, reg_ip, lb_vip->vip_str, ip_match);
     }
 
     /* Prepare common part of affinity match. */
     ds_put_format(&aff_match, REGBIT_KNOWN_LB_SESSION" == 1 && "
                   "ct.new && %s.dst == %s && %s == ", ip_match,
-                  lb_vip->vip_str, reg_backend);
+                  lb_vip->vip_str, reg_ip);
 
     /* Store the common part length. */
     size_t aff_action_len = aff_action.length;
@@ -8238,7 +8197,7 @@  build_lb_affinity_ls_flows(struct lflow_table *lflows,
 
             ds_put_format(&aff_match_learn, " && %s.dst == %d",
                           lb->proto, backend->port);
-            ds_put_format(&aff_match, " && "REG_LB_AFF_MATCH_PORT" == %d",
+            ds_put_format(&aff_match, " && "REG_LB_PORT" == %d",
                           backend->port);
         } else {
             ds_put_cstr(&aff_action, backend->ip_str);
@@ -8315,33 +8274,10 @@  build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
     for (size_t i = 0; i < lb->n_vips; i++) {
         struct ovn_lb_vip *lb_vip = &lb->vips[i];
         struct ovn_northd_lb_vip *lb_vip_nb = &lb->vips_nb[i];
-        const char *ip_match = NULL;
+        const char *ip_match =
+            lb_vip->address_family == AF_INET ? "ip4" : "ip6";
 
         ds_clear(action);
-
-        /* Store the original destination IP to be used when generating
-         * hairpin flows.
-         * If the packet is fragmented, then the flow which saves the
-         * original destination IP (and port) in the "ls_in_pre_stateful"
-         * stage will not be hit.
-         */
-        if (lb_vip->address_family == AF_INET) {
-            ip_match = "ip4";
-            ds_put_format(action, REG_ORIG_DIP_IPV4 " = %s; ",
-                          lb_vip->vip_str);
-        } else {
-            ip_match = "ip6";
-            ds_put_format(action, REG_ORIG_DIP_IPV6 " = %s; ",
-                          lb_vip->vip_str);
-        }
-
-        if (lb_vip->port_str) {
-            /* Store the original destination port to be used when generating
-             * hairpin flows.
-             */
-            ds_put_format(action, REG_ORIG_TP_DPORT " = %s; ",
-                          lb_vip->port_str);
-        }
         ds_clear(match);
 
         /* New connections in Ingress table. */
@@ -8489,13 +8425,13 @@  build_lb_hairpin(const struct ls_stateful_record *ls_stateful_rec,
          * */
         ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
                       "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && ip4",
-                      REG_ORIG_DIP_IPV4 " = ct_nw_dst(); "
-                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
+                      REG_LB_IPV4 " = ct_nw_dst(); "
+                      REG_LB_PORT " = ct_tp_dst(); next;",
                       lflow_ref);
         ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 110,
                       "ct.trk && !ct.rpl && "REGBIT_IP_FRAG" == 1 && ip6",
-                      REG_ORIG_DIP_IPV6 " = ct_ip6_dst(); "
-                      REG_ORIG_TP_DPORT " = ct_tp_dst(); next;",
+                      REG_LB_IPV6 " = ct_ip6_dst(); "
+                      REG_LB_PORT " = ct_tp_dst(); next;",
                       lflow_ref);
 
         /* Set REGBIT_HAIRPIN in the original direction and
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index edfd5764b..2b1791de0 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -1425,7 +1425,7 @@  check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
 AT_CAPTURE_FILE([sbflows])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
 # disabled LSPs should not be a backend of Load Balancer
@@ -1434,7 +1434,7 @@  check ovn-nbctl lsp-set-enabled sw0-p1 disabled
 AT_CAPTURE_FILE([sbflows])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.3:80);)
 ])
 wait_row_count Service_Monitor 1
 
@@ -1443,7 +1443,7 @@  check ovn-nbctl lsp-set-enabled sw0-p1 enabled
 AT_CAPTURE_FILE([sbflows])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows | grep 'priority=120.*backends' | ovn_strip_lflows], 0, [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 wait_row_count Service_Monitor 2
 
@@ -1454,7 +1454,7 @@  wait_row_count Service_Monitor 0
 AT_CAPTURE_FILE([sbflows2])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows2 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
 AS_BOX([Create the Load_Balancer_Health_Check again.])
@@ -1466,7 +1466,7 @@  check ovn-nbctl --wait=sb sync
 
 ovn-sbctl dump-flows sw0 | grep backends | grep priority=120 > lflows.txt
 AT_CHECK([cat lflows.txt | ovn_strip_lflows], [0], [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
 AS_BOX([Get the uuid of both the service_monitor])
@@ -1476,7 +1476,7 @@  sm_sw1_p1=$(fetch_column Service_Monitor _uuid logical_port=sw1-p1)
 AT_CAPTURE_FILE([sbflows3])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows 3 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
 AS_BOX([Set the service monitor for sw1-p1 to offline])
@@ -1487,7 +1487,7 @@  check ovn-nbctl --wait=sb sync
 AT_CAPTURE_FILE([sbflows4])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows4 | grep 'priority=120.*backends' | ovn_strip_lflows], [0],
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
 ])
 
 AS_BOX([Set the service monitor for sw0-p1 to offline])
@@ -1516,7 +1516,7 @@  check ovn-nbctl --wait=sb sync
 AT_CAPTURE_FILE([sbflows7])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows7 | grep backends | grep priority=120 | ovn_strip_lflows], 0,
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
 ])
 
 AS_BOX([Set the service monitor for sw1-p1 to error])
@@ -1527,7 +1527,7 @@  check ovn-nbctl --wait=sb sync
 ovn-sbctl dump-flows sw0 | grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" \
 | grep priority=120 > lflows.txt
 AT_CHECK([cat lflows.txt | grep ls_in_lb | ovn_strip_lflows], [0], [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
 ])
 
 AS_BOX([Add one more vip to lb1])
@@ -1553,8 +1553,8 @@  AT_CAPTURE_FILE([sbflows9])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows9 | grep backends | grep priority=120 | ovn_strip_lflows],
   0,
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000);)
 ])
 
 AS_BOX([Set the service monitor for sw1-p1 to online])
@@ -1567,8 +1567,8 @@  AT_CAPTURE_FILE([sbflows10])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw0 | tee sbflows10 | grep backends | grep priority=120 | ovn_strip_lflows],
   0,
-[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
+[  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
 ])
 
 AS_BOX([Associate lb1 to sw1])
@@ -1577,8 +1577,8 @@  AT_CAPTURE_FILE([sbflows11])
 OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows sw1 | tee sbflows11 | grep backends | grep priority=120 | ovn_strip_lflows],
   0, [dnl
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg1 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.40 && tcp.dst == 1000), action=(reg4 = 10.0.0.40; reg2[[0..15]] = 1000; ct_lb_mark(backends=10.0.0.3:1000,20.0.0.3:80);)
 ])
 
 AS_BOX([Now create lb2 same as lb1 but udp protocol.])
@@ -4666,16 +4666,16 @@  check_stateful_flows() {
   table=??(ls_in_pre_stateful ), priority=100  , match=(reg0[[0]] == 1), action=(ct_next;)
   table=??(ls_in_pre_stateful ), priority=110  , match=(reg0[[2]] == 1), action=(ct_lb_mark;)
   table=??(ls_in_pre_stateful ), priority=115  , match=(reg0[[2]] == 1 && ip.is_frag), action=(reg0[[19]] = 1; ct_lb_mark;)
-  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
-  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark;)
+  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
+  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark;)
 ])
 
     AT_CHECK([grep "ls_in_lb " sw0flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg1 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.4:8080);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.20 && tcp.dst == 80), action=(reg4 = 10.0.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.40:8080);)
 ])
 
     AT_CHECK([grep "ls_in_stateful" sw0flows | ovn_strip_lflows], [0], [dnl
@@ -4780,7 +4780,7 @@  check ovn-nbctl --wait=sb ls-lb-add sw0 lb1
 AT_CHECK([ovn-sbctl dump-flows sw0 | grep "ls_in_lb " | ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.20), action=(drop;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
 ])
 
@@ -7842,8 +7842,8 @@  AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
 
 AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
 ])
 
@@ -7899,8 +7899,8 @@  AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
 
 AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
 ])
 
@@ -7956,8 +7956,8 @@  AT_CHECK([grep -e "ls_in_acl.*eval" -e "ls_in_acl_hint" lsflows | ovn_strip_lflo
 
 AT_CHECK([grep -e "ls_in_lb " lsflows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg1 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 10.0.0.2), action=(reg4 = 10.0.0.2; ct_lb_mark(backends=10.0.0.10);)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
 ])
 
@@ -9345,13 +9345,13 @@  AT_CAPTURE_FILE([S1flows])
 
 AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
 ])
 AT_CHECK([grep "ls_in_lb " S1flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg1 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.11 && tcp.dst == 8080), action=(reg4 = 172.16.0.11; reg2[[0..15]] = 8080; ct_lb_mark(backends=10.0.0.2:8080);)
 ])
 
 ovn-sbctl get datapath S0 _uuid > dp_uuids
@@ -9477,20 +9477,20 @@  AT_CAPTURE_FILE([S0flows])
 
 AT_CHECK([grep "ls_in_lb_aff_check" S0flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb_aff_check ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
+  table=??(ls_in_lb_aff_check ), priority=100  , match=(ct.new && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
 ])
 AT_CHECK([grep "ls_in_lb " S0flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg1 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip4), action=(reg4 = ct_nw_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
   table=??(ls_in_lb           ), priority=110  , match=(ct.trk && !ct.rpl && reg0[[19]] == 1 && ip6), action=(xxreg1 = ct_ip6_dst(); reg2[[0..15]] = ct_tp_dst(); next;)
-  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
-  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
-  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg1 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.2:80);)
+  table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 172.16.0.10 && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
+  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80);)
+  table=??(ls_in_lb           ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=20.0.0.2:80);)
 ])
 AT_CHECK([grep "ls_in_lb_aff_learn" S0flows | ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb_aff_learn ), priority=0    , match=(1), action=(next;)
-  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
-  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg1 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
+  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
+  table=??(ls_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
 ])
 
 AS_BOX([Test LR flows])
@@ -9499,13 +9499,13 @@  AT_CAPTURE_FILE([R1flows])
 
 AT_CHECK([grep "lr_in_lb_aff_check" R1flows | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_lb_aff_check ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg0 = ip4.dst; reg9[[16..31]] = tcp.dst; reg9[[6]] = chk_lb_aff(); next;)
+  table=??(lr_in_lb_aff_check ), priority=100  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg9[[6]] = chk_lb_aff(); next;)
 ])
 AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; ct_lb_mark(backends=10.0.0.2:80);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; ct_lb_mark(backends=20.0.0.2:80);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(ct_lb_mark(backends=10.0.0.2:80);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(ct_lb_mark(backends=20.0.0.2:80);)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
   table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
@@ -9515,8 +9515,8 @@  AT_CHECK([grep "lr_in_dnat " R1flows | ovn_strip_lflows], [0], [dnl
 ])
 AT_CHECK([grep "lr_in_lb_aff_learn" R1flows | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_lb_aff_learn ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
-  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg0 == 172.16.0.10 && reg9[[16..31]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
+  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 10.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "10.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
+  table=??(lr_in_lb_aff_learn ), priority=100  , match=(reg9[[6]] == 0 && ct.new && ip4 && reg4 == 172.16.0.10 && reg2[[0..15]] == 80 && ip4.dst == 20.0.0.2 && tcp.dst == 80), action=(commit_lb_aff(vip = "172.16.0.10:80", backend = "20.0.0.2:80", proto = tcp, timeout = 60); /* drop */)
 ])
 
 AS_BOX([Test LR flows - skip_snat=true])
@@ -9527,9 +9527,9 @@  AT_CAPTURE_FILE([R1flows_skip_snat])
 
 AT_CHECK([grep "lr_in_dnat " R1flows_skip_snat | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
   table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
@@ -9548,9 +9548,9 @@  AT_CAPTURE_FILE([R1flows_force_snat])
 
 AT_CHECK([grep "lr_in_dnat " R1flows_force_snat | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
   table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
@@ -9568,9 +9568,9 @@  AT_CAPTURE_FILE([R1flows_force_skip_snat])
 
 AT_CHECK([grep "lr_in_dnat " R1flows_force_skip_snat | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
   table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
@@ -9592,12 +9592,12 @@  AT_CAPTURE_FILE([R1flows_2lbs])
 
 AT_CHECK([grep "lr_in_dnat " R1flows_2lbs | ovn_strip_lflows], [0], [dnl
   table=??(lr_in_dnat         ), priority=0    , match=(1), action=(next;)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.10; flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
-  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && reg8[[0..15]] == 80), action=(reg0 = 172.16.0.20; flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.10 && tcp && tcp.dst == 80), action=(flags.skip_snat_for_lb = 1; reg4 = 172.16.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=120  , match=(ct.new && !ct.rel && ip4 && ip4.dst == 172.16.0.20 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; reg4 = 172.16.0.20; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.2:80,20.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.10 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.skip_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; skip_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 10.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=10.0.0.2:80; force_snat);)
+  table=??(lr_in_dnat         ), priority=150  , match=(reg9[[6]] == 1 && ct.new && ip4.dst == 172.16.0.20 && reg4 == 20.0.0.2 && reg2[[0..15]] == 80), action=(flags.force_snat_for_lb = 1; ct_lb_mark(backends=20.0.0.2:80; force_snat);)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted), action=(next;)
   table=??(lr_in_dnat         ), priority=50   , match=(ct.rel && !ct.est && !ct.new && !ct.rpl), action=(ct_commit_nat;)
   table=??(lr_in_dnat         ), priority=70   , match=(ct.est && !ct.rel && !ct.new && !ct.rpl && ct_mark.natted && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; next;)
@@ -14058,10 +14058,10 @@  ovn-sbctl dump-flows s1 > s1flows
 AT_CAPTURE_FILE([s1flows])
 
 AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
-  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
+  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
 ])
 AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
-  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
 ])
 
 # Associate load balancer to lr1 with DGP
@@ -14283,10 +14283,10 @@  ovn-sbctl dump-flows s1 > s1flows
 AT_CAPTURE_FILE([s1flows])
 
 AT_CHECK([grep "ls_in_pre_stateful" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
-  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark;)
+  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark;)
 ])
 AT_CHECK([grep "ls_in_lb" s1flows | ovn_strip_lflows | grep "30.0.0.1"], [0], [dnl
-  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg1 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
+  table=??(ls_in_lb           ), priority=110  , match=(ct.new && ip4.dst == 30.0.0.1), action=(reg4 = 30.0.0.1; ct_lb_mark(backends=172.16.0.103,172.16.0.102,172.16.0.101);)
 ])
 
 # Associate load balancer to lr1 with DGP
diff --git a/tests/ovn.at b/tests/ovn.at
index b49a63f3e..e9144b0cd 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -2161,13 +2161,13 @@  reg9[[5]] = chk_ecmp_nh();
 
 # commit_lb_aff
 commit_lb_aff(vip = "172.16.0.123:8080", backend = "10.0.0.3:8080", proto = tcp, timeout = 30);
-    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
+    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
 
 commit_lb_aff(vip = "172.16.0.123", backend = "10.0.0.3", timeout = 30);
     encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=172.16.0.123,load:0x1->NXM_NX_REG10[[14]],load:0xa000003->NXM_NX_REG4[[]])
 
 commit_lb_aff(vip = "[[::1]]:8080", backend = "[[::2]]:8080", proto = tcp, timeout = 30);
-    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG0[[]],load:0x1f90->NXM_NX_REG8[[0..15]])
+    encodes as learn(table=OFTABLE_CHK_LB_AFFINITY,idle_timeout=30,delete_learned,cookie=0xaaaaaaaa,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=::1,nw_proto=6,tcp_dst=8080,load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[]],load:0x1f90->NXM_NX_REG2[[0..15]])
 
 # chk_lb_aff()
 reg9[[6]] = chk_lb_aff();
@@ -25576,8 +25576,8 @@  OVS_WAIT_FOR_OUTPUT(
   [ovn-sbctl dump-flows > sbflows
    ovn-sbctl dump-flows sw0 | grep ct_lb_mark | grep priority=120 | sed 's/table=..//'], 0,
   [dnl
-  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
-  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
+  (ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
+  (ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark(backends=10.0.0.3:80,20.0.0.3:80; hash_fields="ip_dst,ip_src,tcp_dst,tcp_src");)
 ])
 
 AT_CAPTURE_FILE([sbflows2])
@@ -25621,7 +25621,7 @@  AT_CHECK(
   [grep "ip4.dst == 10.0.0.10 && tcp.dst == 80" sbflows3 | grep priority=120 |\
    ovn_strip_lflows], [0], [dnl
   table=??(ls_in_lb           ), priority=120  , match=(ct.new && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(drop;)
-  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg1 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
+  table=??(ls_in_pre_stateful ), priority=120  , match=(reg0[[2]] == 1 && ip4.dst == 10.0.0.10 && tcp.dst == 80), action=(reg4 = 10.0.0.10; reg2[[0..15]] = 80; ct_lb_mark;)
 ])
 
 AT_CAPTURE_FILE([sbflows4])
@@ -30627,7 +30627,7 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
@@ -30635,7 +30635,7 @@  NXST_FLOW reply (xid=0x8):
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
@@ -30654,9 +30654,9 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY], [0], [dnl
@@ -30664,8 +30664,8 @@  NXST_FLOW reply (xid=0x8):
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | grep -v NXST], [1], [dnl
@@ -30687,17 +30687,17 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
 ])
 
 check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv4-udp
@@ -30711,35 +30711,35 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
 ])
 
 check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-tcp
@@ -30753,39 +30753,39 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY | grep -v NXST], [1], [dnl
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
 ])
 
 check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6-udp
@@ -30799,11 +30799,11 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30811,19 +30811,19 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30831,10 +30831,10 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
 ])
 
@@ -30851,11 +30851,11 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30863,19 +30863,19 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30883,10 +30883,10 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
 ])
 
@@ -30900,12 +30900,12 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30913,21 +30913,21 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30935,12 +30935,12 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
 ])
 
 check ovn-nbctl --wait=hv ls-lb-add sw0 lb-ipv6
@@ -30953,13 +30953,13 @@  OVS_WAIT_UNTIL(
 )
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30967,23 +30967,23 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg1=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ip,reg4=0x58585859,nw_src=42.42.42.2,nw_dst=42.42.42.2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89,ipv6_src=4200::2,ipv6_dst=4200::2 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::89,NXM_OF_IP_PROTO[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x58585858,reg2=0x1f90/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=42.42.42.42,nw_dst=42.42.42.42,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a,nw_src=52.52.52.52,nw_dst=52.52.52.52,tp_dst=4042 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.90,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -30991,12 +30991,12 @@  AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN_REPLY
 ])
 
 AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x58585858,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg1=0x5858585a,reg2=0x1f90/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp,reg2=0x1f90/0xffff,reg4=0x5858585a actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.90))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg1=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ip,reg4=0x58585859 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.89))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=90,ipv6,reg4=0x88000000,reg5=0,reg6=0,reg7=0x89 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::89))
 ])
 
@@ -31093,7 +31093,7 @@  OVS_WAIT_UNTIL(
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=4041 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg1=0x58585858,reg2=0xfc8/0xffff,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp,reg2=0xfc8/0xffff,reg4=0x58585858,nw_src=42.42.42.1,nw_dst=42.42.42.1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=88.88.88.88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
  table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88,ipv6_src=4200::1,ipv6_dst=4200::1,tp_dst=2021 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x86dd,NXM_NX_IPV6_SRC[[]],ipv6_dst=8800::88,nw_proto=17,NXM_OF_UDP_SRC[[]]=NXM_OF_UDP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
@@ -31103,7 +31103,7 @@  NXST_FLOW reply (xid=0x8):
 
 AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_CT_SNAT_HAIRPIN | ofctl_strip_all | grep -v NXST], [0], [dnl
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,tcp6,reg2=0x1f90/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
- table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg1=0x58585858,reg2=0xfc8/0xffff actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
+ table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp,reg2=0xfc8/0xffff,reg4=0x58585858 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=88.88.88.88))
  table=OFTABLE_CT_SNAT_HAIRPIN, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
 ])
 
@@ -36078,15 +36078,15 @@  AT_CHECK([ovs-ofctl dump-groups br-int | grep 'nat(dst=85.85.85.44:8504)' -c], [
 dnl Ensure hairpin flows are correct.
 as hv1
 AT_CHECK([ovs-ofctl dump-flows br-int | grep table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b01,reg2=0x10cd/0xffff,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b02,reg2=0x10ce/0xffff,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b03,reg2=0x10cf/0xffff,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2b2b2b04,reg2=0x10d0/0xffff,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cd/0xffff,reg4=0x2b2b2b01,nw_src=85.85.85.1,nw_dst=85.85.85.1,tp_dst=8501 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.21,nw_dst=85.85.85.21,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10ce/0xffff,reg4=0x2b2b2b02,nw_src=85.85.85.22,nw_dst=85.85.85.22,tp_dst=8502 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.31,nw_dst=85.85.85.31,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10cf/0xffff,reg4=0x2b2b2b03,nw_src=85.85.85.32,nw_dst=85.85.85.32,tp_dst=8503 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.41,nw_dst=85.85.85.41,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.42,nw_dst=85.85.85.42,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.43,nw_dst=85.85.85.43,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=68, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x10d0/0xffff,reg4=0x2b2b2b04,nw_src=85.85.85.44,nw_dst=85.85.85.44,tp_dst=8504 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=69,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=43.43.43.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 dnl Change Chassis_Template_Var mappings
@@ -36137,15 +36137,15 @@  AT_CHECK([ovs-ofctl dump-groups br-int | grep 'nat(dst=84.84.84.44:8404)' -c], [
 dnl Ensure hairpin flows are correct.
 as hv1
 AT_CHECK([ovs-ofctl dump-flows br-int | grep table=OFTABLE_CHK_LB_HAIRPIN | ofctl_strip_all], [0], [dnl
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a01,reg2=0x1069/0xffff,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a02,reg2=0x106a/0xffff,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a03,reg2=0x106b/0xffff,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
- table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg1=0x2a2a2a04,reg2=0x106c/0xffff,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x1069/0xffff,reg4=0x2a2a2a01,nw_src=84.84.84.1,nw_dst=84.84.84.1,tp_dst=8401 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.1,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.21,nw_dst=84.84.84.21,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106a/0xffff,reg4=0x2a2a2a02,nw_src=84.84.84.22,nw_dst=84.84.84.22,tp_dst=8402 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.2,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.31,nw_dst=84.84.84.31,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106b/0xffff,reg4=0x2a2a2a03,nw_src=84.84.84.32,nw_dst=84.84.84.32,tp_dst=8403 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.3,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.41,nw_dst=84.84.84.41,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.42,nw_dst=84.84.84.42,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.43,nw_dst=84.84.84.43,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
+ table=OFTABLE_CHK_LB_HAIRPIN, priority=100,ct_mark=0x2/0x2,tcp,reg2=0x106c/0xffff,reg4=0x2a2a2a04,nw_src=84.84.84.44,nw_dst=84.84.84.44,tp_dst=8404 actions=load:0x1->NXM_NX_REG10[[7]],learn(table=OFTABLE_CHK_LB_HAIRPIN_REPLY,delete_learned,OXM_OF_METADATA[[]],eth_type=0x800,NXM_OF_IP_SRC[[]],ip_dst=42.42.42.4,nw_proto=6,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],load:0x1->NXM_NX_REG10[[7]])
 ])
 
 dnl Remove Chassis_Template_Variables and check that everything is
diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
index 170024a61..f7745b979 100644
--- a/tests/system-ovn-kmod.at
+++ b/tests/system-ovn-kmod.at
@@ -151,12 +151,12 @@  tcp,orig=(src=172.16.1.2,dst=172.16.1.100,sport=<cleared>,dport=<cleared>),reply
 
 dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key external_ids:name=R2))
 AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 's/load:0xc0a80[[0-9]]02/load:0xc0a80<cleared>02/'], [0], [dnl
- table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG8[[0..15]]
+ table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp,metadata=$dp_key,nw_src=172.16.1.2,nw_dst=172.16.1.100,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0xc0a80<cleared>02->NXM_NX_REG4[[]],load:0x50->NXM_NX_REG2[[0..15]]
 ])
 
 check_affinity_flows () {
-n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
-n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
+n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80102,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
+n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ip,reg2=0x50\/0xffff,reg4=0xc0a80202,.*nw_dst=172.16.1.100/{print substr($4,11,length($4)-11)}')
 [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
 echo $?
 }
@@ -452,12 +452,12 @@  tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd
 
 dp_key=$(printf "0x%x" $(fetch_column datapath tunnel_key external_ids:name=R2))
 AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_CHK_LB_AFFINITY --no-stats | strip_cookie | sed -e 's/load:0xfd1[[0-9]]000000000000/load:0xfd1<cleared>000000000000/'], [0], [dnl
- table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG8[[0..15]]
+ table=OFTABLE_CHK_LB_AFFINITY, idle_timeout=60, tcp6,metadata=$dp_key,ipv6_src=fd72::2,ipv6_dst=fd30::1,tp_dst=8080 actions=load:0x1->NXM_NX_REG10[[14]],load:0x2->NXM_NX_XXREG1[[0..63]],load:0xfd1<cleared>000000000000->NXM_NX_XXREG1[[64..127]],load:0x50->NXM_NX_REG2[[0..15]]
 ])
 
 check_affinity_flows () {
-n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
-n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
+n1=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd110000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
+n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk '/priority=150,ct_state=\+new\+trk,ipv6,reg2=0x50\/0xffff,reg4=0xfd120000,.*ipv6_dst=fd30::1\s/{print substr($4,11,length($4)-11)}')
 [[ $n1 -gt 0 -a $n2 -eq 0 ]] || [[ $n1 -eq 0 -a $n2 -gt 0 ]]
 echo $?
 }