From owner-freebsd-current@FreeBSD.ORG Thu Nov 11 17:27:03 2004 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5A98416A4CE for ; Thu, 11 Nov 2004 17:27:03 +0000 (GMT) Received: from relay.bestcom.ru (relay.bestcom.ru [217.72.144.5]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6C21B43D2F for ; Thu, 11 Nov 2004 17:27:02 +0000 (GMT) (envelope-from glebius@freebsd.org) Received: from cell.sick.ru (root@cell.sick.ru [217.72.144.68]) by relay.bestcom.ru (8.13.1/8.12.9) with ESMTP id iABHQwH5020347 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 11 Nov 2004 20:26:58 +0300 (MSK) (envelope-from glebius@freebsd.org) Received: from cell.sick.ru (glebius@localhost [127.0.0.1]) by cell.sick.ru (8.12.11/8.12.8) with ESMTP id iABHQvh2066936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 11 Nov 2004 20:26:58 +0300 (MSK) (envelope-from glebius@freebsd.org) Received: (from glebius@localhost) by cell.sick.ru (8.12.11/8.12.11/Submit) id iABHQvLa066935; Thu, 11 Nov 2004 20:26:57 +0300 (MSK) (envelope-from glebius@freebsd.org) X-Authentication-Warning: cell.sick.ru: glebius set sender to glebius@freebsd.org using -f Date: Thu, 11 Nov 2004 20:26:57 +0300 From: Gleb Smirnoff To: Poul-Henning Kamp , "Conrad J. Sabatier" Message-ID: <20041111172657.GF66206@cell.sick.ru> References: <20041111163638.GA700@laptop.6bone.nl> <77381.1100191229@critter.freebsd.dk> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="J2SCkAp4GZ/dPZZf" Content-Disposition: inline In-Reply-To: <77381.1100191229@critter.freebsd.dk> X-NCC-RegId: ru.bestcom User-Agent: Mutt/1.5.6i X-Virus-Scanned: clamd / ClamAV version devel-20041013, clamav-milter version 0.75l on 127.0.0.1 X-Virus-Status: Clean cc: current@freebsd.org Subject: Re: natd broken for days X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Nov 2004 17:27:03 -0000 --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=koi8-r Content-Disposition: inline On Thu, Nov 11, 2004 at 05:40:29PM +0100, Poul-Henning Kamp wrote: P> In message <20041111163638.GA700@laptop.6bone.nl>, Mark Santcroos writes: P> >On Thu, Nov 11, 2004 at 05:25:23AM -0800, Sean McNeil wrote: P> >> It has been reported that both amd64 and i386 architectures will panic P> >> in natd by jumping to address 0. There has been no discussion since the P> >> reports, however, and I was wondering if anyone is looking into it. P> > P> >This should fix it. P> P> We have a problem if that is the case, because then ipdivert P> doesn't run through net_init_domain() :-( Poul-Henning, can you review attached patch? Conrad, can you test it? -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=koi8-r Content-Disposition: attachment; filename="uipc_domain.c.diff" Index: uipc_domain.c =================================================================== RCS file: /home/ncvs/src/sys/kern/uipc_domain.c,v retrieving revision 1.39 diff -u -r1.39 uipc_domain.c --- uipc_domain.c 8 Nov 2004 14:44:52 -0000 1.39 +++ uipc_domain.c 11 Nov 2004 17:23:42 -0000 @@ -97,6 +97,34 @@ .pru_sosetlabel = pru_sosetlabel_null }; +static void +protosw_init(struct protosw *pr) +{ + struct pr_usrreqs *pu; + + pu = pr->pr_usrreqs; + KASSERT(pu != NULL, ("protosw_init: %ssw[%d] has no usrreqs!", + pr->pr_domain->dom_name, + (int)(pr - pr->pr_domain->dom_protosw))); + +#define DEFAULT(foo, bar) if ((foo) == NULL) (foo) = (bar) + DEFAULT(pu->pru_accept, pru_accept_notsupp); + DEFAULT(pu->pru_connect, pru_connect_notsupp); + DEFAULT(pu->pru_connect2, pru_connect2_notsupp); + DEFAULT(pu->pru_control, pru_control_notsupp); + DEFAULT(pu->pru_listen, pru_listen_notsupp); + DEFAULT(pu->pru_rcvd, pru_rcvd_notsupp); + DEFAULT(pu->pru_rcvoob, pru_rcvoob_notsupp); + DEFAULT(pu->pru_sense, pru_sense_null); + DEFAULT(pu->pru_sosend, sosend); + DEFAULT(pu->pru_soreceive, soreceive); + DEFAULT(pu->pru_sopoll, sopoll); + DEFAULT(pu->pru_sosetlabel, pru_sosetlabel_null); +#undef DEFAULT + if (pr->pr_init) + (*pr->pr_init)(); +} + /* * Add a new protocol domain to the list of supported domains * Note: you cant unload it again because a socket may be using it. @@ -106,33 +134,11 @@ net_init_domain(struct domain *dp) { struct protosw *pr; - struct pr_usrreqs *pu; if (dp->dom_init) (*dp->dom_init)(); - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++){ - pu = pr->pr_usrreqs; - KASSERT(pu != NULL, - ("domaininit: %ssw[%d] has no usrreqs!", - dp->dom_name, (int)(pr - dp->dom_protosw))); -#define DEFAULT(foo, bar) if ((foo) == NULL) (foo) = (bar) - DEFAULT(pu->pru_accept, pru_accept_notsupp); - DEFAULT(pu->pru_connect, pru_connect_notsupp); - DEFAULT(pu->pru_connect2, pru_connect2_notsupp); - DEFAULT(pu->pru_control, pru_control_notsupp); - DEFAULT(pu->pru_listen, pru_listen_notsupp); - DEFAULT(pu->pru_rcvd, pru_rcvd_notsupp); - DEFAULT(pu->pru_rcvoob, pru_rcvoob_notsupp); - DEFAULT(pu->pru_sense, pru_sense_null); - DEFAULT(pu->pru_sosend, sosend); - DEFAULT(pu->pru_soreceive, soreceive); - DEFAULT(pu->pru_sopoll, sopoll); - DEFAULT(pu->pru_sosetlabel, pru_sosetlabel_null); -#undef DEFAULT - - if (pr->pr_init) - (*pr->pr_init)(); - } + for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) + protosw_init(pr); /* * update global information about maximums */ @@ -298,8 +304,7 @@ mtx_unlock(&Giant); /* Initialize and activate the protocol. */ - if (fpr->pr_init) - (fpr->pr_init)(); + protosw_init(fpr); return (0); } --J2SCkAp4GZ/dPZZf--