Fwd: Re: rat on WinXP

Robert Olson olson at mcs.anl.gov
Wed Dec 4 06:51:03 CST 2002


this is interesting, wrt the vmware/multicast discussion.

>Date: Wed, 04 Dec 2002 20:09:59 +0900 (JST)
>To: Konstantin.Kabassanov at lip6.fr
>Cc: dlal at endeavor-technologies.com, rat-users at cs.ucl.ac.uk
>Subject: Re: rat on WinXP
>From: TSUJI Takehiro <tsuji at tritech.co.jp>
>X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI)
>Sender: owner-rat-users at cs.ucl.ac.uk
>X-Spam-Status: No, hits=-4.4 required=5.0 tests=IN_REP_TO version=2.21
>X-Spam-Level:
>
>Hello,
>
>I think the reason is because a bug of WindowsXP. Or spec?
>On multicast socket, sometimes default incoming interface differs from
>default outgoing interface. I wrote a small multicast join and sendto
>test code, and executed it sniffing on each interfaces with windump.
>If there is only one interface, I could see multicast udp packet and
>igmp pakets. But if two interfaces, a udp passed thru an interface and
>igmp thru another interface. This will not always happen. In my environment,
>one physical ether interface and vmware's host only virtual interface.
>I'm not sure the condition when this will happn.
>I worte a workaround patch of mbus library. This works fine in my environment.
>
>#And one more information, WinXP's firewall setting drops multicast packets.
>
>tsuji--- net_udp0.c     Wed Dec  4 19:37:17 2002
>+++ net_udp.c   Wed Dec  4 19:39:46 2002
>@@ -102,6 +102,9 @@
>         ttl_t           ttl;
>         fd_t            fd;
>         struct in_addr  addr4;
>+#ifdef WIN32
>+       struct in_addr  ifaddr4;
>+#endif
>  #ifdef HAVE_IPv6
>         struct in6_addr addr6;
>  #endif /* HAVE_IPv6 */
>@@ -320,6 +323,25 @@
>                 imr.imr_multiaddr.s_addr = s->addr4.s_addr;
>                 imr.imr_interface.s_addr = iface_addr.s_addr;
>
>+#ifdef WIN32
>+               if(INADDR_ANY == imr.imr_interface.s_addr){
>+                       int fd;
>+                       struct sockaddr_in      s_in;
>+                       struct sockaddr_in myaddr;
>+                       int myaddrlen = sizeof(myaddr);
>+                       fd = socket(AF_INET, SOCK_DGRAM, 0);
>+                       if(fd >= 0){
>+                               s_in.sin_family      = AF_INET;
>+                               s_in.sin_addr.s_addr = s->addr4.s_addr;
>+                               s_in.sin_port        = htons(s->tx_port);
>+                               connect(fd, (struct sockaddr*)&s_in, 
>sizeof(struct sockaddr_in));
>+                               getsockname(fd, (struct sockaddr*)&myaddr, 
>&myaddrlen);
>+                               closesocket(fd);
>+                               imr.imr_interface = myaddr.sin_addr;
>+                       }
>+               }
>+               s->ifaddr4 = imr.imr_interface;
>+#endif
>                 if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
> (char *) &imr, sizeof(struct ip_mreq)) != 0) {
>                         socket_error("setsockopt IP_ADD_MEMBERSHIP");
>                         return NULL;
>@@ -350,7 +372,11 @@
>         if (IN_MULTICAST(ntohl(s->addr4.s_addr))) {
>                 struct ip_mreq  imr;
>                 imr.imr_multiaddr.s_addr = s->addr4.s_addr;
>+#ifdef WIN32
>+               imr.imr_interface = s->ifaddr4;
>+#else
>                 imr.imr_interface.s_addr = INADDR_ANY;
>+#endif
>                 if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, 
> (char *) &imr, sizeof(struct ip_mreq)) != 0) {
>                         socket_error("setsockopt IP_DROP_MEMBERSHIP");
>                         abort();




More information about the ag-dev mailing list