changeset 986:c4a1115d93d0 draft

We need to flush the ARP table after configuring new routes.
author Roy Marples <roy@marples.name>
date Mon, 15 Sep 2008 19:15:52 +0000
parents 7ab7d601d056
children 305fe9cbd6b5
files configure.c if-bsd.c if-linux.c net.h
diffstat 4 files changed, 52 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/configure.c	Mon Sep 15 16:53:11 2008 +0000
+++ b/configure.c	Mon Sep 15 19:15:52 2008 +0000
@@ -510,6 +510,8 @@
 	iface->addr.s_addr = addr.s_addr;
 	iface->net.s_addr = net.s_addr;
 	build_routes();
+	if (arp_flush() == -1)
+		syslog(LOG_ERR, "arp_flush: %m");
 	if (!iface->state->lease.frominfo)
 		if (write_lease(iface, dhcp) == -1)
 			syslog(LOG_ERR, "write_lease: %m");
--- a/if-bsd.c	Mon Sep 15 16:53:11 2008 +0000
+++ b/if-bsd.c	Mon Sep 15 19:15:52 2008 +0000
@@ -25,11 +25,12 @@
  * SUCH DAMAGE.
  */
 
-#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
 
 #include <arpa/inet.h>
 #include <net/if_dl.h>
@@ -188,6 +189,44 @@
 }
 
 int
+arp_flush(void)
+{
+	int s, mib[6], retval = 0;
+	size_t buffer_len = 0;
+	char *buffer, *e, *p;
+	struct rt_msghdr *rtm;
+
+	if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) == -1)
+		return -1;
+	mib[0] = CTL_NET;
+	mib[1] = PF_ROUTE;
+	mib[2] = 0;
+	mib[3] = AF_INET;
+	mib[4] = NET_RT_FLAGS;
+	mib[5] = RTF_LLINFO;
+	printf ("sizeof %d\n", sizeof(mib));
+	if (sysctl(mib, 6, NULL, &buffer_len, NULL, 0) == -1)
+		return -1;
+	if (buffer_len == 0)
+		return 0;
+	buffer = xmalloc(buffer_len);
+	if (sysctl(mib, 6, buffer, &buffer_len, NULL, 0) == -1)
+		return -1;
+	e = buffer + buffer_len;
+	for (p = buffer; p < e; p += rtm->rtm_msglen) {
+		rtm = (struct rt_msghdr *)(void *)p;
+		rtm->rtm_type = RTM_DELETE;
+		if (write(s, rtm, rtm->rtm_msglen) == -1) {
+			retval = -1;
+			break;
+		}
+	}
+	free(buffer);
+	close(s);
+	return retval;
+}
+
+int
 open_link_socket(void)
 {
 	int fd;
--- a/if-linux.c	Mon Sep 15 16:53:11 2008 +0000
+++ b/if-linux.c	Mon Sep 15 19:15:52 2008 +0000
@@ -396,6 +396,13 @@
 	return retval;
 }
 
+/* No need to explicity flush arp on Linux */
+int
+arp_flush(void)
+{
+	return 0;
+}
+
 struct interface *
 discover_interfaces(int argc, char * const *argv)
 {
--- a/net.h	Mon Sep 15 16:53:11 2008 +0000
+++ b/net.h	Mon Sep 15 19:15:52 2008 +0000
@@ -127,6 +127,7 @@
 	if_route(iface, dest, mask, gate, metric, -1)
 #define del_src_route(iface, dest, mask, gate, metric) \
 	if_route(iface, dest, mask, gate, metric, -2)
+int arp_flush(void);
 void free_routes(struct rt *);
 
 int open_udp_socket(struct interface *);