@@ -6669,6 +6669,13 @@ static void
build_lswitch_external_ports_op(
struct ovn_port *op, struct hmap *lflows);
+/* Ingress table 19: Destination lookup, broadcast and multicast handling
+ * (priority 70 - 100). */
+static void
+build_lswitch_destination_lookup_brodcast_multicast_od(
+ struct ovn_datapath *od, struct hmap *lflows,
+ char *svc_check_match, struct ds *actions);
+
/*
* Do not remove this comment - it is here as a marker to
* make diffs readable.
@@ -6747,85 +6754,9 @@ build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
}
char *svc_check_match = xasprintf("eth.dst == %s", svc_monitor_mac);
- /* Ingress table 19: Destination lookup, broadcast and multicast handling
- * (priority 70 - 100). */
HMAP_FOR_EACH (od, key_node, datapaths) {
- if (!od->nbs) {
- continue;
- }
-
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 110, svc_check_match,
- "handle_svc_check(inport);");
-
- struct mcast_switch_info *mcast_sw_info = &od->mcast_info.sw;
-
- if (mcast_sw_info->enabled) {
- ds_clear(&actions);
- if (mcast_sw_info->flood_reports) {
- ds_put_cstr(&actions,
- "clone { "
- "outport = \""MC_MROUTER_STATIC"\"; "
- "output; "
- "};");
- }
- ds_put_cstr(&actions, "igmp;");
- /* Punt IGMP traffic to controller. */
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100,
- "ip4 && ip.proto == 2", ds_cstr(&actions));
-
- /* Punt MLD traffic to controller. */
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100,
- "mldv1 || mldv2", ds_cstr(&actions));
-
- /* Flood all IP multicast traffic destined to 224.0.0.X to all
- * ports - RFC 4541, section 2.1.2, item 2.
- */
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 85,
- "ip4.mcast && ip4.dst == 224.0.0.0/24",
- "outport = \""MC_FLOOD"\"; output;");
-
- /* Flood all IPv6 multicast traffic destined to reserved
- * multicast IPs (RFC 4291, 2.7.1).
- */
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 85,
- "ip6.mcast_flood",
- "outport = \""MC_FLOOD"\"; output;");
-
- /* Forward uregistered IP multicast to routers with relay enabled
- * and to any ports configured to flood IP multicast traffic.
- * If configured to flood unregistered traffic this will be
- * handled by the L2 multicast flow.
- */
- if (!mcast_sw_info->flood_unregistered) {
- ds_clear(&actions);
-
- if (mcast_sw_info->flood_relay) {
- ds_put_cstr(&actions,
- "clone { "
- "outport = \""MC_MROUTER_FLOOD"\"; "
- "output; "
- "}; ");
- }
-
- if (mcast_sw_info->flood_static) {
- ds_put_cstr(&actions, "outport =\""MC_STATIC"\"; output;");
- }
-
- /* Explicitly drop the traffic if relay or static flooding
- * is not configured.
- */
- if (!mcast_sw_info->flood_relay &&
- !mcast_sw_info->flood_static) {
- ds_put_cstr(&actions, "drop;");
- }
-
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 80,
- "ip4.mcast || ip6.mcast", ds_cstr(&actions));
- }
- }
-
- ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 70, "eth.mcast",
- "outport = \""MC_FLOOD"\"; output;");
+ build_lswitch_destination_lookup_brodcast_multicast_od(
+ od, lflows, svc_check_match, &actions);
}
free(svc_check_match);
@@ -7430,6 +7361,88 @@ build_lswitch_external_ports_op(
}
}
+static void
+build_lswitch_destination_lookup_brodcast_multicast_od(
+ struct ovn_datapath *od, struct hmap *lflows,
+ char *svc_check_match, struct ds *actions)
+{
+ if (od->nbs) {
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 110, svc_check_match,
+ "handle_svc_check(inport);");
+
+ struct mcast_switch_info *mcast_sw_info = &od->mcast_info.sw;
+
+ if (mcast_sw_info->enabled) {
+ ds_clear(actions);
+ if (mcast_sw_info->flood_reports) {
+ ds_put_cstr(actions,
+ "clone { "
+ "outport = \""MC_MROUTER_STATIC"\"; "
+ "output; "
+ "};");
+ }
+ ds_put_cstr(actions, "igmp;");
+ /* Punt IGMP traffic to controller. */
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100,
+ "ip4 && ip.proto == 2", ds_cstr(actions));
+
+ /* Punt MLD traffic to controller. */
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100,
+ "mldv1 || mldv2", ds_cstr(actions));
+
+ /* Flood all IP multicast traffic destined to 224.0.0.X to all
+ * ports - RFC 4541, section 2.1.2, item 2.
+ */
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 85,
+ "ip4.mcast && ip4.dst == 224.0.0.0/24",
+ "outport = \""MC_FLOOD"\"; output;");
+
+ /* Flood all IPv6 multicast traffic destined to reserved
+ * multicast IPs (RFC 4291, 2.7.1).
+ */
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 85,
+ "ip6.mcast_flood",
+ "outport = \""MC_FLOOD"\"; output;");
+
+ /* Forward uregistered IP multicast to routers with relay enabled
+ * and to any ports configured to flood IP multicast traffic.
+ * If configured to flood unregistered traffic this will be
+ * handled by the L2 multicast flow.
+ */
+ if (!mcast_sw_info->flood_unregistered) {
+ ds_clear(actions);
+
+ if (mcast_sw_info->flood_relay) {
+ ds_put_cstr(actions,
+ "clone { "
+ "outport = \""MC_MROUTER_FLOOD"\"; "
+ "output; "
+ "}; ");
+ }
+
+ if (mcast_sw_info->flood_static) {
+ ds_put_cstr(actions, "outport =\""MC_STATIC"\"; output;");
+ }
+
+ /* Explicitly drop the traffic if relay or static flooding
+ * is not configured.
+ */
+ if (!mcast_sw_info->flood_relay &&
+ !mcast_sw_info->flood_static) {
+ ds_put_cstr(actions, "drop;");
+ }
+
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 80,
+ "ip4.mcast || ip6.mcast", ds_cstr(actions));
+ }
+ }
+
+ ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 70, "eth.mcast",
+ "outport = \""MC_FLOOD"\"; output;");
+ }
+
+}
+
/* Returns a string of the IP address of the router port 'op' that
* overlaps with 'ip_s". If one is not found, returns NULL.
*