projects
/
project
/
odhcpd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
2ebf6c8
)
ra: keep alive neighbor entries so we can send unicast RAs in the future
author
Steven Barth
<steven@midlink.org>
Tue, 30 Jun 2015 09:06:20 +0000
(11:06 +0200)
committer
Steven Barth
<steven@midlink.org>
Tue, 30 Jun 2015 09:06:20 +0000
(11:06 +0200)
src/ndp.c
patch
|
blob
|
history
diff --git
a/src/ndp.c
b/src/ndp.c
index
5e8b5ac
..
5fc95dd
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)
{
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)};
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);
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))
// Address not specified or unrelated
if (!addr || IN6_IS_ADDR_LINKLOCAL(addr) ||
IN6_IS_ADDR_MULTICAST(addr))