David Stevens wrote: > Can you send the contents of /proc/net/igmp and the packet trace, > also? And the code? > > +-DLS >
# cat /proc/net/igmp Idx Device : Count Querier Group Users Timer Reporter 1 lo : 0 V3 010000E0 1 0:00000000 0 2 eth0 : 3 V2 010000E0 1 0:00000000 0 3 eth1 : 4 V2 030100E0 1 0:00000000 1 010000E0 1 0:00000000 0 Source attached. The trace only shows a single udp packet and you can re-create it with the attached small apps. -vlad
#include <stdio.h> #include <string.h> #include <netinet/in.h> int main(int argc, char **argv) { struct sockaddr_storage dest; struct sockaddr_storage src; struct sockaddr_in *s = (struct sockaddr_in*) &src; struct sockaddr_in *d = (struct sockaddr_in *)&dest; int sock; char msg[] = "Hello Multicast"; int off = 0; memset(&dest, 0, sizeof(dest)); memset(&src, 0, sizeof(src)); if (argc < 3) { printf("Usage: <src ip> <mcast dest>\n"); return 1; } d->sin_family = s->sin_family = AF_INET; d->sin_port = htons(2000); inet_aton(argv[1], &s->sin_addr); inet_aton(argv[2], &d->sin_addr); sock = socket(AF_INET, SOCK_DGRAM, 0); if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof(off))) { perror("setsockopt"); return 1; } if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, s, sizeof(*s))) { perror("setsockopt"); return 1; } sendto(sock, msg, sizeof(msg), 0, (struct sockaddr *)d, sizeof(*d)); close (socket); return 0; }
#include <stdio.h> #include <string.h> #include <netinet/in.h> int main(int argc, char **argv) { struct sockaddr_in addr; int addr_len; struct ip_mreq req; int sock; char msg[256]; memset(&addr, 0, sizeof(addr)); if (argc < 3) { printf("Usage: <interface ip> <mcast group>\n"); return 1; } sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(2000); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr))) { perror("bind"); return 1; } inet_aton(argv[1], &req.imr_interface); inet_aton(argv[2], &req.imr_multiaddr); if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &req, sizeof(req))) { perror("setsockopt"); return 1; } recvfrom(sock, msg, sizeof(msg), 0, (struct sockaddr *)&addr, &addr_len); printf("Message recieved: %s", msg); close (socket); return 0; }