From 5a99ade413b97a780758f5c8f927604ad6c8e57b Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Mon, 12 Apr 1999 14:57:46 +0000 Subject: Fixed a couple of bugs in handling of multicast sockets. See comments in lib/socket.h for a detailed guide on how to use them. --- TODO | 1 + lib/socket.h | 12 ++++++++++-- sysdep/unix/io.c | 17 ++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/TODO b/TODO index 52629ea..e39678e 100644 --- a/TODO +++ b/TODO @@ -37,6 +37,7 @@ Cleanup - check if all protocols set proper packet priorities and TTL's. - replace all NUM, IPA and expr tokens by constant filter expressions - try compiling with -Wunused +- does everybody test return value of sk_open? Various ideas ~~~~~~~~~~~~~ diff --git a/lib/socket.h b/lib/socket.h index 2c5ab4f..bb9c1c3 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -55,8 +55,16 @@ void sk_dump_all(void); #define SK_TCP 2 #define SK_UDP 3 /* ? ? - - - ? ? */ #define SK_UDP_MC 4 /* ? ? * * * * - */ -#define SK_IP 5 /* ? ? - * - ? ? */ -#define SK_IP_MC 6 /* ? ? * * * * - */ +#define SK_IP 5 /* ? - - * - ? ? */ +#define SK_IP_MC 6 /* ? - * * * * - */ #define SK_MAGIC 7 /* Internal use by sysdep code */ +/* + * Multicast sockets are slightly different from the other ones: + * If you want to send packets only, just set the destination + * address to the corresponding multicast group and iface to + * the interface to be used. If you also want receiving, set + * source address to the same multicast group as well. + */ + #endif diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 9a38844..69f8a5c 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -408,21 +408,18 @@ sk_open(sock *s) case SK_IP_MC: { #ifdef HAVE_IP_MREQN + /* FIXME: Define HAVE_IP_MREQN somewhere :) */ struct ip_mreqn mreq; #define mreq_add mreq + ASSERT(s->iface); mreq.imr_ifindex = s->iface->index; - if (has_src) - set_inaddr(&mreq.imr_address, s->saddr); - else - set_inaddr(&mreq.imr_address, s->iface->ifa->ip); + set_inaddr(&mreq.imr_address, s->iface->ip); #else struct in_addr mreq; struct ip_mreq mreq_add; - if (has_src) - set_inaddr(&mreq, s->saddr); - else - set_inaddr(&mreq, s->iface->ip); - memcpy(&mreq_add.imr_interface, &mreq, sizeof(struct in_addr)); + ASSERT(s->iface); + set_inaddr(&mreq, s->iface->ip); + mreq_add.imr_interface = mreq; #endif set_inaddr(&mreq_add.imr_multiaddr, s->daddr); if (has_dest) @@ -439,9 +436,11 @@ sk_open(sock *s) #endif setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &zero, sizeof(zero)) < 0) ERR("IP_MULTICAST_LOOP"); + /* This defines where should we send _outgoing_ multicasts */ if (setsockopt(fd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq)) < 0) ERR("IP_MULTICAST_IF"); } + /* And this one sets interface for _receiving_ multicasts from */ if (has_src && setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq_add, sizeof(mreq_add)) < 0) ERR("IP_ADD_MEMBERSHIP"); break; -- cgit v1.2.3