X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fndp.c;h=b68626276daecddccea5906cf5630090759bca4f;hp=e201ac99f44826ff889d7c5bfe575d093376322d;hb=0ef74ec9c86a35adcba042f4810ef6b53d7efaaf;hpb=eea7d037b93020dd5d5d2e5a698e88650a0f0912 diff --git a/src/ndp.c b/src/ndp.c index e201ac9..b686262 100644 --- a/src/ndp.c +++ b/src/ndp.c @@ -33,9 +33,8 @@ #include #include -#include "router.h" #include "dhcpv6.h" -#include "ndp.h" +#include "odhcpd.h" struct event_socket { struct odhcpd_event ev; @@ -363,8 +362,6 @@ static void check_addr_updates(struct interface *iface) qsort(addr, len, sizeof(*addr), prefixcmp); for (int i = 0; i < len; ++i) { - addr[i].addr.s6_addr32[3] = 0; - if (addr[i].preferred < UINT32_MAX - now) addr[i].preferred += now; @@ -395,7 +392,7 @@ static void check_addr_updates(struct interface *iface) } } -void setup_addr_for_relaying(struct in6_addr *addr, struct interface *iface, bool add) +static void setup_addr_for_relaying(struct in6_addr *addr, struct interface *iface, bool add) { struct interface *c; char ipbuf[INET6_ADDRSTRLEN]; @@ -406,32 +403,17 @@ void setup_addr_for_relaying(struct in6_addr *addr, struct interface *iface, boo if (iface == c || (c->ndp != RELAYD_RELAY && !add)) continue; - add = (c->ndp == RELAYD_RELAY ? add : false); + bool neigh_add = (c->ndp == RELAYD_RELAY ? add : false); - if (odhcpd_setup_proxy_neigh(addr, c, add)) + if (odhcpd_setup_proxy_neigh(addr, c, neigh_add)) syslog(LOG_DEBUG, "Failed to %s proxy neighbour entry %s%%%s", - add ? "add" : "delete", ipbuf, iface->ifname); + neigh_add ? "add" : "delete", ipbuf, c->ifname); else syslog(LOG_DEBUG, "%s proxy neighbour entry %s%%%s", - add ? "Added" : "Deleted", ipbuf, iface->ifname); - } -} - -void setup_ping6(struct in6_addr *addr, struct interface *iface) -{ - struct interface *c; - - list_for_each_entry(c, &interfaces, head) { - if (iface == c || c->ndp != RELAYD_RELAY || - c->external == true) - continue; - - ping6(addr, c); + neigh_add ? "Added" : "Deleted", ipbuf, c->ifname); } } -static struct in6_addr last_solicited; - static void handle_rtnl_event(struct odhcpd_event *e) { struct event_socket *ev_sock = container_of(e, struct event_socket, ev); @@ -468,6 +450,7 @@ static int cb_rtnl_valid(struct nl_msg *msg, _unused void *arg) case RTM_NEWADDR: add = true; + /* fall through */ case RTM_DELADDR: { struct ifaddrmsg *ifa = nlmsg_data(hdr); struct nlattr *nla[__IFA_MAX]; @@ -508,6 +491,7 @@ static int cb_rtnl_valid(struct nl_msg *msg, _unused void *arg) case RTM_NEWNEIGH: add = true; + /* fall through */ case RTM_DELNEIGH: { struct ndmsg *ndm = nlmsg_data(hdr); struct nlattr *nla[__NDA_MAX]; @@ -546,14 +530,8 @@ static int cb_rtnl_valid(struct nl_msg *msg, _unused void *arg) if (add && !(ndm->ndm_state & (NUD_REACHABLE | NUD_STALE | NUD_DELAY | NUD_PROBE | - NUD_PERMANENT | NUD_NOARP))) { - if (!IN6_ARE_ADDR_EQUAL(&last_solicited, addr)) { - last_solicited = *addr; - setup_ping6(addr, iface); - } - + NUD_PERMANENT | NUD_NOARP))) return NL_OK; - } setup_addr_for_relaying(addr, iface, add); setup_route(addr, iface, add);