Date: Wed, 14 Oct 2009 23:26:21 -0700 From: Qing Li <qingli@freebsd.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r198111 - head/sys/netinet Message-ID: <9ace436c0910142326t69ddfe9ex26fa2c99849483aa@mail.gmail.com> In-Reply-To: <200910150612.n9F6C4vH061396@svn.freebsd.org> References: <200910150612.n9F6C4vH061396@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Forgot to mention the return code was incorrect. The function was returning EHOSTUNEACH when it should be returning EHOSTDOWN. This is also fixed by this patch. -- Qing On Wed, Oct 14, 2009 at 11:12 PM, Qing Li <qingli@freebsd.org> wrote: > Author: qingli > Date: Thu Oct 15 06:12:04 2009 > New Revision: 198111 > URL: http://svn.freebsd.org/changeset/base/198111 > > Log: > =A0This patch fixes the following issues in the ARP operation: > > =A01. There is a regression issue in the ARP code. The incomplete > =A0 =A0 ARP entry was timing out too quickly (1 second timeout), as > =A0 =A0 such, a new entry is created each time arpresolve() is called. > =A0 =A0 Therefore the maximum attempts made is always 1. Consequently > =A0 =A0 the error code returned to the application is always 0. > =A02. Set the expiration of each incomplete entry to a 20-second > =A0 =A0 lifetime. > =A03. Return "incomplete" entries to the application. > > =A0Reviewed by: =A0kmacy > =A0MFC after: =A0 =A03 days > > Modified: > =A0head/sys/netinet/if_ether.c > =A0head/sys/netinet/in.c > > Modified: head/sys/netinet/if_ether.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/if_ether.c Thu Oct 15 06:02:37 2009 =A0 =A0 =A0 =A0(= r198110) > +++ head/sys/netinet/if_ether.c Thu Oct 15 06:12:04 2009 =A0 =A0 =A0 =A0(= r198111) > @@ -88,11 +88,14 @@ VNET_DEFINE(int, useloopback) =3D 1; =A0/* us > =A0/* timer values */ > =A0static VNET_DEFINE(int, arpt_keep) =3D (20*60); =A0/* once resolved, g= ood for 20 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 * minutes */ > +static VNET_DEFINE(int, arpt_down) =3D 20; =A0 =A0 =A0/* keep incomplete= entries for > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0* 20 seconds */ > =A0static VNET_DEFINE(int, arp_maxtries) =3D 5; > =A0static VNET_DEFINE(int, arp_proxyall); > =A0static VNET_DEFINE(struct arpstat, arpstat); =A0/* ARP statistics, see= if_arp.h */ > > =A0#define =A0 =A0 =A0 =A0V_arpt_keep =A0 =A0 =A0 =A0 =A0 =A0 VNET(arpt_k= eep) > +#define =A0 =A0 =A0 =A0V_arpt_down =A0 =A0 =A0 =A0 =A0 =A0 VNET(arpt_dow= n) > =A0#define =A0 =A0 =A0 =A0V_arp_maxtries =A0 =A0 =A0 =A0 =A0VNET(arp_maxt= ries) > =A0#define =A0 =A0 =A0 =A0V_arp_proxyall =A0 =A0 =A0 =A0 =A0VNET(arp_prox= yall) > =A0#define =A0 =A0 =A0 =A0V_arpstat =A0 =A0 =A0 =A0 =A0 =A0 =A0 VNET(arps= tat) > @@ -309,7 +312,7 @@ retry: > =A0 =A0 =A0 =A0} > > =A0 =A0 =A0 =A0if ((la->la_flags & LLE_VALID) && > - =A0 =A0 =A0 =A0 =A0 ((la->la_flags & LLE_STATIC) || la->la_expire > tim= e_uptime)) { > + =A0 =A0 =A0 =A0 =A0 ((la->la_flags & LLE_STATIC) || la->la_expire > tim= e_second)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0bcopy(&la->ll_addr, desten, ifp->if_addrle= n); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * If entry has an expiry time and it is a= pproaching, > @@ -317,7 +320,7 @@ retry: > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * arpt_down interval. > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!(la->la_flags & LLE_STATIC) && > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 time_uptime + la->la_preempt > la->= la_expire) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 time_second + la->la_preempt > la->= la_expire) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0arprequest(ifp, NULL, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&SIN(dst)->sin_add= r, IF_LLADDR(ifp)); > > @@ -337,7 +340,7 @@ retry: > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto done; > =A0 =A0 =A0 =A0} > > - =A0 =A0 =A0 renew =3D (la->la_asked =3D=3D 0 || la->la_expire !=3D time= _uptime); > + =A0 =A0 =A0 renew =3D (la->la_asked =3D=3D 0 || la->la_expire !=3D time= _second); > =A0 =A0 =A0 =A0if ((renew || m !=3D NULL) && (flags & LLE_EXCLUSIVE) =3D= =3D 0) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0flags |=3D LLE_EXCLUSIVE; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LLE_RUNLOCK(la); > @@ -370,12 +373,12 @@ retry: > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0error =3D EWOULDBLOCK; =A0 =A0/* First req= uest. */ > =A0 =A0 =A0 =A0else > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0error =3D > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (rt0->rt_flags & RTF_GATEWAY) ? EHO= STDOWN : EHOSTUNREACH; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (rt0->rt_flags & RTF_GATEWA= Y) ? EHOSTUNREACH : EHOSTDOWN; > > =A0 =A0 =A0 =A0if (renew) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LLE_ADDREF(la); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 la->la_expire =3D time_uptime; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 callout_reset(&la->la_timer, hz, arptimer, = la); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 la->la_expire =3D time_second; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 callout_reset(&la->la_timer, hz * V_arpt_do= wn, arptimer, la); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0la->la_asked++; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LLE_WUNLOCK(la); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0arprequest(ifp, NULL, &SIN(dst)->sin_addr, > @@ -687,7 +690,7 @@ match: > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0EVENTHANDLER_INVOKE(arp_update_event, la); > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (!(la->la_flags & LLE_STATIC)) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 la->la_expire =3D time_upti= me + V_arpt_keep; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 la->la_expire =3D time_seco= nd + V_arpt_keep; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0callout_reset(&la->la_time= r, hz * V_arpt_keep, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0arptimer, la); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > > Modified: head/sys/netinet/in.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/in.c =A0 =A0 =A0 Thu Oct 15 06:02:37 2009 =A0 =A0 = =A0 =A0(r198110) > +++ head/sys/netinet/in.c =A0 =A0 =A0 Thu Oct 15 06:12:04 2009 =A0 =A0 = =A0 =A0(r198111) > @@ -1440,7 +1440,7 @@ in_lltable_dump(struct lltable *llt, str > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct sockaddr_dl *sdl; > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* skip deleted entries */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((lle->la_flags & (LLE_D= ELETED|LLE_VALID)) !=3D LLE_VALID) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((lle->la_flags & LLE_DE= LETED) =3D=3D LLE_DELETED) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0continue; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Skip if jailed and not = a valid IP of the prison. */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (prison_if(wr->td->td_u= cred, L3_ADDR(lle)) !=3D 0) > @@ -1472,10 +1472,15 @@ in_lltable_dump(struct lltable *llt, str > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sdl =3D &arpc.sdl; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sdl->sdl_family =3D AF_LIN= K; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sdl->sdl_len =3D sizeof(*s= dl); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sdl->sdl_alen =3D ifp->if_a= ddrlen; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sdl->sdl_index =3D ifp->if= _index; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sdl->sdl_type =3D ifp->if_= type; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcopy(&lle->ll_addr, LLADDR= (sdl), ifp->if_addrlen); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((lle->la_flags & LLE_VA= LID) =3D=3D LLE_VALID) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sdl->sdl_al= en =3D ifp->if_addrlen; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bcopy(&lle-= >ll_addr, LLADDR(sdl), ifp->if_addrlen); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sdl->sdl_al= en =3D 0; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bzero(LLADD= R(sdl), ifp->if_addrlen); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0arpc.rtm.rtm_rmx.rmx_expir= e =3D > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0lle->la_flags & LL= E_STATIC ? 0 : lle->la_expire; >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9ace436c0910142326t69ddfe9ex26fa2c99849483aa>