From owner-freebsd-net@FreeBSD.ORG Tue Feb 24 02:21:18 2004 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BA5CE16A4CE; Tue, 24 Feb 2004 02:21:18 -0800 (PST) Received: from cell.sick.ru (cell.sick.ru [217.72.144.68]) by mx1.FreeBSD.org (Postfix) with ESMTP id A4D3543D2F; Tue, 24 Feb 2004 02:21:17 -0800 (PST) (envelope-from glebius@cell.sick.ru) Received: from cell.sick.ru (glebius@localhost [127.0.0.1]) by cell.sick.ru (8.12.9/8.12.8) with ESMTP id i1OALEQE077509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 24 Feb 2004 13:21:14 +0300 (MSK) (envelope-from glebius@cell.sick.ru) Received: (from glebius@localhost) by cell.sick.ru (8.12.9/8.12.6/Submit) id i1OALDeA077508; Tue, 24 Feb 2004 13:21:14 +0300 (MSK) Date: Tue, 24 Feb 2004 13:21:13 +0300 From: Gleb Smirnoff To: Andre Oppermann Message-ID: <20040224102113.GB77406@cell.sick.ru> Mail-Followup-To: Gleb Smirnoff , Andre Oppermann , freebsd-net@freebsd.org References: <20040224080353.GA76272@cell.sick.ru> <403B2423.DABF2E48@freebsd.org> Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline In-Reply-To: <403B2423.DABF2E48@freebsd.org> User-Agent: Mutt/1.5.6i cc: freebsd-net@freebsd.org Subject: Re: rtalloc()/rtfree() problems on CURRENT X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2004 10:21:18 -0000 Dear Andre, first, thanks for your feedback. On Tue, Feb 24, 2004 at 11:14:59AM +0100, Andre Oppermann wrote: A> Most of the time, if you don't need a cloned route allocated, you can A> just use rtalloc_ign(&ro, RTF_CLONING) to just get a reference to the A> existing rtentry. Not allocating a new cloned route saves work and A> time for the rtalloc code. Thanks for this hint. So if using rtalloc_ign() I do not need to call rtfree()? Why does this situation is not clear in manpage? :) A> > if (ro.ro_rt != NULL) { A> > struct rtentry *rt = ro.ro_rt; A> > A> > /* here some read-only things are done with rt */ A> A> Maybe you do some nasty things to rt here? Really, I don't :) Exact code is given at end of the mail. A> > rtfree(ro.ro_rt); A> > } A> > A> > But on CURRENT rtfree() causes panic. Here is backtrace: A> ... A> > Does this mean that something is broken in CURRENT or I am doing something wrong? A> A> rtalloc() and rtfree() are used quite often in the network code and A> otherwise work fine. The odds are high that you are doing something A> wrong. Here is exact code: bzero((caddr_t)&ro, sizeof(ro)); sin = (struct sockaddr_in *)&ro.ro_dst; sin->sin_len = sizeof(*sin); sin->sin_family = AF_INET; sin->sin_addr = fle->r.r_dst; rtalloc(&ro); if (ro.ro_rt != NULL) { struct rtentry *rt = ro.ro_rt; /* This is cloned route, use its parent */ if (ro.ro_rt->rt_flags & RTF_WASCLONED && ro.ro_rt->rt_parent) rt = ro.ro_rt->rt_parent; fle->o_ifx = rt->rt_ifp->if_index; if (rt->rt_flags & RTF_GATEWAY && rt->rt_gateway->sa_family == AF_INET) fle->next_hop = ((struct sockaddr_in *)(rt->rt_gateway))->sin_addr; if (rt_mask(rt)) fle->dst_mask = bit_count(((struct sockaddr_in *)rt_mask(rt))->sin_addr.s_a ddr); else if (rt->rt_flags & RTF_HOST) /* Give up. We can't determine mask :( */ fle->dst_mask = 32; rtfree(ro.ro_rt); } -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE