Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Mar 2001 22:03:57 +0200 (SAT)
From:      John Hay <jhay@icomtek.csir.co.za>
To:        bmilekic@technokratis.com (Bosko Milekic)
Cc:        freebsd-net@FreeBSD.ORG
Subject:   Re: kernel: nd6_storelladdr failed, mbuf leak
Message-ID:  <200103052003.f25K3vd32980@zibbi.icomtek.csir.co.za>
In-Reply-To: <005901c0a5a1$c54476d0$becbca18@jehovah> from Bosko Milekic at "Mar 5, 2001 01:26:17 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> > 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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103052003.f25K3vd32980>