#include <linux/rtnetlink.h>
#include <linux/filter.h>
+#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
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));
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),
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;
-}
-
-*/
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;
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) {
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) {
" -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"