On 1/28/25 8:22 AM, Ales Musil wrote:
> The code for LS IGMP flows didn't check if the datapath is a switch
> or router, that led to erroneous log message:
> 
> Too many active mcast flows: 0.
> 
> To prevent that add check that the datapath is indeed belonging
> to LS rather than LR.
> 
> Acked-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
> Signed-off-by: Ales Musil <amu...@redhat.com>
> ---
> v3: Rebase on top of latest main.
> ---

Thanks, Ales and Lorenzo!

Applied to main, 24.09 and 24.03.

Regards,
Dumitru

>  northd/northd.c | 123 ++++++++++++++++++++++++------------------------
>  1 file changed, 62 insertions(+), 61 deletions(-)
> 
> diff --git a/northd/northd.c b/northd/northd.c
> index 3ff4326e6..9f2a06fd1 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -10199,78 +10199,79 @@ build_lswitch_ip_mcast_igmp_mld(struct 
> ovn_igmp_group *igmp_group,
>                                  struct ds *actions,
>                                  struct ds *match)
>  {
> -    uint64_t dummy;
> +    if (!(igmp_group->datapath && igmp_group->datapath->nbs)) {
> +        return;
> +    }
>  
> -    if (igmp_group->datapath) {
> +    uint64_t dummy;
>  
> -        ds_clear(match);
> -        ds_clear(actions);
> +    ds_clear(match);
> +    ds_clear(actions);
>  
> -        struct mcast_switch_info *mcast_sw_info =
> -            &igmp_group->datapath->mcast_info.sw;
> -        uint64_t table_size = mcast_sw_info->table_size;
> +    struct mcast_switch_info *mcast_sw_info =
> +        &igmp_group->datapath->mcast_info.sw;
> +    uint64_t table_size = mcast_sw_info->table_size;
>  
> -        if (IN6_IS_ADDR_V4MAPPED(&igmp_group->address)) {
> -            /* RFC 4541, section 2.1.2, item 2: Skip groups in the 224.0.0.X
> -             * range.
> -             */
> -            ovs_be32 group_address =
> -                in6_addr_get_mapped_ipv4(&igmp_group->address);
> -            if (ip_is_local_multicast(group_address)) {
> -                return;
> -            }
> -            if (atomic_compare_exchange_strong(
> -                        &mcast_sw_info->active_v4_flows, &table_size,
> -                        mcast_sw_info->table_size)) {
> -                static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 
> 1);
> -
> -                VLOG_INFO_RL(&rl, "Too many active mcast flows: %"PRIu64,
> -                             mcast_sw_info->active_v4_flows);
> -                return;
> -            }
> -            atomic_add(&mcast_sw_info->active_v4_flows, 1, &dummy);
> -            ds_put_format(match, "eth.mcast && ip4 && ip4.dst == %s ",
> -                          igmp_group->mcgroup.name);
> -        } else {
> -            /* RFC 4291, section 2.7.1: Skip groups that correspond to all
> -             * hosts, all link-local routers and all site routers.
> -             */
> -            if (ipv6_is_all_hosts(&igmp_group->address) ||
> -                ipv6_is_all_router(&igmp_group->address) ||
> -                ipv6_is_all_site_router(&igmp_group->address)) {
> -                return;
> -            }
> -            if (atomic_compare_exchange_strong(
> -                        &mcast_sw_info->active_v6_flows, &table_size,
> -                        mcast_sw_info->table_size)) {
> -                return;
> -            }
> -            atomic_add(&mcast_sw_info->active_v6_flows, 1, &dummy);
> -            ds_put_format(match, "eth.mcast && ip6 && ip6.dst == %s ",
> -                          igmp_group->mcgroup.name);
> +    if (IN6_IS_ADDR_V4MAPPED(&igmp_group->address)) {
> +        /* RFC 4541, section 2.1.2, item 2: Skip groups in the 224.0.0.X
> +         * range.
> +         */
> +        ovs_be32 group_address =
> +            in6_addr_get_mapped_ipv4(&igmp_group->address);
> +        if (ip_is_local_multicast(group_address)) {
> +            return;
>          }
> +        if (atomic_compare_exchange_strong(
> +                    &mcast_sw_info->active_v4_flows, &table_size,
> +                    mcast_sw_info->table_size)) {
> +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
>  
> -        /* Also flood traffic to all multicast routers with relay enabled. */
> -        if (mcast_sw_info->flood_relay) {
> -            ds_put_cstr(actions,
> -                        "clone { "
> -                            "outport = \""MC_MROUTER_FLOOD "\"; "
> -                            "output; "
> -                        "};");
> +            VLOG_INFO_RL(&rl, "Too many active mcast flows: %"PRIu64,
> +                         mcast_sw_info->active_v4_flows);
> +            return;
>          }
> -        if (mcast_sw_info->flood_static) {
> -            ds_put_cstr(actions,
> -                        "clone { "
> -                            "outport =\""MC_STATIC"\"; "
> -                            "output; "
> -                        "};");
> +        atomic_add(&mcast_sw_info->active_v4_flows, 1, &dummy);
> +        ds_put_format(match, "eth.mcast && ip4 && ip4.dst == %s ",
> +                      igmp_group->mcgroup.name);
> +    } else {
> +        /* RFC 4291, section 2.7.1: Skip groups that correspond to all
> +         * hosts, all link-local routers and all site routers.
> +         */
> +        if (ipv6_is_all_hosts(&igmp_group->address) ||
> +            ipv6_is_all_router(&igmp_group->address) ||
> +            ipv6_is_all_site_router(&igmp_group->address)) {
> +            return;
> +        }
> +        if (atomic_compare_exchange_strong(
> +                    &mcast_sw_info->active_v6_flows, &table_size,
> +                    mcast_sw_info->table_size)) {
> +            return;
>          }
> -        ds_put_format(actions, "outport = \"%s\"; output; ",
> +        atomic_add(&mcast_sw_info->active_v6_flows, 1, &dummy);
> +        ds_put_format(match, "eth.mcast && ip6 && ip6.dst == %s ",
>                        igmp_group->mcgroup.name);
> +    }
>  
> -        ovn_lflow_add(lflows, igmp_group->datapath, S_SWITCH_IN_L2_LKUP,
> -                      90, ds_cstr(match), ds_cstr(actions), NULL);
> +    /* Also flood traffic to all multicast routers with relay enabled. */
> +    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,
> +                    "clone { "
> +                        "outport =\""MC_STATIC"\"; "
> +                        "output; "
> +                    "};");
> +    }
> +    ds_put_format(actions, "outport = \"%s\"; output; ",
> +                  igmp_group->mcgroup.name);
> +
> +    ovn_lflow_add(lflows, igmp_group->datapath, S_SWITCH_IN_L2_LKUP,
> +                  90, ds_cstr(match), ds_cstr(actions), NULL);
>  }
>  
>  /* Ingress table 25: Destination lookup, unicast handling (priority 50), */

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to