@@ -10272,96 +10272,25 @@ build_lrouter_flows_ingress_policy_od(
}
}
-static void
-build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
- struct hmap *lflows, struct shash *meter_groups,
- struct hmap *lbs)
+static void build_lrouter_flows_arp_resolve_od(
+ struct ovn_datapath *od, struct hmap *lflows)
{
- /* This flow table structure is documented in ovn-northd(8), so please
- * update ovn-northd.8.xml if you change anything. */
-
- struct ds match = DS_EMPTY_INITIALIZER;
- struct ds actions = DS_EMPTY_INITIALIZER;
-
- struct ovn_datapath *od;
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_ingress_table_0_od(od, lflows);
- }
-
- struct ovn_port *op;
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_flows_ingress_table_0_op(op, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_arp_nd_mac_learn_od(od, lflows);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_flows_arp_nd_mac_learn_op(op, lflows);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_flows_table_3_ip_input_op(op, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_table_3_ip_input_od(od, lflows);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_dhcp_reply_op(op, lflows);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_ip_input_chassis_redirect_op(op, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_NAT_defrag_lb_od(
- od, lflows, lbs, meter_groups);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_flows_NAT_defrag_lb_op(op, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_lr_ingress_ra_od(od, lflows);
- }
-
- HMAP_FOR_EACH (op, key_node, ports) {
- build_lrouter_flows_lr_ingress_ip_routing_op(op, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_static_to_flows_od(od, lflows, ports);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_multicast_lookup_od(od, lflows);
- }
-
- HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_ingress_policy_od(od, lflows, ports);
- }
-
-
/* XXX destination unreachable */
/* Local router ingress table ARP_RESOLVE: ARP Resolution.
*
* Multicast packets already have the outport set so just advance to next
* table (priority 500). */
- HMAP_FOR_EACH (od, key_node, datapaths) {
- if (!od->nbr) {
- continue;
- }
+ if (od->nbr) {
ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_RESOLVE, 500,
"ip4.mcast || ip6.mcast", "next;");
}
+}
+static void build_lrouter_flows_arp_resolve_op(
+ struct ovn_port *op, struct hmap *lflows, struct hmap *ports)
+{
/* Local router ingress table ARP_RESOLVE: ARP Resolution.
*
* Any unicast packet that reaches this table is an IP packet whose
@@ -10371,11 +10300,11 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
* REG_NEXT_HOP_IPV4/REG_NEXT_HOP_IPV6 into an output port in outport and
* an Ethernet address in eth.dst.
*/
- HMAP_FOR_EACH (op, key_node, ports) {
- if (op->nbsp && !lsp_is_enabled(op->nbsp)) {
- continue;
- }
+ struct ds match = DS_EMPTY_INITIALIZER;
+ struct ds actions = DS_EMPTY_INITIALIZER;
+
+ if (!op->nbsp || lsp_is_enabled(op->nbsp)) {
if (op->nbrp) {
/* This is a logical router port. If next-hop IP address in
* REG_NEXT_HOP_IPV4/REG_NEXT_HOP_IPV6 matches IP address of this
@@ -10544,7 +10473,7 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
"virtual-parents");
if (!vip || !virtual_parents ||
!ip_parse(vip, &ip) || !op->sb) {
- continue;
+ goto arp_resolve_op_done;
}
if (!op->sb->virtual_parent || !op->sb->virtual_parent[0] ||
@@ -10584,7 +10513,7 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
struct ovn_port *vp =
ovn_port_find(ports, op->sb->virtual_parent);
if (!vp || !vp->nbsp) {
- continue;
+ goto arp_resolve_op_done;
}
for (size_t i = 0; i < vp->n_lsp_addrs; i++) {
@@ -10643,18 +10572,18 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
const char *peer_name = smap_get(&op->nbsp->options,
"router-port");
if (!peer_name) {
- continue;
+ goto arp_resolve_op_done;
}
struct ovn_port *peer = ovn_port_find(ports, peer_name);
if (!peer || !peer->nbrp) {
- continue;
+ goto arp_resolve_op_done;
}
if (peer->od->nbr &&
smap_get_bool(&peer->od->nbr->options,
"dynamic_neigh_routers", false)) {
- continue;
+ goto arp_resolve_op_done;
}
for (size_t i = 0; i < op->od->n_router_ports; i++) {
@@ -10706,18 +10635,108 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
}
}
}
+arp_resolve_op_done:
+ ds_destroy(&match);
+ ds_destroy(&actions);
+}
- HMAP_FOR_EACH (od, key_node, datapaths) {
- if (!od->nbr) {
- continue;
- }
-
+static void build_lrouter_flows_arp_resolve_finalize_od(
+ struct ovn_datapath *od, struct hmap *lflows)
+{
+ if (od->nbr) {
ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_RESOLVE, 0, "ip4",
"get_arp(outport, " REG_NEXT_HOP_IPV4 "); next;");
ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_RESOLVE, 0, "ip6",
"get_nd(outport, " REG_NEXT_HOP_IPV6 "); next;");
}
+}
+
+static void
+build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
+ struct hmap *lflows, struct shash *meter_groups,
+ struct hmap *lbs)
+{
+ /* This flow table structure is documented in ovn-northd(8), so please
+ * update ovn-northd.8.xml if you change anything. */
+
+ struct ds match = DS_EMPTY_INITIALIZER;
+ struct ds actions = DS_EMPTY_INITIALIZER;
+
+ struct ovn_datapath *od;
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_ingress_table_0_od(od, lflows);
+ }
+
+ struct ovn_port *op;
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_ingress_table_0_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_arp_nd_mac_learn_od(od, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_arp_nd_mac_learn_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_table_3_ip_input_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_table_3_ip_input_od(od, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_dhcp_reply_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_ip_input_chassis_redirect_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_NAT_defrag_lb_od(
+ od, lflows, lbs, meter_groups);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_NAT_defrag_lb_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_lr_ingress_ra_od(od, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_lr_ingress_ip_routing_op(op, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_static_to_flows_od(od, lflows, ports);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_multicast_lookup_od(od, lflows);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_ingress_policy_od(od, lflows, ports);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_arp_resolve_od(od, lflows);
+ }
+
+ HMAP_FOR_EACH (op, key_node, ports) {
+ build_lrouter_flows_arp_resolve_op(op, lflows, ports);
+ }
+
+ HMAP_FOR_EACH (od, key_node, datapaths) {
+ build_lrouter_flows_arp_resolve_finalize_od(od, lflows);
+ }
/* Local router ingress table CHK_PKT_LEN: Check packet length.
*