Index: if_ether.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/if_ether.c,v retrieving revision 1.64.2.17 diff -u -r1.64.2.17 if_ether.c --- if_ether.c 20 Feb 2002 23:34:09 -0000 1.64.2.17 +++ if_ether.c 7 Mar 2002 17:21:07 -0000 @@ -77,10 +77,19 @@ SYSCTL_DECL(_net_link_ether); SYSCTL_NODE(_net_link_ether, PF_INET, inet, CTLFLAG_RW, 0, ""); +#define ARP_TESTING_VALUES +#define ADEBUG(x) x + /* timer values */ +#if !defined(ARP_TESTING_VALUES) static int arpt_prune = (5*60*1); /* walk list every 5 minutes */ static int arpt_keep = (20*60); /* once resolved, good for 20 more minutes */ static int arpt_down = 20; /* once declared down, don't send for 20 sec */ +#else +static int arpt_prune = 12; /* walk list every 5 minutes */ +static int arpt_keep = 60; /* once resolved, good for 20 more minutes */ +static int arpt_down = 5; /* once declared down, don't send for 20 sec */ +#endif SYSCTL_INT(_net_link_ether_inet, OID_AUTO, prune_intvl, CTLFLAG_RW, &arpt_prune, 0, ""); @@ -96,7 +105,6 @@ struct rtentry *la_rt; struct mbuf *la_hold; /* last packet until resolved/timeout */ long la_asked; /* last time we QUERIED for this addr */ -#define la_timer la_rt->rt_rmx.rmx_expire /* deletion time in seconds */ }; static LIST_HEAD(, llinfo_arp) llinfo_arp; @@ -432,6 +440,17 @@ */ if ((rt->rt_expire == 0 || rt->rt_expire > time_second) && sdl->sdl_family == AF_LINK && sdl->sdl_alen != 0) { + if ((la->la_asked < arp_maxtries) && + (rt->rt_expire != 0) && + (time_second + (arp_maxtries - la->la_asked) * arpt_down > rt->rt_expire)) { + arprequest(ifp, + &SIN(rt->rt_ifa->ifa_addr)->sin_addr, + &SIN(dst)->sin_addr, + IF_LLADDR(ifp)); + ADEBUG(printf("%p: sending pre-emptive arp request (%ld)\n", la, la->la_asked)); + la->la_asked++; + } + bcopy(LLADDR(sdl), desten, sdl->sdl_alen); return 1; }