Finalizing bfd work
authorSteven Barth <steven@midlink.org>
Mon, 11 Nov 2013 14:34:05 +0000 (15:34 +0100)
committerSteven Barth <steven@midlink.org>
Mon, 11 Nov 2013 14:34:05 +0000 (15:34 +0100)
src/bfd.c
src/odhcp6c.c

index 11fade1d74a57691e315fa70088193dc985526c4..182255573b4aad6b6487d747ccab5274bb6aa8da 100644 (file)
--- a/src/bfd.c
+++ b/src/bfd.c
@@ -12,6 +12,7 @@
 #include <linux/rtnetlink.h>
 #include <linux/filter.h>
 
+#include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 
@@ -86,8 +87,10 @@ static void bfd_send(int signal __attribute__((unused)))
                do {
                        ssize_t read = recv(rtnl, buf, sizeof(buf), 0);
                        nhm = (struct nlmsghdr*)buf;
-                       if (read < 0 || !NLMSG_OK(nhm, (size_t)read))
+                       if ((read < 0 && errno == EINTR) || !NLMSG_OK(nhm, (size_t)read))
                                continue;
+                       else if (read < 0)
+                               break;
 
                        for (; read > 0 && NLMSG_OK(nhm, (size_t)read); nhm = NLMSG_NEXT(nhm, read)) {
                                ssize_t attrlen = NLMSG_PAYLOAD(nhm, sizeof(struct ndmsg));
@@ -120,17 +123,6 @@ static void bfd_send(int signal __attribute__((unused)))
        ping.ip6.ip6_src = cpd->target;
        ping.ip6.ip6_dst = cpd->target;
 
-/*
-       uint16_t sum = cksum(&ping.ip6.ip6_src, sizeof(ping.ip6.ip6_src), 0);
-       sum = cksum(&ping.ip6.ip6_dst, sizeof(ping.ip6.ip6_dst), ~sum);
-       sum = cksum(&ping.ip6.ip6_plen, sizeof(ping.ip6.ip6_plen), ~sum);
-
-       uint8_t next[4] = {0, 0, 0, ping.ip6.ip6_nxt};
-       sum = cksum(next, sizeof(next), ~sum);
-
-       ping.icmp6.icmp6_cksum = cksum(&ping.icmp6, sizeof(ping.icmp6), ~sum);
-*/
-
        struct sock_filter bpf[] = {
                BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct ip6_hdr, ip6_plen)),
                BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 8 << 16 | IPPROTO_ICMPV6 << 8 | 254, 0, 13),
@@ -217,22 +209,3 @@ void bfd_stop(void)
        sock = -1;
        rtnl = -1;
 }
-
-/*
-
-uint16_t cksum(const uint16_t *addr, size_t count, uint16_t start)
-{
-       uint32_t sum = start;
-
-       while (count > 1) {
-               sum += *addr++;
-               count -= 2;
-       }
-
-       while (sum >> 16)
-               sum = (sum & 0xffff) + (sum >> 16);
-
-       return ~sum;
-}
-
-*/
index 2c5bfad4342f3c4298ef517355b12b512ac89b42..de03b814f95efa86bde343374a14b6769e04cd02 100644 (file)
@@ -63,10 +63,14 @@ int main(_unused int argc, char* const argv[])
        static struct in6_addr ifid = IN6ADDR_ANY_INIT;
        int sol_timeout = 120;
 
+#ifdef EXT_BFD_PING
+       int bfd_interval = 0, bfd_loss = 3;
+#endif
+
        bool help = false, daemonize = false;
        int logopt = LOG_PID;
        int c, request_pd = 0;
-       while ((c = getopt(argc, argv, "S::N:P:Fc:i:r:s:kt:hedp:")) != -1) {
+       while ((c = getopt(argc, argv, "S::N:P:FB:c:i:r:s:kt:hedp:")) != -1) {
                switch (c) {
                case 'S':
                        allow_slaac_only = (optarg) ? atoi(optarg) : -1;
@@ -100,6 +104,12 @@ int main(_unused int argc, char* const argv[])
                        ia_pd_mode = IA_MODE_FORCE;
                        break;
 
+#ifdef EXT_BFD_PING
+               case 'B':
+                       bfd_interval = atoi(optarg);
+                       break;
+#endif
+
                case 'c':
                        l = script_unhexlify(&buf[4], sizeof(buf) - 4, optarg);
                        if (l > 0) {
@@ -267,7 +277,8 @@ int main(_unused int argc, char* const argv[])
                bound = true;
                syslog(LOG_NOTICE, "entering stateful-mode on %s", ifname);
 #ifdef EXT_BFD_PING
-               bfd_start(ifname, 3, 10);
+               if (bfd_interval > 0)
+                       bfd_start(ifname, bfd_loss, bfd_interval);
 #endif
 
                while (do_signal == 0 || do_signal == SIGUSR1) {
@@ -353,6 +364,9 @@ static int usage(void)
        "       -N <mode>       Mode for requesting addresses [try|force|none]\n"
        "       -P <length>     Request IPv6-Prefix (0 = auto)\n"
        "       -F              Force IPv6-Prefix\n"
+#ifdef EXT_BFD_PING
+       "       -B <interval>   Enable BFD ping check\n"
+#endif
        "       -c <clientid>   Override client-ID (base-16 encoded)\n"
        "       -i <iface-id>   Use a custom interface identifier for RA handling\n"
        "       -r <options>    Options to be requested (comma-separated)\n"