NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PR/60071 CVS commit: src/sys
The following reply was made to PR kern/60071; it has been noted by GNATS.
From: Ryota Ozaki <ozaki-r%iij.ad.jp@localhost>
To: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost,
gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: PR/60071 CVS commit: src/sys
Date: Thu, 26 Mar 2026 13:46:36 +0900
Oops!
I mistakenly passed the diff file to cvs -F...
Could someone change the commit log of the commit in the
repository with the following log?
Thanks,
ozaki-r
=3D=3D=3D=3D
nd: reset ln_asked on state reset
Even if a userland program such as ping continuously sends packets
to a (temporarily) unreachable host, the ND resolver only sends
request packets up to nd_mmaxtries times. This change allows ND
request packets to continue being sent while the userland process
is still sending packets.
Additionally, introduce LLE_UNRESOLVED to fix another issue.
nd_resolve may incorrectly return an error immediately after sending
the last ND request packet. For example, if nd_mmaxtries =3D 1 and two
packets arrive simultaneously, nd_resolve returns an error for the
second packet. This occurs because ln_asked is used to determine
whether the ND resolution is still in progress.
Instead, use the new LLE_UNRESOLVED state. It is set when the state
transitions to WAITDELETE, i.e., one second after the last request
is sent without successful address resolution.
PR kern/60071
=3D=3D=3D=3D
On Thu, Mar 26, 2026 at 1:40=E2=80=AFPM Ryota Ozaki <ozaki-r%netbsd.org@localhost> wr=
ote:
>
> The following reply was made to PR kern/60071; it has been noted by GNATS=
.
>
> From: "Ryota Ozaki" <ozaki-r%netbsd.org@localhost>
> To: gnats-bugs%gnats.NetBSD.org@localhost
> Cc:
> Subject: PR/60071 CVS commit: src/sys
> Date: Thu, 26 Mar 2026 04:35:18 +0000
>
> Module Name: src
> Committed By: ozaki-r
> Date: Thu Mar 26 04:35:17 UTC 2026
>
> Modified Files:
> src/sys/net: if_llatbl.h nd.c
> src/sys/netinet: if_arp.c
> src/sys/netinet6: nd6.c
>
> Log Message:
> commit 27c3de6c8063a7850ef0efbea0d83f314e541ce8
> Author: Ryota Ozaki <ozaki-r%iij.ad.jp@localhost>
> Date: Thu Mar 12 12:42:03 2026 +0900
>
> nd: reset ln_asked on state reset
>
> Even if a userland program such as ping continuously sends packets
> to a (temporarily) unreachable host, the ND resolver only sends
> request packets up to nd_mmaxtries times. This change allows ND
> request packets to continue being sent while the userland process
> is still sending packets.
>
> Additionally, introduce LLE_UNRESOLVED to fix another issue.
> nd_resolve may incorrectly return an error immediately after sending
> the last ND request packet. For example, if nd_mmaxtries =3D 1 and t=
wo
> packets arrive simultaneously, nd_resolve returns an error for the
> second packet. This occurs because ln_asked is used to determine
> whether the ND resolution is still in progress.
>
> Instead, use the new LLE_UNRESOLVED state. It is set when the state
> transitions to WAITDELETE, i.e., one second after the last request
> is sent without successful address resolution.
>
> PR kern/60071
>
> diff --git a/sys/net/if_llatbl.h b/sys/net/if_llatbl.h
> index a83f31cac70..31a3ebef30b 100644
> --- a/sys/net/if_llatbl.h
> +++ b/sys/net/if_llatbl.h
> @@ -249,6 +249,7 @@ MALLOC_DECLARE(M_LLTABLE);
> #define LLE_VALID 0x0008 /* ll_addr is valid */
> #define LLE_PUB 0x0020 /* publish entry ??? */
> #define LLE_LINKED 0x0040 /* linked to lookup structure */
> +#define LLE_UNRESOLVED 0x0080 /* address unresolved */
> /* LLE request flags */
> #define LLE_EXCLUSIVE 0x2000 /* return lle xlocked */
>
> diff --git a/sys/net/nd.c b/sys/net/nd.c
> index 8ebc5fe5338..8d12c1d7b58 100644
> --- a/sys/net/nd.c
> +++ b/sys/net/nd.c
> @@ -113,6 +113,7 @@ nd_timer(void *arg)
>
> missed =3D ND_LLINFO_INCOMPLETE;
> ln->ln_state =3D ND_LLINFO_WAITDELETE;
> + ln->la_flags |=3D LLE_UNRESOLVED;
> break;
>
> case ND_LLINFO_REACHABLE:
> @@ -360,8 +361,10 @@ nd_resolve(struct llentry *ln, const struct rtentry=
*rt, struct mbuf *m,
> * the oldest packet in the queue will be removed.
> */
> if (ln->ln_state =3D=3D ND_LLINFO_NOSTATE ||
> - ln->ln_state =3D=3D ND_LLINFO_WAITDELETE)
> + ln->ln_state =3D=3D ND_LLINFO_WAITDELETE) {
> + ln->ln_asked =3D 0;
> ln->ln_state =3D ND_LLINFO_INCOMPLETE;
> + }
>
> #ifdef MBUFTRACE
> m_claimm(m, ln->lle_tbl->llt_mowner);
> @@ -398,7 +401,7 @@ nd_resolve(struct llentry *ln, const struct rtentry =
*rt, struct mbuf *m,
> ln->la_numheld, nd->nd_maxqueuelen);
> ln->la_numheld++;
>
> - if (ln->ln_asked >=3D nd->nd_mmaxtries)
> + if ((ln->la_flags & LLE_UNRESOLVED) !=3D 0)
> error =3D (rt !=3D NULL && rt->rt_flags & RTF_GATEWAY) ?
> EHOSTUNREACH : EHOSTDOWN;
> else
> diff --git a/sys/netinet/if_arp.c b/sys/netinet/if_arp.c
> index 2934534efb1..fc4d0252a74 100644
> --- a/sys/netinet/if_arp.c
> +++ b/sys/netinet/if_arp.c
> @@ -1056,6 +1056,7 @@ again:
> KASSERT(sizeof(la->ll_addr) >=3D ifp->if_addrlen);
> memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen);
> la->la_flags |=3D LLE_VALID;
> + la->la_flags &=3D ~LLE_UNRESOLVED;
> la->ln_asked =3D 0;
> if (new_state !=3D 0) {
> la->ln_state =3D new_state;
> diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
> index aeaef609a79..1920759ecbc 100644
> --- a/sys/netinet6/nd6.c
> +++ b/sys/netinet6/nd6.c
> @@ -1400,6 +1400,7 @@ nd6_cache_lladdr(
> */
> memcpy(&ln->ll_addr, lladdr, ifp->if_addrlen);
> ln->la_flags |=3D LLE_VALID;
> + ln->la_flags &=3D ~LLE_UNRESOLVED;
> }
>
> if (!is_newentry) {
>
>
> To generate a diff of this commit:
> cvs rdiff -u -r1.19 -r1.20 src/sys/net/if_llatbl.h
> cvs rdiff -u -r1.9 -r1.10 src/sys/net/nd.c
> cvs rdiff -u -r1.318 -r1.319 src/sys/netinet/if_arp.c
> cvs rdiff -u -r1.285 -r1.286 src/sys/netinet6/nd6.c
>
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
>
Home |
Main Index |
Thread Index |
Old Index