Încerc să mă alătur unui flux multicast IGMP de la o mașină Centos 8, dar după trimiterea unui JOIN, nu există trafic care vine de la comutator.
Conexiune simplă:
MUX <-----------> cisco3850 <--------> Centos8
192.168.117.13 192.168.117.21
Comutatorul din amonte (catalizator Cisco 3850) este alimentat cu un MPEG-TS la 239.1.1.1:4000 de la MUX.
Le-am încercat pe amândouă socat
și propriul meu program pentru a deschide un socket, a se alătura fluxului și a ține socket-ul deschis. Ambele trimit același mesaj de alăturare IGMP, așa cum a fost confirmat de wireshark:
Protocolul de management al grupului de internet
[Versiunea IGMP: 3]
Tip: Raport de membru (0x22)
Rezervat: 00
Sumă de verificare: 0xe9fb [corect]
[Starea sumei de verificare: Bună]
Rezervat: 0000
Număr înregistrări de grup: 1
Înregistrare grup: 239.1.1.1 Modificare pentru a exclude modul
Tip de înregistrare: Modificare pentru a exclude modul (4)
Len de date auxiliare: 0
Num Src: 0
Adresă multicast: 239.1.1.1
Folosind ip route add
Am creat rute pentru grupuri multicast către interfață:
224.0.0.0/4 dev eth1 scope link
225.0.0.0/8 dev eth1 scope link
239.0.0.0/8 dev eth1 scope link
și cat /proc/net/igmp
arată că grupul a fost alăturat:
cat /proc/net/igmp
Dispozitiv Idx: Raportor cronometru al utilizatorilor grupului de interogători
3 et1 : 2 V3
030101E1 1 0:00000000 0
010000E0 1 0:00000000 0
eu suspect aceasta este o problemă cu comutatorul, mai degrabă decât o problemă Linux, dar clientul (care deține comutatorul) spune că totul este în regulă.
Ce altceva pot face din partea Linux pentru a investiga/remedia această problemă?
Dacă este o problemă la comutator, atunci ce? Ce trebuie configurat acolo? (trebuie să explic clientului)
Pentru referință, programul meu care se unește și menține soclul deschis arată astfel:
// Verificarea erorilor a fost omisă pentru concizie
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port = htons(port);
bind(fd, (struct sockaddr *)&saddr, sizeof(saddr);
struct ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = interfaceAddr;
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);