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