Skip site navigation (1)Skip section navigation (2)
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>