summaryrefslogtreecommitdiff
path: root/sysdep/unix/io.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2011-03-13 11:33:50 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2011-03-13 11:33:50 +0100
commit93e868c730dc0b1825b2a685e0b066c051b1cb07 (patch)
tree732a24861785cbefac966c365a762628bac9c0ac /sysdep/unix/io.c
parent9d67ffb0b4cdfbbf88779ce2b44ba810d1ba85d3 (diff)
Implements Router Advertisement protocol.
Diffstat (limited to 'sysdep/unix/io.c')
-rw-r--r--sysdep/unix/io.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index a552a2a6..29be9a86 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -22,6 +22,7 @@
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
+#include <netinet/icmp6.h>
#include "nest/bird.h"
#include "lib/lists.h"
@@ -881,6 +882,25 @@ sk_set_ipv6_checksum(sock *s, int offset)
}
int
+sk_set_icmp_filter(sock *s, int p1, int p2)
+{
+ /* a bit of lame interface, but it is here only for Radv */
+ struct icmp6_filter f;
+
+ ICMP6_FILTER_SETBLOCKALL(&f);
+ ICMP6_FILTER_SETPASS(p1, &f);
+ ICMP6_FILTER_SETPASS(p2, &f);
+
+ if (setsockopt(s->fd, IPPROTO_ICMPV6, ICMP6_FILTER, &f, sizeof(f)) < 0)
+ {
+ log(L_ERR "sk_setup_icmp_filter: ICMP6_FILTER: %m");
+ return -1;
+ }
+
+ return 0;
+}
+
+int
sk_setup_multicast(sock *s)
{
char *err;
@@ -951,7 +971,6 @@ sk_leave_group(sock *s, ip_addr maddr)
return 0;
}
-
#else /* IPV4 */
int