@@ -10126,7 +10126,7 @@ build_lrouter_flows_lr_ingress_ip_routing_op(struct ovn_port *op, struct hmap *l
}
static void
-build_lrouter_flows_step_80_od(
+build_lrouter_flows_static_to_flows_od(
struct ovn_datapath *od, struct hmap *lflows, struct hmap *ports)
{
/* Convert the static routes to flows. */
@@ -10175,6 +10175,74 @@ build_lrouter_flows_step_80_od(
}
}
+static void
+build_lrouter_flows_multicast_lookup_od(struct ovn_datapath *od, struct hmap *lflows)
+{
+ struct ds match = DS_EMPTY_INITIALIZER;
+ struct ds actions = DS_EMPTY_INITIALIZER;
+
+ /* IP Multicast lookup. Here we set the output port, adjust TTL and
+ * advance to next table (priority 500).
+ */
+ if (od->nbr) {
+
+ /* Drop IPv6 multicast traffic that shouldn't be forwarded,
+ * i.e., router solicitation and router advertisement.
+ */
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 550,
+ "nd_rs || nd_ra", "drop;");
+
+ if (!od->mcast_info.rtr.relay) {
+ return;
+ }
+
+ struct ovn_igmp_group *igmp_group;
+
+ LIST_FOR_EACH (igmp_group, list_node, &od->mcast_info.groups) {
+ ds_clear(&match);
+ ds_clear(&actions);
+ if (IN6_IS_ADDR_V4MAPPED(&igmp_group->address)) {
+ ds_put_format(&match, "ip4 && ip4.dst == %s ",
+ igmp_group->mcgroup.name);
+ } else {
+ ds_put_format(&match, "ip6 && ip6.dst == %s ",
+ igmp_group->mcgroup.name);
+ }
+ if (od->mcast_info.rtr.flood_static) {
+ ds_put_cstr(&actions,
+ "clone { "
+ "outport = \""MC_STATIC"\"; "
+ "ip.ttl--; "
+ "next; "
+ "};");
+ }
+ ds_put_format(&actions, "outport = \"%s\"; ip.ttl--; next;",
+ igmp_group->mcgroup.name);
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 500,
+ ds_cstr(&match), ds_cstr(&actions));
+ }
+
+ /* If needed, flood unregistered multicast on statically configured
+ * ports. Otherwise drop any multicast traffic.
+ */
+ if (od->mcast_info.rtr.flood_static) {
+ ds_clear(&actions);
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 450,
+ "ip4.mcast || ip6.mcast",
+ "clone { "
+ "outport = \""MC_STATIC"\"; "
+ "ip.ttl--; "
+ "next; "
+ "};");
+ } else {
+ ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 450,
+ "ip4.mcast || ip6.mcast", "drop;");
+ }
+ }
+ ds_destroy(&match);
+ ds_destroy(&actions);
+}
+
static void
build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
struct hmap *lflows, struct shash *meter_groups,
@@ -10238,69 +10306,11 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
}
HMAP_FOR_EACH (od, key_node, datapaths) {
- build_lrouter_flows_step_80_od(od, lflows, ports);
+ build_lrouter_flows_static_to_flows_od(od, lflows, ports);
}
- /* IP Multicast lookup. Here we set the output port, adjust TTL and
- * advance to next table (priority 500).
- */
HMAP_FOR_EACH (od, key_node, datapaths) {
- if (!od->nbr) {
- continue;
- }
-
- /* Drop IPv6 multicast traffic that shouldn't be forwarded,
- * i.e., router solicitation and router advertisement.
- */
- ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 550,
- "nd_rs || nd_ra", "drop;");
-
- if (!od->mcast_info.rtr.relay) {
- continue;
- }
-
- struct ovn_igmp_group *igmp_group;
-
- LIST_FOR_EACH (igmp_group, list_node, &od->mcast_info.groups) {
- ds_clear(&match);
- ds_clear(&actions);
- if (IN6_IS_ADDR_V4MAPPED(&igmp_group->address)) {
- ds_put_format(&match, "ip4 && ip4.dst == %s ",
- igmp_group->mcgroup.name);
- } else {
- ds_put_format(&match, "ip6 && ip6.dst == %s ",
- igmp_group->mcgroup.name);
- }
- if (od->mcast_info.rtr.flood_static) {
- ds_put_cstr(&actions,
- "clone { "
- "outport = \""MC_STATIC"\"; "
- "ip.ttl--; "
- "next; "
- "};");
- }
- ds_put_format(&actions, "outport = \"%s\"; ip.ttl--; next;",
- igmp_group->mcgroup.name);
- ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 500,
- ds_cstr(&match), ds_cstr(&actions));
- }
-
- /* If needed, flood unregistered multicast on statically configured
- * ports. Otherwise drop any multicast traffic.
- */
- if (od->mcast_info.rtr.flood_static) {
- ds_clear(&actions);
- ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 450,
- "ip4.mcast || ip6.mcast",
- "clone { "
- "outport = \""MC_STATIC"\"; "
- "ip.ttl--; "
- "next; "
- "};");
- } else {
- ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING, 450,
- "ip4.mcast || ip6.mcast", "drop;");
- }
+ build_lrouter_flows_multicast_lookup_od(od, lflows);
}
/* Logical router ingress table POLICY: Policy.