From: Roy Marples Date: Mon, 15 Sep 2008 19:15:52 +0000 (+0000) Subject: We need to flush the ARP table after configuring new routes. X-Git-Tag: v5.0.0~247 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=afc7387846a6e8f01deafe2f2ae797392d496413;p=thirdparty%2Fdhcpcd.git We need to flush the ARP table after configuring new routes. --- diff --git a/configure.c b/configure.c index cfcd6e4e..1dadc186 100644 --- a/configure.c +++ b/configure.c @@ -510,6 +510,8 @@ configure(struct interface *iface, const char *reason) 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"); diff --git a/if-bsd.c b/if-bsd.c index 6da4dd2b..576e6f42 100644 --- a/if-bsd.c +++ b/if-bsd.c @@ -25,11 +25,12 @@ * SUCH DAMAGE. */ -#include -#include -#include #include #include +#include +#include +#include +#include #include #include @@ -187,6 +188,44 @@ if_route(const struct interface *iface, const struct in_addr *dest, return retval; } +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) { diff --git a/if-linux.c b/if-linux.c index 803356cc..590bad18 100644 --- a/if-linux.c +++ b/if-linux.c @@ -396,6 +396,13 @@ if_route(const struct interface *iface, 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) { diff --git a/net.h b/net.h index 5191a7e7..806b5a19 100644 --- a/net.h +++ b/net.h @@ -127,6 +127,7 @@ int if_route(const struct interface *, const struct in_addr *, 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 *);