David,
MLDv2 SSM also has a problem. (kernel 2.4.22 + patch)
After setsockopt(MCAST_JOIN_SOURCE_GROUP) is called, MLDv2 listener
report isn't issued. Only after receiving MLD query, MLDv2 listener
report is issued.
On the other hand, MCAST_JOIN_GROUP and MCAST_MSFILTER seem to work.
(MLDv2 listener report is issued immediately)
The captured file (by ethreal) is attached. The address of Linux is
fe80::2e0:29ff:fe0c:12f7.
The test program started just after capturing started.
The test program is as follows.
Regards,
Takashi Hibi
/*
* test program for SSM receive
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/in.h>
int main(int argc, char **argv)
{
if (argc < 5) {
printf("Usage: %s src-addr dst-addr port if-no\n", argv[0]);
exit(0);
}
int s;
int ret;
s = socket(AF_INET6, SOCK_DGRAM, 0);
if (s == -1) {
perror("socket");
return -1;
}
sockaddr_in6 saddr6;
memset(&saddr6, 0, sizeof(saddr6));
saddr6.sin6_family = AF_INET6;
saddr6.sin6_addr = in6addr_any;
saddr6.sin6_port = htons(atoi(argv[3]));
ret = bind(s, (sockaddr*)&saddr6, sizeof(saddr6));
if (ret == -1) {
perror("bind");
return -1;
}
/* set group_source_req parameters */
struct group_source_req req;
sockaddr_in6 *paddr;
memset(&req, 0, sizeof(req));
req.gsr_interface = atoi(argv[4]);
paddr = (sockaddr_in6*)&req.gsr_source;
paddr->sin6_family = AF_INET6;
ret = inet_pton(AF_INET6, argv[1], &paddr->sin6_addr);
if (ret <= 0) {
fprintf(stderr, "inet_pton(%s) return %d\n", argv[1], ret);
return -1;
}
paddr = (sockaddr_in6*)&req.gsr_group;
paddr->sin6_family = AF_INET6;
ret = inet_pton(AF_INET6, argv[2], &paddr->sin6_addr);
if (ret <= 0) {
fprintf(stderr, "inet_pton(%s) return %d\n", argv[2], ret);
return -1;
}
ret = setsockopt(s, IPPROTO_IPV6, MCAST_JOIN_SOURCE_GROUP,
(char *)&req, sizeof(req));
if (ret == -1) {
perror("setsockopt(MCAST_JOIN_SOURCE_GROUP)");
return -1;
}
sleep(150);
ret = setsockopt(s, IPPROTO_IPV6, MCAST_LEAVE_SOURCE_GROUP,
(char *)&req, sizeof(req));
if (ret == -1) {
perror("setsockopt(MCAST_LEAVE_SOURCE_GROUP)");
return -1;
}
return 0;
}
mldv2.cap
Description: Binary data
|