mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
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:
parent
bad631e048
commit
5a99ade413
1
TODO
1
TODO
@ -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
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
12
lib/socket.h
12
lib/socket.h
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user