Date: Thu, 11 Nov 2004 20:26:57 +0300 From: Gleb Smirnoff <glebius@freebsd.org> To: Poul-Henning Kamp <phk@phk.freebsd.dk>, "Conrad J. Sabatier" <conrads@cox.net> Cc: current@freebsd.org Subject: Re: natd broken for days Message-ID: <20041111172657.GF66206@cell.sick.ru> In-Reply-To: <77381.1100191229@critter.freebsd.dk> References: <20041111163638.GA700@laptop.6bone.nl> <77381.1100191229@critter.freebsd.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
--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--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041111172657.GF66206>