NetBSD Problem Report #60071

From www@netbsd.org  Thu Mar 12 04:19:15 2026
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
	 client-signature RSA-PSS (2048 bits) client-digest SHA256)
	(Client CN "mail.netbsd.org", Issuer "R12" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 9C81B1A9239
	for <gnats-bugs@gnats.NetBSD.org>; Thu, 12 Mar 2026 04:19:15 +0000 (UTC)
Message-Id: <20260312041914.58AE71A923A@mollari.NetBSD.org>
Date: Thu, 12 Mar 2026 04:19:14 +0000 (UTC)
From: ozaki-r@iij.ad.jp
Reply-To: ozaki-r@iij.ad.jp
To: gnats-bugs@NetBSD.org
Subject: The kernel stop sending ARP/NS packets on ping/ping6
X-Send-Pr-Version: www-1.0
X-From4GNATS: "ozaki-r@iij.ad.jp via gnats" <gnats-admin@NetBSD.org>

>Number:         60071
>Category:       kern
>Synopsis:       The kernel stop sending ARP/NS packets on ping/ping6
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Mar 12 04:20:00 +0000 2026
>Last-Modified:  Wed Jun 03 18:45:03 +0000 2026
>Originator:     Ryota Ozaki
>Release:        current, 11, 10
>Organization:
IIJ
>Environment:
NetBSD kvm 11.99.5 NetBSD 11.99.5 (KVM) #32: Thu Mar 12 11:48:45 JST 2026  (hidden) amd64
>Description:
ping(8) with no option sends ICMP echo requests periodically.  If a target host is not available, the kernel keeps sending ARP packets per the ICMP packets.  This is probably the typical and expected behavior.  NetBSD 9, NetBSD 8, FreeBSD 11 and Linux 6.0 acts like so.

However, recent NetBSD kernels (10~) stop sending ARP packets at most net.inet.arp.nd_bmaxtries times.

ping6 (IPv6 NS) is the same situation.
>How-To-Repeat:
Run tcpdump on a host (or another host in the same network) and ping to a nonexistence host from the host, and see tcpdump's outputs.
>Fix:
One possible fix:

@@ -361,10 +361,6 @@ nd_resolve(struct llentry *ln, const struct rtentry *rt, struct mbuf *m,
         * does not exceed maxqueuelen.  When it exceeds maxqueuelen,
         * the oldest packet in the queue will be removed.
         */
-       if (ln->ln_state == ND_LLINFO_NOSTATE ||
-           ln->ln_state == ND_LLINFO_WAITDELETE)
-               ln->ln_state = ND_LLINFO_INCOMPLETE;
-
 #ifdef MBUFTRACE
        m_claimm(m, ln->lle_tbl->llt_mowner);
 #endif
@@ -406,6 +402,12 @@ nd_resolve(struct llentry *ln, const struct rtentry *rt, struct mbuf *m,
        else
                error = EWOULDBLOCK;

+       if (ln->ln_state == ND_LLINFO_NOSTATE ||
+           ln->ln_state == ND_LLINFO_WAITDELETE) {
+               ln->ln_asked = 0;
+               ln->ln_state = ND_LLINFO_INCOMPLETE;
+       }
+
        /*
         * If there has been no NS for the neighbor after entering the
         * INCOMPLETE state, send the first solicitation.

>Audit-Trail:
From: Ryota Ozaki <ozaki-r@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: kern/60071: The kernel stop sending ARP/NS packets on ping/ping6
Date: Thu, 19 Mar 2026 14:34:11 +0900

 On Thu, Mar 12, 2026 at 1:20=E2=80=AFPM ozaki-r@iij.ad.jp via gnats
 <gnats-admin@netbsd.org> wrote:
 >
 > >Number:         60071
 > >Category:       kern
 > >Synopsis:       The kernel stop sending ARP/NS packets on ping/ping6
 > >Confidential:   no
 > >Severity:       serious
 > >Priority:       medium
 > >Responsible:    kern-bug-people
 > >State:          open
 > >Class:          sw-bug
 > >Submitter-Id:   net
 > >Arrival-Date:   Thu Mar 12 04:20:00 +0000 2026
 > >Originator:     Ryota Ozaki
 > >Release:        current, 11, 10
 > >Organization:
 > IIJ
 > >Environment:
 > NetBSD kvm 11.99.5 NetBSD 11.99.5 (KVM) #32: Thu Mar 12 11:48:45 JST 2026=
   (hidden) amd64
 > >Description:
 > ping(8) with no option sends ICMP echo requests periodically.  If a targe=
 t host is not available, the kernel keeps sending ARP packets per the ICMP =
 packets.  This is probably the typical and expected behavior.  NetBSD 9, Ne=
 tBSD 8, FreeBSD 11 and Linux 6.0 acts like so.
 >
 > However, recent NetBSD kernels (10~) stop sending ARP packets at most net=
 .inet.arp.nd_bmaxtries times.
 >
 > ping6 (IPv6 NS) is the same situation.
 > >How-To-Repeat:
 > Run tcpdump on a host (or another host in the same network) and ping to a=
  nonexistence host from the host, and see tcpdump's outputs.
 > >Fix:
 > One possible fix:
 >
 > @@ -361,10 +361,6 @@ nd_resolve(struct llentry *ln, const struct rtentry =
 *rt, struct mbuf *m,
 >          * does not exceed maxqueuelen.  When it exceeds maxqueuelen,
 >          * 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 ND_LLINFO_INCOMPLETE;
 > -
 >  #ifdef MBUFTRACE
 >         m_claimm(m, ln->lle_tbl->llt_mowner);
 >  #endif
 > @@ -406,6 +402,12 @@ nd_resolve(struct llentry *ln, const struct rtentry =
 *rt, struct mbuf *m,
 >         else
 >                 error =3D EWOULDBLOCK;
 >
 > +       if (ln->ln_state =3D=3D ND_LLINFO_NOSTATE ||
 > +           ln->ln_state =3D=3D ND_LLINFO_WAITDELETE) {
 > +               ln->ln_asked =3D 0;
 > +               ln->ln_state =3D ND_LLINFO_INCOMPLETE;
 > +       }
 > +
 >         /*
 >          * If there has been no NS for the neighbor after entering the
 >          * INCOMPLETE state, send the first solicitation.
 >

 I've updated the possible fix:
 https://www.netbsd.org/~ozaki-r/fix-nd_resolve.diff
 The new diff is even closer to the old behavior; if unresolved, an error is
 constantly returned to the caller.

   ozaki-r

From: "Ryota Ozaki" <ozaki-r@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
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>
 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 = 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

 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 = ND_LLINFO_INCOMPLETE;
  		ln->ln_state = ND_LLINFO_WAITDELETE;
 +		ln->la_flags |= 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 == ND_LLINFO_NOSTATE ||
 -	    ln->ln_state == ND_LLINFO_WAITDELETE)
 +	    ln->ln_state == ND_LLINFO_WAITDELETE) {
 +		ln->ln_asked = 0;
  		ln->ln_state = 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 >= nd->nd_mmaxtries)
 +	if ((ln->la_flags & LLE_UNRESOLVED) != 0)
  		error = (rt != 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) >= ifp->if_addrlen);
  	memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen);
  	la->la_flags |= LLE_VALID;
 +	la->la_flags &= ~LLE_UNRESOLVED;
  	la->ln_asked = 0;
  	if (new_state != 0) {
  		la->ln_state = 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 |= LLE_VALID;
 +		ln->la_flags &= ~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.

From: Ryota Ozaki <ozaki-r@iij.ad.jp>
To: kern-bug-people@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org, 
	gnats-bugs@netbsd.org
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> wr=
 ote:
 >
 > The following reply was made to PR kern/60071; it has been noted by GNATS=
 .
 >
 > From: "Ryota Ozaki" <ozaki-r@netbsd.org>
 > To: gnats-bugs@gnats.NetBSD.org
 > 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>
 >  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.
 >

From: Thomas Klausner <wiz@netbsd.org>
To: Ryota Ozaki <ozaki-r@iij.ad.jp>
Cc: NetBSD bugtracking <gnats-bugs@netbsd.org>
Subject: Re: PR/60071 CVS commit: src/sys
Date: Thu, 26 Mar 2026 08:26:51 +0100

 On Thu, Mar 26, 2026 at 04:50:02AM +0100, Ryota Ozaki via gnats wrote:
 >  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?

 We don't change the commit message after a commit.

 The standard workaround is to commit a dummy commit to the same file
 (-f or whitespace change or similar), with an explanation that the
 previous commit message was wrong and that the new commit is just for
 adding the commit message for it to the repository.

 Cheers,
  Thomas

From: Ryota Ozaki <ozaki-r@iij.ad.jp>
To: gnats-bugs@netbsd.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: PR/60071 CVS commit: src/sys
Date: Thu, 26 Mar 2026 16:44:58 +0900

 On Thu, Mar 26, 2026 at 4:30=E2=80=AFPM Thomas Klausner via gnats
 <gnats-admin@netbsd.org> wrote:
 >
 > The following reply was made to PR kern/60071; it has been noted by GNATS=
 .
 >
 > From: Thomas Klausner <wiz@netbsd.org>
 > To: Ryota Ozaki <ozaki-r@iij.ad.jp>
 > Cc: NetBSD bugtracking <gnats-bugs@netbsd.org>
 > Subject: Re: PR/60071 CVS commit: src/sys
 > Date: Thu, 26 Mar 2026 08:26:51 +0100
 >
 >  On Thu, Mar 26, 2026 at 04:50:02AM +0100, Ryota Ozaki via gnats wrote:
 >  >  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?
 >
 >  We don't change the commit message after a commit.

 Oh, I see.

 >
 >  The standard workaround is to commit a dummy commit to the same file
 >  (-f or whitespace change or similar), with an explanation that the
 >  previous commit message was wrong and that the new commit is just for
 >  adding the commit message for it to the repository.

 Fortunately(?), the wrong commit log includes the correct commit log,
 so I think we don't need another commit.

 Anyway I'm sorry for my mistake,
   ozaki-r

 >
 >  Cheers,
 >   Thomas
 >

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60071 CVS commit: [netbsd-11] src
Date: Wed, 3 Jun 2026 18:41:37 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Wed Jun  3 18:41:37 UTC 2026

 Modified Files:
 	src/sys/net [netbsd-11]: if_llatbl.h nd.c
 	src/sys/netinet [netbsd-11]: if_arp.c
 	src/sys/netinet6 [netbsd-11]: nd6.c
 	src/tests/net/arp [netbsd-11]: t_arp.sh

 Log Message:
 Pull up following revision(s) (requested by ozaki-r in ticket #300):

 	sys/net/if_llatbl.h: revision 1.20
 	sys/netinet/if_arp.c: revision 1.319
 	sys/net/nd.c: revision 1.10
 	tests/net/arp/t_arp.sh: revision 1.50
 	tests/net/arp/t_arp.sh: revision 1.51
 	sys/netinet6/nd6.c: revision 1.286

 commit 27c3de6c8063a7850ef0efbea0d83f314e541ce8
 Author: Ryota Ozaki <ozaki-r@iij.ad.jp>
 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 = 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

 tests, arp: add keep_sending test

 It tests whether ARP sends requests more than net.inet.arp.nd_bmaxtries
 times while ping is sending packets.
 tests: skip arp_keep_sending test on qemu

 It doesn't work on qemu (on NetBSD?) while it works on other
 environments.


 To generate a diff of this commit:
 cvs rdiff -u -r1.19 -r1.19.10.1 src/sys/net/if_llatbl.h
 cvs rdiff -u -r1.7.4.1 -r1.7.4.2 src/sys/net/nd.c
 cvs rdiff -u -r1.317.2.1 -r1.317.2.2 src/sys/netinet/if_arp.c
 cvs rdiff -u -r1.284 -r1.284.2.1 src/sys/netinet6/nd6.c
 cvs rdiff -u -r1.48.2.1 -r1.48.2.2 src/tests/net/arp/t_arp.sh

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60071 CVS commit: [netbsd-10] src
Date: Wed, 3 Jun 2026 18:43:46 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Wed Jun  3 18:43:46 UTC 2026

 Modified Files:
 	src/sys/net [netbsd-10]: if_llatbl.h nd.c
 	src/sys/netinet [netbsd-10]: if_arp.c
 	src/sys/netinet6 [netbsd-10]: nd6.c
 	src/tests/net/arp [netbsd-10]: t_arp.sh

 Log Message:
 Pull up following revision(s) (requested by ozaki-r in ticket #1269):

 	sys/net/if_llatbl.h: revision 1.20
 	sys/netinet/if_arp.c: revision 1.319
 	sys/net/nd.c: revision 1.10
 	tests/net/arp/t_arp.sh: revision 1.50
 	tests/net/arp/t_arp.sh: revision 1.51
 	sys/netinet6/nd6.c: revision 1.286

 commit 27c3de6c8063a7850ef0efbea0d83f314e541ce8
 Author: Ryota Ozaki <ozaki-r@iij.ad.jp>
 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 = 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

 tests, arp: add keep_sending test

 It tests whether ARP sends requests more than net.inet.arp.nd_bmaxtries
 times while ping is sending packets.
 tests: skip arp_keep_sending test on qemu

 It doesn't work on qemu (on NetBSD?) while it works on other
 environments.


 To generate a diff of this commit:
 cvs rdiff -u -r1.19 -r1.19.2.1 src/sys/net/if_llatbl.h
 cvs rdiff -u -r1.5.2.2 -r1.5.2.3 src/sys/net/nd.c
 cvs rdiff -u -r1.311.2.4 -r1.311.2.5 src/sys/netinet/if_arp.c
 cvs rdiff -u -r1.279.4.4 -r1.279.4.5 src/sys/netinet6/nd6.c
 cvs rdiff -u -r1.45.6.3 -r1.45.6.4 src/tests/net/arp/t_arp.sh

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.51 2026/08/10 02:28:17 riastradh Exp $
$NetBSD: gnats_config.sh,v 1.10 2026/05/13 22:00:09 riastradh Exp $
Copyright © 1994-2026 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.