summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-04-12 16:57:46 +0200
committerMartin Mares <mj@ucw.cz>1999-04-12 16:57:46 +0200
commit5a99ade413b97a780758f5c8f927604ad6c8e57b (patch)
tree55c85d0b8a24755fd3409ba610b77871a88fd2a4
parentbad631e04806287e99e2464c0fdc884f9efa1e71 (diff)
downloadbird-5a99ade413b97a780758f5c8f927604ad6c8e57b.tar
bird-5a99ade413b97a780758f5c8f927604ad6c8e57b.zip
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--TODO1
-rw-r--r--lib/socket.h12
-rw-r--r--sysdep/unix/io.c17
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;