From: Steven Barth Date: Mon, 11 Nov 2013 14:34:05 +0000 (+0100) Subject: Finalizing bfd work X-Git-Tag: debian/1.1+git20160131-1~108 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=be05c0ded0257cbb82857f6d01226ef6de28befe;p=odhcp6c.git Finalizing bfd work --- diff --git a/src/bfd.c b/src/bfd.c index 11fade1..1822555 100644 --- a/src/bfd.c +++ b/src/bfd.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -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; -} - -*/ diff --git a/src/odhcp6c.c b/src/odhcp6c.c index 2c5bfad..de03b81 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -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 for requesting addresses [try|force|none]\n" " -P Request IPv6-Prefix (0 = auto)\n" " -F Force IPv6-Prefix\n" +#ifdef EXT_BFD_PING + " -B Enable BFD ping check\n" +#endif " -c Override client-ID (base-16 encoded)\n" " -i Use a custom interface identifier for RA handling\n" " -r Options to be requested (comma-separated)\n"