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");
* SUCH DAMAGE.
*/
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
#include <arpa/inet.h>
#include <net/if_dl.h>
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)
{
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)
{
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 *);