summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorluigi <luigi@FreeBSD.org>2002-02-18 22:50:13 +0000
committerluigi <luigi@FreeBSD.org>2002-02-18 22:50:13 +0000
commit30e02147534f93971be27a9032d21bf48bb1f626 (patch)
tree59c863f9cd8865f877bc686b78df5a54c6385ef9
parent81d7bf4f70bbe75116f2a0427110bcd7b12857b9 (diff)
downloadFreeBSD-src-30e02147534f93971be27a9032d21bf48bb1f626.zip
FreeBSD-src-30e02147534f93971be27a9032d21bf48bb1f626.tar.gz
When the local link address is changed, send out gratuitous ARPs
to notify other nodes about the address change. Otherwise, they might try and keep using the old address until their arp table entry times out and the address is refreshed. Maybe this ought to be done for INET6 addresses as well but i have no idea how to do it. It should be pretty straightforward though. MFC-after: 10 days
-rw-r--r--sys/net/if.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 8310190..a88d836 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1819,6 +1819,17 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, NULL);
ifp->if_flags |= IFF_UP;
(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, NULL);
+#ifdef INET
+ /*
+ * Also send gratuitous ARPs to notify other nodes about
+ * the address change.
+ */
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ if (ifa->ifa_addr != NULL &&
+ ifa->ifa_addr->sa_family == AF_INET)
+ arp_ifinit((struct arpcom *)ifp, ifa);
+ }
+#endif
}
return (0);
}
OpenPOWER on IntegriCloud