netdev
[Top] [All Lists]

MLDv2 SSM problem

To: David Stevens <dlstevens@xxxxxxxxxx>, netdev@xxxxxxxxxxx
Subject: MLDv2 SSM problem
From: Takashi Hibi <hibi665@xxxxxxx>
Date: Wed, 17 Dec 2003 11:03:51 +0900
Sender: netdev-bounce@xxxxxxxxxxx
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;
}

Attachment: mldv2.cap
Description: Binary data

<Prev in Thread] Current Thread [Next in Thread>
  • MLDv2 SSM problem, Takashi Hibi <=