Multicast na LAN não recebido por todos os hosts

0

Estou escrevendo um aplicativo para obter atualizações multicast de um dispositivo de medição de corrente conectado à minha LAN. O dispositivo envia pacotes para o grupo multicast 224.192.32.19:22600 a cada poucos minutos, e eu posso lê-los bem em um dos hosts (um pi de framboesa).

O mais estranho é que, quando tentei adicionar um segundo host do listener, não consegui encontrar nenhum tráfego multicast desse grupo em sua interface.

O layout da rede é o seguinte:

Todaaredeestánomesmolocalfísico,sobamesmasub-rede192.168.x.x.Entreoremetenteeo(s)receptor(es),hádoisroteadoresTP-LinkWDR3600executandooDD-WRTeumswitchgigabitTP-Linkde8portas"dumb" (usado como um expansor de portas). Tudo é conectado via ethernet.

Mais detalhes:

  • Os hosts "NOK" incluem um laptop com Windows 7, Linux VM conectado no mesmo laptop e um laptop Linux diferente
  • conectando um host "NOK" diretamente ao comutador dumb onde o host "OK" não tem efeito
  • ligar diretamente ao roteador secundário (1 "salto" de ethernet mais próximo da fonte) não tem efeito
  • Não consigo encontrar nenhum tráfego IGMP para esse grupo em nenhum dos hosts, incluindo o de trabalho
  • bisbilhotando o tráfego de rede para IGMP, posso ver duas solicitações de associação saindo para 224.0.0.22 quando meu aplicativo é iniciado.

A associação ao grupo é registrada pelo kernel e é exibida por

~ $ netstat -ng
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.192.32.19
eth0            1      224.0.0.251
eth0            1      224.0.0.1

O código Python que inicializa o soquete do aplicativo ouvinte é este:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.mcast_group, self.mcast_port))
mreq = struct.pack("4sl", socket.inet_aton(self.mcast_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

O que estou perdendo aqui? Simplesmente executar o aplicativo ouvinte no host funcional foi o suficiente para receber o tráfego multicast, por que não é o caso dos ouvintes adicionais?

    
por André Fernandes 29.01.2017 / 20:31

1 resposta

0

Acontece que este era um problema do roteador, depois de reiniciar o roteador secundário, todos os hosts começaram a receber os pacotes multicast conforme o esperado.

Eu diria que foi um erro DD-WRT ou alguma corrupção do estado que comprometeu a distribuição de tráfego multicast.

    
por 30.01.2017 / 14:51