Mercurial > hg > dhcpcd
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 *);
