ra: keep alive neighbor entries so we can send unicast RAs in the future
authorSteven Barth <steven@midlink.org>
Tue, 30 Jun 2015 09:06:20 +0000 (11:06 +0200)
committerSteven Barth <steven@midlink.org>
Tue, 30 Jun 2015 09:06:20 +0000 (11:06 +0200)
src/ndp.c

index 5e8b5ac04bb8ccb2e98b67c86db45136195421bf..5fc95dd88d787434d79fb0cd3f0dab4684042e94 100644 (file)
--- a/src/ndp.c
+++ b/src/ndp.c
@@ -212,7 +212,7 @@ int setup_ndp_interface(struct interface *iface, bool enable)
 static ssize_t ping6(struct in6_addr *addr,
                const struct interface *iface)
 {
-       struct sockaddr_in6 dest = {AF_INET6, 0, 0, *addr, 0};
+       struct sockaddr_in6 dest = {AF_INET6, 0, 0, *addr, iface->ifindex};
        struct icmp6_hdr echo = {.icmp6_type = ICMP6_ECHO_REQUEST};
        struct iovec iov = {&echo, sizeof(echo)};
 
@@ -370,6 +370,11 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
                                        RTA_PAYLOAD(rta) >= sizeof(*addr))
                                addr = RTA_DATA(rta);
 
+               // Keep-alive neighbor entries for RA sending
+               if (nh->nlmsg_type == RTM_DELNEIGH && !(ndm->ndm_state & NUD_FAILED) &&
+                               addr && IN6_IS_ADDR_LINKLOCAL(addr) && iface->ra == RELAYD_SERVER)
+                       ping6(addr, iface);
+
                // Address not specified or unrelated
                if (!addr || IN6_IS_ADDR_LINKLOCAL(addr) ||
                                IN6_IS_ADDR_MULTICAST(addr))