Skip site navigation (1)Skip section navigation (2)
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>