ndp: reintroduce address replay
[project/odhcpd.git] / src / ndp.c
index d5e9a39..2aa55be 100644 (file)
--- a/src/ndp.c
+++ b/src/ndp.c
@@ -324,11 +324,6 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
                if (!iface)
                        continue;
 
-               // 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))
@@ -422,6 +417,22 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
 
                        if (iface->dhcpv6 == RELAYD_SERVER)
                                iface->ia_reconf = true;
+
+                       if (iface->ndp == RELAYD_RELAY && iface->master) {
+                               // Replay address changes on all slave interfaces
+                               nh->nlmsg_flags = NLM_F_REQUEST;
+
+                               if (nh->nlmsg_type == RTM_NEWADDR)
+                                       nh->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
+
+                               struct interface *c;
+                               list_for_each_entry(c, &interfaces, head) {
+                                       if (c->ndp == RELAYD_RELAY && !c->master) {
+                                               ndm->ndm_ifindex = c->ifindex;
+                                               send(rtnl_event.uloop.fd, nh, nh->nlmsg_len, MSG_DONTWAIT);
+                                       }
+                               }
+                       }
                }
        }