Similarly to 80187a8031b6 [0], use eth.src for nd_lookup if nd.tll is zero.
As per RFC 4861 nd.tll is allowed to be 0 in reply to unicast ND NS. This
enables the MAC Binding refresh to work when we receive reply to unicast
ND NS, it should also prevent unnecessary pinctrl calls when we already
know given MAC Binding.
[0] 80187a8031b6 ("ovn-northd: Add flow to use eth.src if nd.tll is 0 in
put_nd() action.")
Signed-off-by: Ales Musil <[email protected]>
---
northd/northd.c | 20 ++++++++++++++++++++
tests/ovn-northd.at | 1 +
2 files changed, 21 insertions(+)
diff --git a/northd/northd.c b/northd/northd.c
index 22108dd82..14e1d699b 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -14899,6 +14899,7 @@ build_neigh_learning_flows_for_lrouter(
* REGBIT_LOOKUP_NEIGHBOR_RESULT bit. If
* "always_learn_from_arp_request" is set to false,
* REGBIT_LOOKUP_NEIGHBOR_IP_RESULT bit is set.
+ * The lookup backs up to eth.src in case when nd.tll == 0.
*
* For IPv6 ND NS packets, table LOOKUP_NEIGHBOR does a lookup
* for the (ip6.src, nd.sll) in the mac binding table using the
@@ -14936,6 +14937,14 @@ build_neigh_learning_flows_for_lrouter(
ovn_lflow_add(lflows, od, S_ROUTER_IN_LOOKUP_NEIGHBOR, 100, "nd_na",
ds_cstr(actions), lflow_ref);
+ ds_clear(actions);
+ ds_put_format(actions, REGBIT_LOOKUP_NEIGHBOR_RESULT
+ " = lookup_nd(inport, nd.target, eth.src); %s%snext;",
+ learn_from_arp_request ? "" :
+ REGBIT_LOOKUP_NEIGHBOR_IP_RESULT" = 1; ", flood);
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_LOOKUP_NEIGHBOR, 105,
+ "nd_na && nd.tll == 0", ds_cstr(actions), lflow_ref);
+
if (!learn_from_arp_request) {
/* Add flow to skip GARP LLA if we don't know it already.
* From RFC 2461, section 4.4, Neighbor Advertisement Message
@@ -14953,6 +14962,17 @@ build_neigh_learning_flows_for_lrouter(
ovn_lflow_add(lflows, od, S_ROUTER_IN_LOOKUP_NEIGHBOR, 110,
"nd_na && ip6.src == fe80::/10 && ip6.dst == ff00::/8",
ds_cstr(actions), lflow_ref);
+
+ ds_clear(actions);
+ ds_put_format(actions, REGBIT_LOOKUP_NEIGHBOR_RESULT
+ " = lookup_nd(inport, nd.target, eth.src); "
+ REGBIT_LOOKUP_NEIGHBOR_IP_RESULT
+ " = lookup_nd_ip(inport, nd.target); %snext;",
+ flood);
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_LOOKUP_NEIGHBOR, 115,
+ "nd_na && nd.tll == 0 && "
+ "ip6.src == fe80::/10 && ip6.dst == ff00::/8",
+ ds_cstr(actions), lflow_ref);
}
ds_clear(actions);
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 562e6a0e8..a61a70035 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -9317,6 +9317,7 @@ AT_CHECK([cat lrflows | grep -e lr_in_lookup_neighbor -e
lr_in_learn_neighbor |
table=??(lr_in_lookup_neighbor), priority=100 , match=(arp.op == 2),
action=(reg9[[2]] = lookup_arp(inport, arp.spa, arp.sha); next;)
table=??(lr_in_lookup_neighbor), priority=100 , match=(nd_na),
action=(reg9[[2]] = lookup_nd(inport, nd.target, nd.tll); next;)
table=??(lr_in_lookup_neighbor), priority=100 , match=(nd_ns),
action=(reg9[[2]] = lookup_nd(inport, ip6.src, nd.sll); next;)
+ table=??(lr_in_lookup_neighbor), priority=105 , match=(nd_na && nd.tll ==
0), action=(reg9[[2]] = lookup_nd(inport, nd.target, eth.src); next;)
])
OVN_CLEANUP_NORTHD
--
2.55.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev