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.
This commit is contained in:
Martin Mares 1999-04-12 14:57:46 +00:00
parent bad631e048
commit 5a99ade413
3 changed files with 19 additions and 11 deletions

1
TODO
View file

@ -37,6 +37,7 @@ Cleanup
- check if all protocols set proper packet priorities and TTL's. - check if all protocols set proper packet priorities and TTL's.
- replace all NUM, IPA and expr tokens by constant filter expressions - replace all NUM, IPA and expr tokens by constant filter expressions
- try compiling with -Wunused - try compiling with -Wunused
- does everybody test return value of sk_open?
Various ideas Various ideas
~~~~~~~~~~~~~ ~~~~~~~~~~~~~

View file

@ -55,8 +55,16 @@ void sk_dump_all(void);
#define SK_TCP 2 #define SK_TCP 2
#define SK_UDP 3 /* ? ? - - - ? ? */ #define SK_UDP 3 /* ? ? - - - ? ? */
#define SK_UDP_MC 4 /* ? ? * * * * - */ #define SK_UDP_MC 4 /* ? ? * * * * - */
#define SK_IP 5 /* ? ? - * - ? ? */ #define SK_IP 5 /* ? - - * - ? ? */
#define SK_IP_MC 6 /* ? ? * * * * - */ #define SK_IP_MC 6 /* ? - * * * * - */
#define SK_MAGIC 7 /* Internal use by sysdep code */ #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 #endif

View file

@ -408,21 +408,18 @@ sk_open(sock *s)
case SK_IP_MC: case SK_IP_MC:
{ {
#ifdef HAVE_IP_MREQN #ifdef HAVE_IP_MREQN
/* FIXME: Define HAVE_IP_MREQN somewhere :) */
struct ip_mreqn mreq; struct ip_mreqn mreq;
#define mreq_add mreq #define mreq_add mreq
ASSERT(s->iface);
mreq.imr_ifindex = s->iface->index; mreq.imr_ifindex = s->iface->index;
if (has_src) set_inaddr(&mreq.imr_address, s->iface->ip);
set_inaddr(&mreq.imr_address, s->saddr);
else
set_inaddr(&mreq.imr_address, s->iface->ifa->ip);
#else #else
struct in_addr mreq; struct in_addr mreq;
struct ip_mreq mreq_add; struct ip_mreq mreq_add;
if (has_src) ASSERT(s->iface);
set_inaddr(&mreq, s->saddr); set_inaddr(&mreq, s->iface->ip);
else mreq_add.imr_interface = mreq;
set_inaddr(&mreq, s->iface->ip);
memcpy(&mreq_add.imr_interface, &mreq, sizeof(struct in_addr));
#endif #endif
set_inaddr(&mreq_add.imr_multiaddr, s->daddr); set_inaddr(&mreq_add.imr_multiaddr, s->daddr);
if (has_dest) if (has_dest)
@ -439,9 +436,11 @@ sk_open(sock *s)
#endif #endif
setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &zero, sizeof(zero)) < 0) setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &zero, sizeof(zero)) < 0)
ERR("IP_MULTICAST_LOOP"); ERR("IP_MULTICAST_LOOP");
/* This defines where should we send _outgoing_ multicasts */
if (setsockopt(fd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq)) < 0) if (setsockopt(fd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq)) < 0)
ERR("IP_MULTICAST_IF"); 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) if (has_src && setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq_add, sizeof(mreq_add)) < 0)
ERR("IP_ADD_MEMBERSHIP"); ERR("IP_ADD_MEMBERSHIP");
break; break;