¿Debería el kernel de Linux realizar una "reunión IGMP" al conectarse?

¿Debería el kernel de Linux realizar una "reunión IGMP" al conectarse?

Esta pregunta es casi la misma que una pregunta anterior sin respuesta encontradaaquíen la lista de correo del núcleo (créditos a Simon Paillard). Aquí hay un resumen (parafraseado):

Cuando un host que ejecuta el kernel de Linux está conectado a un conmutador con la vigilancia IGMP habilitada, tenemos el siguiente escenario:

  • Una interfaz es miembro de un grupo de multidifusión. (Unirse) se realizan informes.
  • Se produce una falla en el enlace (por ejemplo, desconexión del cable).
  • El conmutador vacía la membresía de multidifusión para ese puerto.
  • El enlace vuelve a funcionar (por ejemplo, el cable se vuelve a conectar).
  • En este punto, el kernel espera una consulta del conmutador antes de enviar una nueva solicitud de membresía de IGMP.
  • Esto significa que la aplicación pierde paquetes entre el momento en que el enlace vuelve a funcionar y la consulta general programada del nido (valor predeterminado en RFC: 125 segundos).

Parece indicar que el kernel de Linux no se encarga de reenviar uniones después de una reconexión. ¿Alguien con un conocimiento más profundo de la especificación IGMP puede confirmar si se supone que las reincorporaciones deben reenviarse tras la reconexión?

¿Es el trabajo de la aplicación de nivel de usuario verificar si hay fallas en los enlaces y volver a emitir solicitudes de unión al conmutador al momento de la reconexión?

Curiosamente, el kernel de Windows parece encargarse de reenviar las solicitudes de unión cuando los enlaces vuelven a aparecer después de estar inactivos.

Respuesta1

Lógicamente creo que sí. Porque puedo verlo en el código IPv6 de Linux. Y elRFCdice que se supone que el espionaje MLD de IPv6 es muy similar al espionaje IGMP de IPv4.

En la práctica, este código addrconf se agregó para ipv6, donde el kernel admite DAD y RS/RA. No me sorprendería que no hubiera un equivalente para ipv4 en las versiones actuales del kernel.

    } else if (event == NETDEV_CHANGE) {
        if (!addrconf_link_ready(dev)) {
            /* device is still not ready. */
            rt6_sync_down_dev(dev, event);
            break;
        }

        if (!IS_ERR_OR_NULL(idev)) {
            if (idev->if_flags & IF_READY) {
                /* device is already configured -
                 * but resend MLD reports, we might
                 * have roamed and need to update
                 * multicast snooping switches
                 */
                ipv6_mc_up(idev);
                change_info = ptr;
                if (change_info->flags_changed & IFF_NOARP)
                    addrconf_dad_run(idev, true);
                rt6_sync_up(dev, RTNH_F_LINKDOWN);
                break;
            }
            idev->if_flags |= IF_READY;
        }

        pr_info("ADDRCONF(NETDEV_CHANGE): %s: link becomes ready\n",
            dev->name);

https://elixir.bootlin.com/linux/v5.1/source/net/ipv6/addrconf.c#L3546

información relacionada