From owner-freebsd-net Mon Mar 5 12: 4:47 2001 Delivered-To: freebsd-net@freebsd.org Received: from zibbi.icomtek.csir.co.za (zibbi.icomtek.csir.co.za [146.64.24.58]) by hub.freebsd.org (Postfix) with ESMTP id 6B91A37B718 for ; Mon, 5 Mar 2001 12:04:40 -0800 (PST) (envelope-from jhay@zibbi.icomtek.csir.co.za) Received: (from jhay@localhost) by zibbi.icomtek.csir.co.za (8.11.1/8.11.1) id f25K3vd32980; Mon, 5 Mar 2001 22:03:57 +0200 (SAT) (envelope-from jhay) From: John Hay Message-Id: <200103052003.f25K3vd32980@zibbi.icomtek.csir.co.za> Subject: Re: kernel: nd6_storelladdr failed, mbuf leak In-Reply-To: <005901c0a5a1$c54476d0$becbca18@jehovah> from Bosko Milekic at "Mar 5, 2001 01:26:17 pm" To: bmilekic@technokratis.com (Bosko Milekic) Date: Mon, 5 Mar 2001 22:03:57 +0200 (SAT) Cc: freebsd-net@FreeBSD.ORG X-Mailer: ELM [version 2.4ME+ PL54 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org > > > I have configured a 4-stable machine to be a router, routing ipv4, > ipv6 > > and ipx. To be able to do Ethernet_II framing on one interface and > 802.3 > > on another I have used if_ef.ko. > > > > I then noticed that "... kernel: nd6_storelladdr failed" gets logged > > often and after a while all mbufs are used. It turned out that in > > sys/net/if_ethersubr.c in ether_output() when nd6_storelladdr() > fails, > > it does a return(0) and does not free the mbuf. I checked -current > > and it is still like that. > > It should not be freeing the mbuf, because that mbuf is being > passed as an argument to ether_output(). It is typically the caller > that ought to be responsible for freeing the mbuf in this case. The purpose of ether_output() is normally to get the packet (mbuf) onto the correct interface queue so that it will be sent out. As such whoever calls ether_output() is not going to do anything with that mbuf again. If ether_output don't put it on a queue, it should free it. Well maybe I was a bit vague about the exact place. I claim that the return(0) at line 188 of if_ethersubr.c in -stable and line 189 in -current should be "goto bad" or something that will either use the mbuf or do a m_freem() and not just return and leave the mbuf in the air. The code looks something like this: case AF_INET6: if (!nd6_storelladdr(&ac->ac_if, rt, m, dst, (u_char *)edst)) { /* this must be impossible, so we bark */ printf("nd6_storelladdr failed\n"); ===> return(0); } > > > Now the reason it fails is that the ef(4) device use an ifp->if_type > > (IFT_XETHER) that nd6_storelladdr() does not expect. > > > > Oh as a workaround I have configured route6d to ignore fxp1f0. > > John -- John Hay -- John.Hay@icomtek.csir.co.za To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message