Skip to content

Commit 8dffcf6

Browse files
committed
northd: Add EVPN ARP/ND suppression for logical switches.
Add a new pipeline stage ls_in_arp_nd_pre_lookup (table 26) and EVPN suppression response flows in ls_in_arp_rsp for logical switches with EVPN enabled (dynamic-routing-vni set). The pre-lookup stage calls chk_evpn_arp(arp.tpa) for broadcast ARP requests and chk_evpn_arp(nd.target) for multicast ND solicitations. When the EVPN ARP side table has a matching entry, the resolved MAC is stored in eth.dst and reg9[5] is set. The response flows in ls_in_arp_rsp at priority 40 match when reg9[5] == 1 and generate proxy ARP replies or ND NA replies using the MAC from eth.dst. This prevents unnecessary flooding of ARP/ND requests to remote VTEPs for EVPN-learned addresses. Key design points: - MAC stored in eth.dst (loaded by the EVPN ARP side table). On a miss, eth.dst is left unchanged. - ARP response uses eth.dst <-> eth.src swap to put the resolved MAC into eth.src and the original sender's MAC into eth.dst for the reply. - ND response relies on nd_na{} reading eth.dst for the NA source MAC (nd.tll). - ARP match: arp.op == 1 && reg9[5] == 1. - ND match: nd_ns && reg9[5] == 1. - COPP_ND_NA meter on the ND NA response flow. Reported-at: https://redhat.atlassian.net/browse/FDP-3429 Assisted-by: Claude Opus 4.6, Claude Code Signed-off-by: Ales Musil <amusil@redhat.com>
1 parent cc6a66e commit 8dffcf6

10 files changed

Lines changed: 271 additions & 36 deletions

File tree

Documentation/ref/ovn-logical-flows.7.rst

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ Ingress Table 19: Hairpin
717717
- If logical switch has attached logical switch port of *vtep* type, then a
718718
priority-1000 flow that matches on ``reg0[14]`` register bit for the traffic
719719
received from HW VTEP (ramp) ports. This traffic is passed to ingress table
720-
:ref:`Destination Lookup <ls-in-32>`.
720+
:ref:`Destination Lookup <ls-in-33>`.
721721

722722
- A priority-1 flow that hairpins traffic matched by non-default flows in the
723723
:ref:`Pre-Hairpin <ls-in-17>` table. Hairpinning is done at L2, Ethernet
@@ -978,7 +978,28 @@ refer to either the parent or child ports as applicable to this logical switch.
978978

979979
.. _ls-in-26:
980980

981-
Ingress Table 26: ARP/ND responder
981+
Ingress Table 26: ARP/ND Pre-Lookup
982+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
983+
984+
For logical switches with EVPN enabled (``dynamic-routing-vni`` is set),
985+
this table performs a pre-lookup in the EVPN ARP side table using the
986+
``chk_evpn_arp()`` action. If the target IP address matches an
987+
EVPN-learned entry, the resolved MAC is loaded into ``eth.dst``
988+
and a regbit is set so that the ARP/ND responder table can generate a
989+
proxy reply.
990+
991+
- Priority-5 flows match broadcast ARP requests
992+
(``arp.op == 1 && eth.bcast``) and multicast ND
993+
solicitations (``nd_ns_mcast``), and call ``chk_evpn_arp(arp.tpa)``
994+
or ``chk_evpn_arp(nd.target)`` respectively.
995+
996+
- A priority-0 fallback flow advances to the next table.
997+
998+
For switches without EVPN, only the priority-0 fallback flow is present.
999+
1000+
.. _ls-in-27:
1001+
1002+
Ingress Table 27: ARP/ND responder
9821003
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9831004

9841005
This table implements ARP/ND responder in a logical switch for known IPs. The
@@ -1208,12 +1229,23 @@ proxy ARP/ND behavior. It contains these logical flows:
12081229
These flows are required to respond to an ARP request if an ARP request is
12091230
sent for the IP *vip*.
12101231

1232+
- For logical switches with EVPN enabled, priority-40 flows provide ARP/ND
1233+
suppression for EVPN-learned addresses. These flows match when the EVPN
1234+
ARP pre-lookup (table 26) found a hit (``reg9[5] == 1``):
1235+
1236+
- An ARP suppression flow matches ``arp.op == 1 && reg9[5] == 1`` and
1237+
generates an ARP reply using the MAC from ``eth.dst`` (loaded by
1238+
``chk_evpn_arp()`` in the pre-lookup stage).
1239+
1240+
- An ND suppression flow matches ``nd_ns && reg9[5] == 1`` and
1241+
generates an ND NA reply using the MAC from ``eth.dst``.
1242+
12111243
- One priority-0 fallback flow that matches all packets and advances to the next
12121244
table.
12131245

1214-
.. _ls-in-27:
1246+
.. _ls-in-28:
12151247

1216-
Ingress Table 27: DHCP option processing
1248+
Ingress Table 28: DHCP option processing
12171249
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12181250

12191251
This table adds the DHCPv4 options to a DHCPv4 packet from the logical ports
@@ -1246,9 +1278,9 @@ options. This table also adds flows for the logical ports of type ``external``.
12461278

12471279
- A priority-0 flow that matches all packets to advances to table 16.
12481280

1249-
.. _ls-in-28:
1281+
.. _ls-in-29:
12501282

1251-
Ingress Table 28: DHCP responses
1283+
Ingress Table 29: DHCP responses
12521284
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12531285

12541286
This table implements DHCP responder for the DHCP replies generated by the
@@ -1301,9 +1333,9 @@ previous table.
13011333

13021334
- A priority-0 flow that matches all packets to advances to table 17.
13031335

1304-
.. _ls-in-29:
1336+
.. _ls-in-30:
13051337

1306-
Ingress Table 29 DNS Lookup
1338+
Ingress Table 30 DNS Lookup
13071339
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13081340

13091341
This table looks up and resolves the DNS names to the corresponding configured
@@ -1321,9 +1353,9 @@ IP address(es).
13211353
other kinds of packets, it just stores 0 into reg0[4]. Either way, it
13221354
continues to the next table.
13231355

1324-
.. _ls-in-30:
1356+
.. _ls-in-31:
13251357

1326-
Ingress Table 30 DNS Responses
1358+
Ingress Table 31 DNS Responses
13271359
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13281360

13291361
This table implements DNS responder for the DNS replies generated by the
@@ -1346,9 +1378,9 @@ previous table.
13461378
(This terminates ingress packet processing; the packet does not go to the next
13471379
ingress table.)
13481380

1349-
.. _ls-in-31:
1381+
.. _ls-in-32:
13501382

1351-
Ingress table 31 External ports
1383+
Ingress table 32 External ports
13521384
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13531385

13541386
Traffic from the ``external`` logical ports enter the ingress datapath pipeline
@@ -1373,9 +1405,9 @@ traffic from these ports.
13731405

13741406
- A priority-0 flow that matches all packets to advances to table 20.
13751407

1376-
.. _ls-in-32:
1408+
.. _ls-in-33:
13771409

1378-
Ingress Table 32 Destination Lookup
1410+
Ingress Table 33 Destination Lookup
13791411
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13801412

13811413
This table implements switching behavior. It contains these logical flows:
@@ -1532,9 +1564,9 @@ This table implements switching behavior. It contains these logical flows:
15321564
If there is no entry for ``eth.dst`` in the MAC learning table, then it stores
15331565
``none`` in the ``outport``.
15341566

1535-
.. _ls-in-33:
1567+
.. _ls-in-34:
15361568

1537-
Ingress Table 33 Destination unknown
1569+
Ingress Table 34 Destination unknown
15381570
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15391571

15401572
This table handles the packets whose destination was not found or and looked up
@@ -1695,12 +1727,12 @@ In addition, the following flows are added.
16951727

16961728
- A priority 34000 logical flow is added for each logical port which has DHCPv4
16971729
options defined to allow the DHCPv4 reply packet and which has DHCPv6 options
1698-
defined to allow the DHCPv6 reply packet from :ref:`Ingress Table 28: DHCP
1699-
responses <ls-in-28>`. This is indicated by setting the allow bit.
1730+
defined to allow the DHCPv6 reply packet from :ref:`Ingress Table 29: DHCP
1731+
responses <ls-in-29>`. This is indicated by setting the allow bit.
17001732

17011733
- A priority 34000 logical flow is added for each logical switch datapath
17021734
configured with DNS records with the match ``udp.dst = 53`` to allow the DNS
1703-
reply packet from :ref:`Ingress Table 30: DNS responses <ls-in-30>`. This is
1735+
reply packet from :ref:`Ingress Table 31: DNS responses <ls-in-31>`. This is
17041736
indicated by setting the allow bit.
17051737

17061738
- A priority 34000 logical flow is added for each logical switch datapath with
@@ -1843,7 +1875,7 @@ in ``ct_label.nf_id`` during request processing.
18431875
function group, a priority-99 flow matches ``reg8[21] == 1 && reg8[22] == 1 &&
18441876
reg0[22..29] == id`` and sets ``outport=P; reg8[23] = 1;
18451877
next(pipeline=ingress, table=T)`` where *P* is the ``outport`` of that network
1846-
function and *T* is the ingress table :ref:`Destination Lookup <ls-in-32>`.
1878+
function and *T* is the ingress table :ref:`Destination Lookup <ls-in-33>`.
18471879
This redirects request packets matching ``to-lport`` ACLs with
18481880
network_function_group to the specific network function selected by the Pre
18491881
Network Function stage. The packets are injected back to the ingress pipeline

NEWS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ Post v26.03.0
1515
* Add ECMP/multi-homing support for EVPN FDB entries. FDB entries
1616
backed by a kernel nexthop group are load-balanced via OpenFlow
1717
select groups with weighted buckets.
18+
* Add EVPN ARP/ND suppression for logical switches. When a
19+
broadcast ARP request or multicast ND solicitation targets
20+
an IP address that was learned via EVPN, ovn-northd now
21+
generates proxy-reply flows using a dedicated side table
22+
and the new chk_evpn_arp() action, preventing unnecessary
23+
flooding to remote VTEPs.
1824
- Added "override-connected" option to Logical Router Static Routes to mark
1925
static routes as higher-priority than connected routes, which in turn led
2026
to changes in administrative distance for specific route types. Please see

lib/ovn-util.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,8 +1007,8 @@ ip_address_and_port_from_lb_key(const char *key, char **ip_address,
10071007
*
10081008
* NOTE: If OVN_NORTHD_PIPELINE_CSUM is updated make sure to double check
10091009
* whether an update of OVN_INTERNAL_MINOR_VER is required. */
1010-
#define OVN_NORTHD_PIPELINE_CSUM "2700382548 11305"
1011-
#define OVN_INTERNAL_MINOR_VER 14
1010+
#define OVN_NORTHD_PIPELINE_CSUM "1942087199 11381"
1011+
#define OVN_INTERNAL_MINOR_VER 15
10121012

10131013
/* Returns the OVN version. The caller must free the returned value. */
10141014
char *

lib/ovn-util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ BUILD_ASSERT_DECL(
340340
#define SCTP_ABORT_CHUNK_FLAG_T (1 << 0)
341341

342342
/* The number of tables for the ingress and egress pipelines. */
343-
#define LOG_PIPELINE_INGRESS_LEN 34
343+
#define LOG_PIPELINE_INGRESS_LEN 35
344344
#define LOG_PIPELINE_EGRESS_LEN 16
345345

346346
static inline uint32_t

northd/northd.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2));
204204
#define REGBIT_LOOKUP_NEIGHBOR_RESULT "reg9[2]"
205205
#define REGBIT_LOOKUP_NEIGHBOR_IP_RESULT "reg9[3]"
206206
#define REGBIT_DST_NAT_IP_LOCAL "reg9[4]"
207+
#define REGBIT_EVPN_LOOKUP_MAC "reg9[5]"
207208
#define REGBIT_KNOWN_LB_SESSION "reg9[6]"
208209
#define REGBIT_DHCP_RELAY_REQ_CHK "reg9[7]"
209210
#define REGBIT_DHCP_RELAY_RESP_CHK "reg9[8]"
@@ -10754,6 +10755,85 @@ build_lswitch_arp_nd_responder_default(struct ovn_datapath *od,
1075410755
lflow_ref);
1075510756
}
1075610757

10758+
/* Ingress table ls_in_arp_nd_pre_lookup: EVPN ARP/ND pre-lookup.
10759+
*
10760+
* For EVPN-enabled switches, calls chk_evpn_arp() to look up the
10761+
* IP in the EVPN ARP side table. On a hit, the resolved MAC is
10762+
* stored in eth.dst and REGBIT_EVPN_LOOKUP_MAC is set. The
10763+
* response flow in ls_in_arp_rsp reads the MAC from eth.dst.
10764+
*/
10765+
static void
10766+
build_lswitch_arp_nd_evpn_lookup(struct ovn_datapath *od,
10767+
struct lflow_table *lflows,
10768+
struct lflow_ref *lflow_ref)
10769+
{
10770+
ovs_assert(od->nbs);
10771+
10772+
/* Default: pass through. */
10773+
ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_PRE_LOOKUP, 0, "1",
10774+
"next;", lflow_ref);
10775+
10776+
if (!od->has_evpn_vni) {
10777+
return;
10778+
}
10779+
10780+
/* IPv4: broadcast ARP requests only. */
10781+
ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_PRE_LOOKUP, 5,
10782+
"arp.op == 1 && eth.bcast",
10783+
REGBIT_EVPN_LOOKUP_MAC " = chk_evpn_arp(arp.tpa); next;",
10784+
lflow_ref);
10785+
10786+
/* IPv6: multicast ND solicitations only. */
10787+
ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_PRE_LOOKUP, 5,
10788+
"nd_ns_mcast",
10789+
REGBIT_EVPN_LOOKUP_MAC " = chk_evpn_arp(nd.target); next;",
10790+
lflow_ref);
10791+
}
10792+
10793+
/* Ingress table ls_in_arp_rsp: EVPN ARP/ND suppression response flows.
10794+
*
10795+
* For EVPN-enabled switches, adds flows that proxy-reply to ARP/ND
10796+
* when chk_evpn_arp found a match (REGBIT_EVPN_LOOKUP_MAC == 1).
10797+
* The resolved MAC is already in eth.dst (loaded by the side table).
10798+
*/
10799+
static void
10800+
build_lswitch_arp_nd_evpn_response(struct ovn_datapath *od,
10801+
struct lflow_table *lflows,
10802+
const struct shash *meter_groups,
10803+
struct lflow_ref *lflow_ref)
10804+
{
10805+
ovs_assert(od->nbs);
10806+
10807+
if (!od->has_evpn_vni) {
10808+
return;
10809+
}
10810+
10811+
/* ARP reply (priority 40): ARP request with EVPN hit.
10812+
* eth.dst holds the resolved MAC (loaded by chk_evpn_arp). */
10813+
ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_RSP, 40,
10814+
"arp.op == 1 && " REGBIT_EVPN_LOOKUP_MAC " == 1",
10815+
"eth.dst <-> eth.src; "
10816+
"arp.op = 2; "
10817+
"arp.tha = arp.sha; "
10818+
"arp.sha = eth.src; "
10819+
"arp.tpa <-> arp.spa; "
10820+
"outport = inport; "
10821+
"flags.loopback = 1; "
10822+
"output;",
10823+
lflow_ref);
10824+
10825+
/* ND NA reply (priority 40): ND NS with EVPN hit.
10826+
* eth.dst holds the resolved MAC (loaded by chk_evpn_arp);
10827+
* compose_nd_na() uses ip_flow->dl_dst for eth.src and nd.tll. */
10828+
ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_RSP, 40,
10829+
"nd_ns && " REGBIT_EVPN_LOOKUP_MAC " == 1",
10830+
"nd_na { outport = inport; flags.loopback = 1; output; };",
10831+
lflow_ref,
10832+
WITH_CTRL_METER(copp_meter_get(COPP_ND_NA,
10833+
od->nbs->copp,
10834+
meter_groups)));
10835+
}
10836+
1075710837
/* Ingress table 24: ARP/ND responder for service monitor source ip.
1075810838
* (priority 110)*/
1075910839
static void
@@ -19522,7 +19602,10 @@ build_lswitch_and_lrouter_iterate_by_ls(struct ovn_datapath *od,
1952219602
build_fwd_group_lflows(od, lsi->lflows, NULL);
1952319603
build_lswitch_lflows_admission_control(od, lsi->lflows, NULL);
1952419604
build_lswitch_learn_fdb_od(od, lsi->lflows, NULL);
19605+
build_lswitch_arp_nd_evpn_lookup(od, lsi->lflows, NULL);
1952519606
build_lswitch_arp_nd_responder_default(od, lsi->lflows, NULL);
19607+
build_lswitch_arp_nd_evpn_response(od, lsi->lflows, lsi->meter_groups,
19608+
NULL);
1952619609
build_lswitch_dns_lookup_and_response(od, lsi->lflows, lsi->meter_groups,
1952719610
NULL);
1952819611
build_lswitch_dhcp_and_dns_defaults(od, lsi->lflows, NULL);

northd/northd.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -541,14 +541,16 @@ ls_has_localnet_port(const struct ovn_datapath *od)
541541
"ls_in_pre_network_function") \
542542
PIPELINE_STAGE(SWITCH, IN, STATEFUL, 24, "ls_in_stateful") \
543543
PIPELINE_STAGE(SWITCH, IN, NF, 25, "ls_in_network_function") \
544-
PIPELINE_STAGE(SWITCH, IN, ARP_ND_RSP, 26, "ls_in_arp_rsp") \
545-
PIPELINE_STAGE(SWITCH, IN, DHCP_OPTIONS, 27, "ls_in_dhcp_options") \
546-
PIPELINE_STAGE(SWITCH, IN, DHCP_RESPONSE, 28, "ls_in_dhcp_response") \
547-
PIPELINE_STAGE(SWITCH, IN, DNS_LOOKUP, 29, "ls_in_dns_lookup") \
548-
PIPELINE_STAGE(SWITCH, IN, DNS_RESPONSE, 30, "ls_in_dns_response") \
549-
PIPELINE_STAGE(SWITCH, IN, EXTERNAL_PORT, 31, "ls_in_external_port") \
550-
PIPELINE_STAGE(SWITCH, IN, L2_LKUP, 32, "ls_in_l2_lkup") \
551-
PIPELINE_STAGE(SWITCH, IN, L2_UNKNOWN, 33, "ls_in_l2_unknown") \
544+
PIPELINE_STAGE(SWITCH, IN, ARP_ND_PRE_LOOKUP, 26, \
545+
"ls_in_arp_nd_pre_lookup") \
546+
PIPELINE_STAGE(SWITCH, IN, ARP_ND_RSP, 27, "ls_in_arp_rsp") \
547+
PIPELINE_STAGE(SWITCH, IN, DHCP_OPTIONS, 28, "ls_in_dhcp_options") \
548+
PIPELINE_STAGE(SWITCH, IN, DHCP_RESPONSE, 29, "ls_in_dhcp_response") \
549+
PIPELINE_STAGE(SWITCH, IN, DNS_LOOKUP, 30, "ls_in_dns_lookup") \
550+
PIPELINE_STAGE(SWITCH, IN, DNS_RESPONSE, 31, "ls_in_dns_response") \
551+
PIPELINE_STAGE(SWITCH, IN, EXTERNAL_PORT, 32, "ls_in_external_port") \
552+
PIPELINE_STAGE(SWITCH, IN, L2_LKUP, 33, "ls_in_l2_lkup") \
553+
PIPELINE_STAGE(SWITCH, IN, L2_UNKNOWN, 34, "ls_in_l2_unknown") \
552554
\
553555
/* Logical switch egress stages. */ \
554556
PIPELINE_STAGE(SWITCH, OUT, LOOKUP_FDB, 0, "ls_out_lookup_fdb") \

ovn-sb.ovsschema

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "OVN_Southbound",
3-
"version": "21.8.0",
4-
"cksum": "614397313 36713",
3+
"version": "21.9.0",
4+
"cksum": "3029208442 36713",
55
"tables": {
66
"SB_Global": {
77
"columns": {
@@ -103,7 +103,7 @@
103103
"egress"]]}}},
104104
"table_id": {"type": {"key": {"type": "integer",
105105
"minInteger": 0,
106-
"maxInteger": 33}}},
106+
"maxInteger": 34}}},
107107
"priority": {"type": {"key": {"type": "integer",
108108
"minInteger": 0,
109109
"maxInteger": 65535}}},

tests/ovn-northd.at

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19502,6 +19502,45 @@ OVN_CLEANUP_NORTHD
1950219502
AT_CLEANUP
1950319503
])
1950419504

19505+
OVN_FOR_EACH_NORTHD_NO_HV([
19506+
AT_SETUP([LS EVPN ARP/ND suppression flows])
19507+
AT_KEYWORDS([dynamic-routing evpn])
19508+
ovn_start
19509+
19510+
AS_BOX([EVPN switch])
19511+
check ovn-nbctl --wait=sb \
19512+
-- ls-add ls-evpn \
19513+
-- set logical_switch ls-evpn other_config:dynamic-routing-vni=10
19514+
19515+
dnl Verify ls_in_arp_nd_pre_lookup flows use chk_evpn_arp.
19516+
AT_CHECK([ovn-sbctl lflow-list ls-evpn | grep ls_in_arp_nd_pre_lookup | ovn_strip_lflows], [0], [dnl
19517+
table=??(ls_in_arp_nd_pre_lookup), priority=0 , match=(1), action=(next;)
19518+
table=??(ls_in_arp_nd_pre_lookup), priority=5 , match=(arp.op == 1 && eth.bcast), action=(reg9[[5]] = chk_evpn_arp(arp.tpa); next;)
19519+
table=??(ls_in_arp_nd_pre_lookup), priority=5 , match=(nd_ns_mcast), action=(reg9[[5]] = chk_evpn_arp(nd.target); next;)
19520+
])
19521+
19522+
dnl Verify ls_in_arp_rsp EVPN ARP suppression flow at priority 40.
19523+
AT_CHECK([ovn-sbctl lflow-list ls-evpn | grep ls_in_arp_rsp | grep 'priority=40' | ovn_strip_lflows], [0], [dnl
19524+
table=??(ls_in_arp_rsp ), priority=40 , match=(arp.op == 1 && reg9[[5]] == 1), action=(eth.dst <-> eth.src; arp.op = 2; arp.tha = arp.sha; arp.sha = eth.src; arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;)
19525+
table=??(ls_in_arp_rsp ), priority=40 , match=(nd_ns && reg9[[5]] == 1), action=(nd_na { outport = inport; flags.loopback = 1; output; };)
19526+
])
19527+
19528+
AS_BOX([Non-EVPN switch])
19529+
check ovn-nbctl --wait=sb \
19530+
-- ls-add ls-plain
19531+
19532+
dnl Non-EVPN switch should have only default next; in pre_lookup.
19533+
AT_CHECK([ovn-sbctl lflow-list ls-plain | grep ls_in_arp_nd_pre_lookup | ovn_strip_lflows], [0], [dnl
19534+
table=??(ls_in_arp_nd_pre_lookup), priority=0 , match=(1), action=(next;)
19535+
])
19536+
19537+
dnl Non-EVPN switch should have no EVPN suppression flows (no priority 40 with EVPN regbit).
19538+
AT_CHECK([ovn-sbctl lflow-list ls-plain | grep ls_in_arp_rsp | grep 'priority=40'], [1])
19539+
19540+
OVN_CLEANUP_NORTHD
19541+
AT_CLEANUP
19542+
])
19543+
1950519544
OVN_FOR_EACH_NORTHD_NO_HV([
1950619545
AT_SETUP([LS EVPN conntrack skip with stateful ACLs and LBs])
1950719546
AT_KEYWORDS([dynamic-routing])

0 commit comments

Comments
 (0)