Date: Tue, 24 Feb 2004 15:34:27 +0300 From: Gleb Smirnoff <glebius@cell.sick.ru> To: Andre Oppermann <andre@freebsd.org> Cc: freebsd-net@freebsd.org Subject: Re: rtalloc()/rtfree() problems on CURRENT Message-ID: <20040224123427.GA78495@cell.sick.ru> In-Reply-To: <403B4182.F6BD7101@freebsd.org> References: <20040224080353.GA76272@cell.sick.ru> <403B2423.DABF2E48@freebsd.org> <20040224102113.GB77406@cell.sick.ru> <403B4182.F6BD7101@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 24, 2004 at 01:20:18PM +0100, Andre Oppermann wrote: A> > Thanks for this hint. So if using rtalloc_ign() I do not need to call rtfree()? A> You still have to call rtfree() to decrement the refcount of the rtentry. Thanks. A> > A> Maybe you do some nasty things to rt here? A> > A> > Really, I don't :) Exact code is given at end of the mail. A> A> You indeed do some nasty things. Please point me at 'em. I'm only reading some values from parent structure. A> > Here is exact code: A> > A> > bzero((caddr_t)&ro, sizeof(ro)); A> > sin = (struct sockaddr_in *)&ro.ro_dst; A> > sin->sin_len = sizeof(*sin); A> > sin->sin_family = AF_INET; A> > sin->sin_addr = fle->r.r_dst; A> > rtalloc(&ro); A> > if (ro.ro_rt != NULL) { A> > struct rtentry *rt = ro.ro_rt; A> > A> > /* This is cloned route, use its parent */ A> > if (ro.ro_rt->rt_flags & RTF_WASCLONED && A> > ro.ro_rt->rt_parent) A> > rt = ro.ro_rt->rt_parent; A> A> With rtalloc() you get a cloned route essentially every time. Use A> rtalloc_ign(&ro, RTF_CLONING) to get the parent route directly. A> A> > fle->o_ifx = rt->rt_ifp->if_index; A> > A> > if (rt->rt_flags & RTF_GATEWAY && A> > rt->rt_gateway->sa_family == AF_INET) A> > fle->next_hop = A> > ((struct sockaddr_in *)(rt->rt_gateway))->sin_addr; A> > A> > if (rt_mask(rt)) A> > fle->dst_mask = A> > bit_count(((struct sockaddr_in *)rt_mask(rt))->sin_addr.s_addr); A> > else if (rt->rt_flags & RTF_HOST) A> > /* Give up. We can't determine mask :( */ A> > fle->dst_mask = 32; A> > A> > rtfree(ro.ro_rt); A> A> Use the macro RTFREE() instead of rtfree(), it will take care of some A> locking issues. This should be present in manpage, too. -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040224123427.GA78495>