Pergunta

Nós funcionamos em um problema espinhoso. Estamos escrevendo um programa c ++ que recebe tráfego UDP multicast. Estamos no processo de mover as nossas aplicações para um ambiente de rede diferente e nossa equipe de operações solicitou que apoiamos anúncios adesão IGMPv3 de nossas aplicações. As investigações iniciais indicam que o Linux kernel 2.6 do apoio IGMPv3. Portanto, eu estou perplexo que quando corremos tcpdump vemos os seguintes traços de saída:

[rtv@myhost]$ sudo /usr/sbin/tcpdump -i eth1.22 igmp
tcpdump: listening on eth1.22
00:20:09.007094 switch-a.stage > ALL-SYSTEMS.MCAST.NET: igmp query v2 [max resp time 20] [ttl 1]
00:20:09.241946 10.129.22.236 > 232.0.1.10: igmp v2 report 232.0.1.10 (DF) [tos 0xc0]  [ttl 1]
00:20:10.472159 10.129.22.236 > 236.0.1.101: igmp v2 report 236.0.1.101 (DF) [tos 0xc0]  [ttl 1]

44 packets received by filter

O meu entendimento é que se pode forçar o kernel a usar uma versão inferior do IGMP, especificando um valor diferente de zero na /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version arquivo; No entanto, eu confirmou que o arquivo tem uma configuração de valor zero.

O aplicativo está usando o código a seguir para se juntar ao grupo multicast:

... joinMulticast(in_addr mcast_addr, in_addr interface_addr)
{
  struct ip_mreq  mcast_req;

  mcast_req.imr_multiaddr.s_addr = mcast_addr;
  mcast_req.imr_interface.s_addr = interface_addr;
  int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP,
    (char*)&theMulti, sizeof(theMulti));
  // handle errors etc.
  // ...
}

Existe algo extra que precisamos para incluir no programa de origem para forçar IGMPv3?

Foi útil?

Solução

Algumas coisas a ter em conta.

A primeira é que (como eu o entendo) definindo o /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version a 0 não significa "utilização v3", mas na verdade define como "auto". Eu acredito que você pode configurá-lo para 3 para forçá-lo usar v3 IGMP.

No entanto, a outra coisa a ter em conta é que o comportamento da pilha IGMP é determinada pelo ambiente que ele se encontra. Se a sua caixa de linux está recebendo consultas de membros IGMP V2 de um montante igmp roteador, então eu acredito que o comportamento linux padrão (como manda a IGMP v3 RFC) é usar v2 única igmp para relatórios.

Pelo que entendi quando você definir /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version a 0 ele usa esse comportamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top