diff options
author | Martin Mares <mj@ucw.cz> | 1999-04-12 14:57:46 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-04-12 14:57:46 +0000 |
commit | 5a99ade413b97a780758f5c8f927604ad6c8e57b (patch) | |
tree | 55c85d0b8a24755fd3409ba610b77871a88fd2a4 | |
parent | bad631e04806287e99e2464c0fdc884f9efa1e71 (diff) |
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.
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | lib/socket.h | 12 | ||||
-rw-r--r-- | sysdep/unix/io.c | 17 |
3 files changed, 19 insertions, 11 deletions
@@ -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 2c5ab4f8..bb9c1c3d 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 9a388442..69f8a5c7 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; |