From owner-freebsd-net Wed Mar 5 4:20:20 2003 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 23EEA37B401; Wed, 5 Mar 2003 04:19:27 -0800 (PST) Received: from heron.mail.pas.earthlink.net (heron.mail.pas.earthlink.net [207.217.120.189]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0939843FBF; Wed, 5 Mar 2003 04:19:25 -0800 (PST) (envelope-from tlambert2@mindspring.com) Received: from dialup-209.245.138.78.dial1.sanjose1.level3.net ([209.245.138.78] helo=mindspring.com) by heron.mail.pas.earthlink.net with asmtp (SSLv3:RC4-MD5:128) (Exim 3.33 #1) id 18qXrG-0004Dk-00; Wed, 05 Mar 2003 04:18:51 -0800 Message-ID: <3E65E7A5.DBD9097A@mindspring.com> Date: Wed, 05 Mar 2003 04:03:49 -0800 From: Terry Lambert X-Mailer: Mozilla 4.79 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: Peter Wemm Cc: Mike Barcroft , Tim Robbins , freebsd-net@freebsd.org, freebsd-current@freebsd.org Subject: Re: [PATCH 5.x] netns References: <20030305013509.AD7662A8BB@canning.wemm.org> Content-Type: multipart/mixed; boundary="------------683C78166CD831774FABBA7C" X-ELNK-Trace: b1a02af9316fbb217a47c185c03b154d40683398e744b8a4d7bdc6a7051604583ef0aeb5b0711289a7ce0e8f8d31aa3f350badd9bab72f9c350badd9bab72f9c Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org This is a multi-part message in MIME format. --------------683C78166CD831774FABBA7C Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Peter Wemm wrote: > Terry Lambert wrote: > > Here are two patches. The first fixes missing pieces in /sys/conf/files > > and /sys/conf/options, the second fixes all the files that need it in > > /sys/netns/. > > You seem to have posted the wrong patch. > > This is against 4.x, not -current, and this is current@freebsd.org. Here is a single patch vs. 5.x. I believe this makes it actually work. I have addressed all the protosw issues in this patch. Please apply this to the code, even if you are intent on putting working code in the Attic. Thanks, -- Terry --------------683C78166CD831774FABBA7C Content-Type: text/plain; charset=us-ascii; name="netns5.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="netns5.diff" Index: conf/files =================================================================== RCS file: /cvs/src/sys/conf/files,v retrieving revision 1.765 diff -c -r1.765 files *** conf/files 4 Mar 2003 23:19:55 -0000 1.765 --- conf/files 5 Mar 2003 06:03:11 -0000 *************** *** 1429,1434 **** --- 1429,1435 ---- netns/ns_output.c optional ns netns/ns_pcb.c optional ns netns/ns_proto.c optional ns + netns/ns_cksum.c optional ns netns/spp_debug.c optional ns netns/spp_usrreq.c optional ns netsmb/smb_conn.c optional netsmb Index: netns/idp_usrreq.c =================================================================== RCS file: /cvs/src/sys/netns/idp_usrreq.c,v retrieving revision 1.15 diff -c -r1.15 idp_usrreq.c *** netns/idp_usrreq.c 19 Feb 2003 05:47:37 -0000 1.15 --- netns/idp_usrreq.c 5 Mar 2003 08:04:20 -0000 *************** *** 54,59 **** --- 54,63 ---- #include #include + extern int idpcksum; /* from ns_input.c */ + extern long ns_pexseq; /* from ns_input.c */ + extern struct nspcb nsrawpcb; /* from ns_input.c */ + /* * IDP protocol implementation. */ *************** *** 63,72 **** /* * This may also be called for raw listeners. */ ! idp_input(m, nsp) struct mbuf *m; ! register struct nspcb *nsp; { register struct idp *idp = mtod(m, struct idp *); struct ifnet *ifp = m->m_pkthdr.rcvif; --- 67,78 ---- /* * This may also be called for raw listeners. */ ! void ! idp_input(m, nsp0) struct mbuf *m; ! int nsp0; /* XXX offset */ { + register struct nspcb *nsp = ns_pcblookupm(m); register struct idp *idp = mtod(m, struct idp *); struct ifnet *ifp = m->m_pkthdr.rcvif; *************** *** 79,92 **** idp_ns.sns_addr = idp->idp_sna; if (ns_neteqnn(idp->idp_sna.x_net, ns_zeronet) && ifp) { register struct ifaddr *ifa; ! for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family == AF_NS) { idp_ns.sns_addr.x_net = IA_SNS(ifa)->sns_addr.x_net; break; } ! } } nsp->nsp_rpt = idp->idp_pt; if ( ! (nsp->nsp_flags & NSP_RAWIN) ) { --- 85,100 ---- idp_ns.sns_addr = idp->idp_sna; if (ns_neteqnn(idp->idp_sna.x_net, ns_zeronet) && ifp) { register struct ifaddr *ifa; + int s; ! s = splimp(); ! TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) if (ifa->ifa_addr->sa_family == AF_NS) { idp_ns.sns_addr.x_net = IA_SNS(ifa)->sns_addr.x_net; break; } ! splx(s); } nsp->nsp_rpt = idp->idp_pt; if ( ! (nsp->nsp_flags & NSP_RAWIN) ) { *************** *** 103,108 **** --- 111,117 ---- m_freem(m); } + void idp_abort(nsp) struct nspcb *nsp; { *************** *** 134,153 **** so->so_error = errno; ns_pcbdisconnect(nsp); soisdisconnected(so); } int noIdpRoute; ! idp_output(nsp, m0) ! struct nspcb *nsp; struct mbuf *m0; { ! register struct mbuf *m; register struct idp *idp; - register struct socket *so; register int len; register struct route *ro; ! struct mbuf *mprev; ! extern int idpcksum; len = m_length(m0, &mprev); /* --- 143,164 ---- so->so_error = errno; ns_pcbdisconnect(nsp); soisdisconnected(so); + return(NULL); /* XXX */ } int noIdpRoute; ! ! int ! idp_output(m0, so) struct mbuf *m0; + struct socket *so; { ! struct nspcb *nsp = sotonspcb(so); ! struct mbuf *m; register struct idp *idp; register int len; register struct route *ro; ! struct mbuf *mprev = NULL; len = m_length(m0, &mprev); /* *************** *** 204,210 **** /* * Output datagram. */ - so = nsp->nsp_socket; if (so->so_options & SO_DONTROUTE) return (ns_output(m, (struct route *)0, (so->so_options & SO_BROADCAST) | NS_ROUTETOIF)); --- 215,220 ---- *************** *** 253,274 **** if (noIdpRoute) ro = 0; return (ns_output(m, ro, so->so_options & SO_BROADCAST)); } /* ARGSUSED */ ! idp_ctloutput(req, so, level, name, value) ! int req, level; struct socket *so; ! int name; ! struct mbuf **value; { register struct mbuf *m; struct nspcb *nsp = sotonspcb(so); int mask, error = 0; - extern long ns_pexseq; if (nsp == NULL) return (EINVAL); ! switch (req) { case PRCO_GETOPT: if (value==NULL) --- 263,284 ---- if (noIdpRoute) ro = 0; return (ns_output(m, ro, so->so_options & SO_BROADCAST)); } + /* ARGSUSED */ ! int ! idp_ctloutput( so, sopt) struct socket *so; ! struct sockopt *sopt; { register struct mbuf *m; + struct mbuf **value = sopt->sopt_val; /* XXX dangerous */ struct nspcb *nsp = sotonspcb(so); int mask, error = 0; if (nsp == NULL) return (EINVAL); ! switch (sopt->sopt_dir) { case PRCO_GETOPT: if (value==NULL) *************** *** 276,282 **** m = m_get(M_DONTWAIT, MT_DATA); if (m==NULL) return (ENOBUFS); ! switch (name) { case SO_ALL_PACKETS: mask = NSP_ALL_PACKETS; --- 286,292 ---- m = m_get(M_DONTWAIT, MT_DATA); if (m==NULL) return (ENOBUFS); ! switch (sopt->sopt_name) { case SO_ALL_PACKETS: mask = NSP_ALL_PACKETS; *************** *** 318,324 **** break; case PRCO_SETOPT: ! switch (name) { int *ok; case SO_ALL_PACKETS: --- 328,334 ---- break; case PRCO_SETOPT: ! switch (sopt->sopt_name) { int *ok; case SO_ALL_PACKETS: *************** *** 365,374 **** } /*ARGSUSED*/ ! idp_usrreq(so, req, m, nam, control) struct socket *so; int req; struct mbuf *m, *nam, *control; { struct nspcb *nsp = sotonspcb(so); int error = 0; --- 375,386 ---- } /*ARGSUSED*/ ! int ! idp_usrreq(so, req, m, nam, control, td) struct socket *so; int req; struct mbuf *m, *nam, *control; + struct thread *td; { struct nspcb *nsp = sotonspcb(so); int error = 0; *************** *** 449,455 **** case PRU_SEND: { struct ns_addr laddr; ! int s; if (nam) { laddr = nsp->nsp_laddr; --- 461,467 ---- case PRU_SEND: { struct ns_addr laddr; ! int s = -1; /* XXX compiler warns improperly */ if (nam) { laddr = nsp->nsp_laddr; *************** *** 472,478 **** break; } } ! error = idp_output(nsp, m); m = NULL; if (nam) { ns_pcbdisconnect(nsp); --- 484,490 ---- break; } } ! error = idp_output(m, so); m = NULL; if (nam) { ns_pcbdisconnect(nsp); *************** *** 526,549 **** m_freem(m); return (error); } /*ARGSUSED*/ ! idp_raw_usrreq(so, req, m, nam, control) struct socket *so; int req; struct mbuf *m, *nam, *control; { int error = 0; struct nspcb *nsp = sotonspcb(so); - extern struct nspcb nsrawpcb; switch (req) { case PRU_ATTACH: if (!(so->so_state & SS_PRIV) || (nsp != NULL)) { error = EINVAL; break; } error = ns_pcballoc(so, &nsrawpcb); if (error) break; --- 538,566 ---- m_freem(m); return (error); } + /*ARGSUSED*/ ! int ! idp_raw_usrreq(so, req, m, nam, control, td) struct socket *so; int req; struct mbuf *m, *nam, *control; + struct thread *td; { int error = 0; struct nspcb *nsp = sotonspcb(so); switch (req) { case PRU_ATTACH: + #ifdef NS_PRIV_SOCKETS if (!(so->so_state & SS_PRIV) || (nsp != NULL)) { error = EINVAL; break; } + #endif /* NS_PRIV_SOCKETS */ + error = ns_pcballoc(so, &nsrawpcb); if (error) break; *************** *** 555,561 **** nsp->nsp_flags = NSP_RAWIN | NSP_RAWOUT; break; default: ! error = idp_usrreq(so, req, m, nam, control); } return (error); } --- 572,578 ---- nsp->nsp_flags = NSP_RAWIN | NSP_RAWOUT; break; default: ! error = idp_usrreq(so, req, m, nam, control, td); } return (error); } Index: netns/idp_var.h =================================================================== RCS file: /cvs/src/sys/netns/idp_var.h,v retrieving revision 1.10 diff -c -r1.10 idp_var.h *** netns/idp_var.h 29 Dec 1999 04:46:18 -0000 1.10 --- netns/idp_var.h 5 Mar 2003 07:51:33 -0000 *************** *** 50,55 **** --- 50,67 ---- #ifdef _KERNEL struct idpstat idpstat; + struct nspcb; /* declare in scope for ptr parameter */ + struct thread; /* XXX not used */ + + void idp_abort __P((struct nspcb *)); + void idp_input __P((struct mbuf *, int)); + struct nspcb *idp_drop __P((struct nspcb *, int)); + int idp_output __P(( struct mbuf *, struct socket *)); + int idp_ctloutput __P((struct socket *, struct sockopt *)); + int idp_usrreq __P(( struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *, struct thread *)); + int idp_raw_usrreq __P(( struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *, struct thread *)); #endif #endif Index: netns/ns.c =================================================================== RCS file: /cvs/src/sys/netns/ns.c,v retrieving revision 1.13 diff -c -r1.13 ns.c *** netns/ns.c 19 Feb 2003 05:47:37 -0000 1.13 --- netns/ns.c 5 Mar 2003 06:32:52 -0000 *************** *** 36,43 **** #include #include #include ! #include #include #include #include --- 36,44 ---- #include #include + #include #include ! #include #include #include #include *************** *** 49,54 **** --- 50,57 ---- #include #include + #include "opt_ns.h" + #ifdef NS struct ns_ifaddr *ns_ifaddr; *************** *** 59,64 **** --- 62,68 ---- * Generic internet control operations (ioctl's). */ /* ARGSUSED */ + int ns_control(so, cmd, data, ifp) struct socket *so; int cmd; *************** *** 68,76 **** register struct ifreq *ifr = (struct ifreq *)data; register struct ns_aliasreq *ifra = (struct ns_aliasreq *)data; register struct ns_ifaddr *ia; ! struct ifaddr *ifa; struct ns_ifaddr *oia; ! int error, dstIsNew, hostIsNew; /* * Find address for this interface, if it exists. --- 72,81 ---- register struct ifreq *ifr = (struct ifreq *)data; register struct ns_aliasreq *ifra = (struct ns_aliasreq *)data; register struct ns_ifaddr *ia; ! struct ifaddr *ifa = NULL; /* XXX used uninitialized ?*/ struct ns_ifaddr *oia; ! int dstIsNew, hostIsNew; ! int error = 0; /* initialize because of scoping */ /* * Find address for this interface, if it exists. *************** *** 107,114 **** --- 112,121 ---- return (0); } + #ifdef NS_PRIV_SOCKETS if ((so->so_state & SS_PRIV) == 0) return (EPERM); + #endif /* NS_PRIV_SOCKETS */ switch (cmd) { case SIOCAIFADDR: *************** *** 132,150 **** if (oia == (struct ns_ifaddr *)NULL) return (ENOBUFS); bzero((caddr_t)oia, sizeof(*oia)); ! if (ia = ns_ifaddr) { for ( ; ia->ia_next; ia = ia->ia_next) ; ia->ia_next = oia; } else ns_ifaddr = oia; ia = oia; ! if (ifa = ifp->if_addrlist) { ! for ( ; ifa->ifa_next; ifa = ifa->ifa_next) ! ; ! ifa->ifa_next = (struct ifaddr *) ia; ! } else ! ifp->if_addrlist = (struct ifaddr *) ia; ia->ia_ifp = ifp; ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; --- 139,153 ---- if (oia == (struct ns_ifaddr *)NULL) return (ENOBUFS); bzero((caddr_t)oia, sizeof(*oia)); ! if ((ia = ns_ifaddr) != NULL) { for ( ; ia->ia_next; ia = ia->ia_next) ; ia->ia_next = oia; } else ns_ifaddr = oia; ia = oia; ! ! TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link); ia->ia_ifp = ifp; ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; *************** *** 163,170 **** } switch (cmd) { - int error; - case SIOCSIFDSTADDR: if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); --- 166,171 ---- *************** *** 173,179 **** ia->ia_flags &= ~IFA_ROUTE; } if (ifp->if_ioctl) { ! error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia); if (error) return (error); } --- 174,181 ---- ia->ia_flags &= ~IFA_ROUTE; } if (ifp->if_ioctl) { ! error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ! (caddr_t)ia); if (error) return (error); } *************** *** 181,203 **** return (0); case SIOCSIFADDR: ! return (ns_ifinit(ifp, ia, (struct sockaddr_ns *)&ifr->ifr_addr, 1)); case SIOCDIFADDR: ! ns_ifscrub(ifp, ia); ! if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia) ! ifp->if_addrlist = ifa->ifa_next; ! else { ! while (ifa->ifa_next && ! (ifa->ifa_next != (struct ifaddr *)ia)) ! ifa = ifa->ifa_next; ! if (ifa->ifa_next) ! ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next; ! else ! printf("Couldn't unlink nsifaddr from ifp\n"); ! } oia = ia; if (oia == (ia = ns_ifaddr)) { ns_ifaddr = ia->ia_next; } else { --- 183,196 ---- return (0); case SIOCSIFADDR: ! return (ns_ifinit(ifp, (struct ns_ifaddr *)ia, (struct sockaddr_ns *)&ifr->ifr_addr, 1)); case SIOCDIFADDR: ! ns_ifscrub(ifp, (struct ns_ifaddr *)ia); ! /* XXX not on list? */ oia = ia; + TAILQ_REMOVE(&ifp->if_addrhead, (struct ifaddr *)ia, ifa_link); if (oia == (ia = ns_ifaddr)) { ns_ifaddr = ia->ia_next; } else { *************** *** 231,243 **** if ((ifp->if_flags & IFF_POINTOPOINT) && (ifra->ifra_dstaddr.sns_family == AF_NS)) { if (hostIsNew == 0) ! ns_ifscrub(ifp, ia); ia->ia_dstaddr = ifra->ifra_dstaddr; dstIsNew = 1; } if (ifra->ifra_addr.sns_family == AF_NS && (hostIsNew || dstIsNew)) ! error = ns_ifinit(ifp, ia, &ifra->ifra_addr, 0); return (error); default: --- 224,237 ---- if ((ifp->if_flags & IFF_POINTOPOINT) && (ifra->ifra_dstaddr.sns_family == AF_NS)) { if (hostIsNew == 0) ! ns_ifscrub(ifp, (struct ns_ifaddr *)ia); ia->ia_dstaddr = ifra->ifra_dstaddr; dstIsNew = 1; } if (ifra->ifra_addr.sns_family == AF_NS && (hostIsNew || dstIsNew)) ! error = ns_ifinit(ifp, (struct ns_ifaddr *)ia, ! &ifra->ifra_addr, 0); return (error); default: *************** *** 250,255 **** --- 244,250 ---- /* * Delete any previous route for an old address. */ + void ns_ifscrub(ifp, ia) register struct ifnet *ifp; register struct ns_ifaddr *ia; *************** *** 266,275 **** --- 261,272 ---- * Initialize an interface's internet address * and routing table entry. */ + int ns_ifinit(ifp, ia, sns, scrub) register struct ifnet *ifp; register struct ns_ifaddr *ia; register struct sockaddr_ns *sns; + int scrub; { struct sockaddr_ns oldaddr; register union ns_host *h = &ia->ia_addr.sns_addr.x_host; *************** *** 294,300 **** */ if (ns_hosteqnh(ns_thishost, ns_zerohost)) { if (ifp->if_ioctl && ! (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) { ia->ia_addr = oldaddr; splx(s); return (error); --- 291,298 ---- */ if (ns_hosteqnh(ns_thishost, ns_zerohost)) { if (ifp->if_ioctl && ! (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ! (caddr_t)ia))) { ia->ia_addr = oldaddr; splx(s); return (error); *************** *** 304,310 **** || ns_hosteqnh(sns->sns_addr.x_host, ns_thishost)) { *h = ns_thishost; if (ifp->if_ioctl && ! (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) { ia->ia_addr = oldaddr; splx(s); return (error); --- 302,309 ---- || ns_hosteqnh(sns->sns_addr.x_host, ns_thishost)) { *h = ns_thishost; if (ifp->if_ioctl && ! (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ! (caddr_t)ia))) { ia->ia_addr = oldaddr; splx(s); return (error); *************** *** 352,358 **** union ns_net net = dst->x_net; for (ia = ns_ifaddr; ia; ia = ia->ia_next) { ! if (ifp = ia->ia_ifp) { if (ifp->if_flags & IFF_POINTOPOINT) { compare = &satons_addr(ia->ia_dstaddr); if (ns_hosteq(*dst, *compare)) --- 351,357 ---- union ns_net net = dst->x_net; for (ia = ns_ifaddr; ia; ia = ia->ia_next) { ! if ((ifp = ia->ia_ifp) != NULL) { if (ifp->if_flags & IFF_POINTOPOINT) { compare = &satons_addr(ia->ia_dstaddr); if (ns_hosteq(*dst, *compare)) Index: netns/ns.h =================================================================== RCS file: /cvs/src/sys/netns/ns.h,v retrieving revision 1.16 diff -c -r1.16 ns.h *** netns/ns.h 6 Sep 2002 16:58:13 -0000 1.16 --- netns/ns.h 5 Mar 2003 07:03:40 -0000 *************** *** 139,145 **** extern union ns_host ns_broadhost; extern union ns_net ns_zeronet; extern union ns_net ns_broadnet; ! u_short ns_cksum(void); #else #include --- 139,160 ---- extern union ns_host ns_broadhost; extern union ns_net ns_zeronet; extern union ns_net ns_broadnet; ! ! struct route; ! struct ns_ifaddr; ! ! u_short ns_cksum __P(( struct mbuf *, int)); ! int ns_output __P((struct mbuf *, struct route *, int)); ! int ns_control __P((struct socket *, int, caddr_t, struct ifnet *)); ! void ns_init __P((void)); ! void idp_forward __P((struct mbuf *)); ! void idp_ctlinput __P((int, struct sockaddr *, void *)); ! int idp_do_route __P((struct ns_addr *, struct route *)); ! void idp_undo_route __P((struct route *)); ! void ns_watch_output __P((struct mbuf *, struct ifnet *)); ! int ns_ifinit __P((struct ifnet *, struct ns_ifaddr *, struct sockaddr_ns *, ! int)); ! void ns_ifscrub __P((struct ifnet *, struct ns_ifaddr *)); #else #include Index: netns/ns_cksum.c =================================================================== RCS file: /cvs/src/sys/netns/ns_cksum.c,v retrieving revision 1.7 diff -c -r1.7 ns_cksum.c *** netns/ns_cksum.c 28 Aug 1999 00:49:49 -0000 1.7 --- netns/ns_cksum.c 5 Mar 2003 08:08:55 -0000 *************** *** 37,42 **** --- 37,47 ---- #include #include + #include + #include + #include + #include /* prototype in scope */ + /* * Checksum routine for Network Systems Protocol Packets (Big-Endian). * Index: netns/ns_error.c =================================================================== RCS file: /cvs/src/sys/netns/ns_error.c,v retrieving revision 1.11 diff -c -r1.11 ns_error.c *** netns/ns_error.c 19 Feb 2003 05:47:37 -0000 1.11 --- netns/ns_error.c 5 Mar 2003 07:09:51 -0000 *************** *** 50,55 **** --- 50,60 ---- #include #include + extern int idpcksum; /* from ns_input.c */ + /* from spp_usrreq.c XXX */ + extern void spp_ctlinput( int, struct sockaddr *, void *); + + #ifdef lint #define NS_ERRPRINTFS 1 #endif *************** *** 62,68 **** --- 67,75 ---- int ns_errprintfs = 0; #endif + int ns_err_x(c) + int c; { register u_short *w, *lim, *base = ns_errstat.ns_es_codes; u_short x = c; *************** *** 86,101 **** * Generate an error packet of type error * in response to bad packet. */ ! ns_error(om, type, param) struct mbuf *om; int type; { register struct ns_epidp *ep; struct mbuf *m; struct idp *nip; register struct idp *oip = mtod(om, struct idp *); - extern int idpcksum; /* * If this packet was sent to the echo port, --- 93,108 ---- * Generate an error packet of type error * in response to bad packet. */ ! void ns_error(om, type, param) struct mbuf *om; int type; + int param; { register struct ns_epidp *ep; struct mbuf *m; struct idp *nip; register struct idp *oip = mtod(om, struct idp *); /* * If this packet was sent to the echo port, *************** *** 165,170 **** --- 172,178 ---- m_freem(om); } + void ns_printhost(p) register struct ns_addr *p; { *************** *** 182,192 **** --- 190,203 ---- /* * Process a received NS_ERR message. */ + void ns_err_input(m) struct mbuf *m; { register struct ns_errp *ep; + #ifdef NS_ERRPRINTFS register struct ns_epidp *epidp = mtod(m, struct ns_epidp *); + #endif register int i; int type, code, param; *************** *** 263,273 **** #endif switch(ep->ns_err_idp.idp_pt) { case NSPROTO_SPP: ! spp_ctlinput(code, (caddr_t)ep); break; default: ! idp_ctlinput(code, (caddr_t)ep); } goto freeit; --- 274,284 ---- #endif switch(ep->ns_err_idp.idp_pt) { case NSPROTO_SPP: ! spp_ctlinput(code, NULL, ep); break; default: ! idp_ctlinput(code, NULL, ep); } goto freeit; *************** *** 295,300 **** --- 306,312 ---- } #endif + int ns_echo(m) struct mbuf *m; { Index: netns/ns_error.h =================================================================== RCS file: /cvs/src/sys/netns/ns_error.h,v retrieving revision 1.10 diff -c -r1.10 ns_error.h *** netns/ns_error.h 29 Dec 1999 04:46:19 -0000 1.10 --- netns/ns_error.h 5 Mar 2003 06:03:54 -0000 *************** *** 91,96 **** --- 91,102 ---- #ifdef _KERNEL struct ns_errstat ns_errstat; + + int ns_err_x __P((int)); + void ns_error __P((struct mbuf *, int, int)); + int ns_echo __P((struct mbuf *)); + void ns_printhost __P((struct ns_addr *)); + void ns_err_input __P((struct mbuf *)); #endif #endif Index: netns/ns_if.h =================================================================== RCS file: /cvs/src/sys/netns/ns_if.h,v retrieving revision 1.16 diff -c -r1.16 ns_if.h *** netns/ns_if.h 4 Mar 2003 23:19:53 -0000 1.16 --- netns/ns_if.h 5 Mar 2003 06:44:13 -0000 *************** *** 80,88 **** #endif #ifdef _KERNEL ! extern struct ns_ifaddr *ns_ifaddr; ! struct ns_ifaddr *ns_iaonnetof(void); ! void nsintr(struct mbuf *); #endif #endif --- 80,91 ---- #endif #ifdef _KERNEL ! extern struct ns_ifaddr *ns_ifaddr; ! ! struct ns_ifaddr *ns_iaonnetof __P((struct ns_addr *)); ! void nsintr __P((struct mbuf *)); ! ! extern struct ifqueue nsintrq; /* XNS input packet queue */ #endif #endif Index: netns/ns_input.c =================================================================== RCS file: /cvs/src/sys/netns/ns_input.c,v retrieving revision 1.19 diff -c -r1.19 ns_input.c *** netns/ns_input.c 4 Mar 2003 23:19:53 -0000 1.19 --- netns/ns_input.c 5 Mar 2003 08:00:43 -0000 *************** *** 58,77 **** #include #include /* * NS initialization. */ - union ns_host ns_thishost; - union ns_host ns_zerohost; - union ns_host ns_broadhost; - union ns_net ns_zeronet; - union ns_net ns_broadnet; struct sockaddr_ns ns_netmask, ns_hostmask; static u_short allones[] = {-1, -1, -1}; static struct ifqueue nsintrq; - struct nspcb nspcb; struct nspcb nsrawpcb; int nsqmaxlen = IFQ_MAXLEN; --- 58,73 ---- #include #include + extern void spp_input(struct mbuf *, struct nspcb *); /* spp_usrreq.c XXX */ + /* * NS initialization. */ struct sockaddr_ns ns_netmask, ns_hostmask; static u_short allones[] = {-1, -1, -1}; static struct ifqueue nsintrq; struct nspcb nsrawpcb; int nsqmaxlen = IFQ_MAXLEN; *************** *** 79,93 **** int idpcksum = 1; long ns_pexseq; ns_init() { - extern struct timeval time; - ns_broadhost = * (union ns_host *) allones; ns_broadnet = * (union ns_net *) allones; nspcb.nsp_next = nspcb.nsp_prev = &nspcb; nsrawpcb.nsp_next = nsrawpcb.nsp_prev = &nsrawpcb; ! ns_pexseq = time.tv_usec; ns_netmask.sns_len = 6; ns_netmask.sns_addr.x_net = ns_broadnet; ns_hostmask.sns_len = 12; --- 75,88 ---- int idpcksum = 1; long ns_pexseq; + void ns_init() { ns_broadhost = * (union ns_host *) allones; ns_broadnet = * (union ns_net *) allones; nspcb.nsp_next = nspcb.nsp_prev = &nspcb; nsrawpcb.nsp_next = nsrawpcb.nsp_prev = &nsrawpcb; ! ns_pexseq = tick; ns_netmask.sns_len = 6; ns_netmask.sns_addr.x_net = ns_broadnet; ns_hostmask.sns_len = 12; *************** *** 109,115 **** register struct idp *idp; register struct nspcb *nsp; register int i; ! int len, s, error; char oddpacketp; /* --- 104,110 ---- register struct idp *idp; register struct nspcb *nsp; register int i; ! int len, error; char oddpacketp; /* *************** *** 128,139 **** */ for (nsp = nsrawpcb.nsp_next; nsp != &nsrawpcb; nsp = nsp->nsp_next) { struct mbuf *m1 = m_copy(m, 0, (int)M_COPYALL); ! if (m1) idp_input(m1, nsp); } idp = mtod(m, struct idp *); len = ntohs(idp->idp_len); ! if (oddpacketp = len & 1) { len++; /* If this packet is of odd length, preserve garbage byte for checksum */ } --- 123,134 ---- */ for (nsp = nsrawpcb.nsp_next; nsp != &nsrawpcb; nsp = nsp->nsp_next) { struct mbuf *m1 = m_copy(m, 0, (int)M_COPYALL); ! if (m1) idp_input(m1, (int)nsp); } idp = mtod(m, struct idp *); len = ntohs(idp->idp_len); ! if ((oddpacketp = (len & 1))) { len++; /* If this packet is of odd length, preserve garbage byte for checksum */ } *************** *** 221,227 **** ns_err_input(m); return; } ! idp_input(m, nsp); } else { ns_error(m, NS_ERR_NOSOCK, 0); } --- 216,222 ---- ns_err_input(m); return; } ! idp_input(m, (int)nsp); } else { ns_error(m, NS_ERR_NOSOCK, 0); } *************** *** 242,256 **** int idp_donosocks = 1; ! idp_ctlinput(cmd, arg) int cmd; ! caddr_t arg; { struct ns_addr *ns; struct nspcb *nsp; ! struct ns_errp *errp; ! int idp_abort(); ! extern struct nspcb *idp_drop(); int type; if (cmd < 0 || cmd > PRC_NCMDS) --- 237,252 ---- int idp_donosocks = 1; ! /* ARGSUSED */ ! void ! idp_ctlinput(cmd, sa, arg) int cmd; ! struct sockaddr *sa; ! void *arg; { struct ns_addr *ns; struct nspcb *nsp; ! struct ns_errp *errp = (struct ns_errp *)arg; /* XXX */ int type; if (cmd < 0 || cmd > PRC_NCMDS) *************** *** 301,306 **** --- 297,303 ---- struct route idp_droute; struct route idp_sroute; + void idp_forward(m) struct mbuf *m; { *************** *** 420,425 **** --- 417,423 ---- m_freem(mcopy); } + int idp_do_route(src, ro) struct ns_addr *src; struct route *ro; *************** *** 442,453 **** --- 440,453 ---- return (1); } + void idp_undo_route(ro) register struct route *ro; { if (ro->ro_rt) {RTFREE(ro->ro_rt);} } + void ns_watch_output(m, ifp) struct mbuf *m; struct ifnet *ifp; *************** *** 469,483 **** idp->idp_sna.x_net = ns_zeronet; idp->idp_sna.x_host = ns_thishost; if (ifp && (ifp->if_flags & IFF_POINTOPOINT)) ! for(ifa = ifp->if_addrlist; ifa; ! ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family==AF_NS) { idp->idp_sna = IA_SNS(ifa)->sns_addr; break; } - } idp->idp_len = ntohl(m0->m_pkthdr.len); ! idp_input(m0, nsp); } } } --- 469,481 ---- idp->idp_sna.x_net = ns_zeronet; idp->idp_sna.x_host = ns_thishost; if (ifp && (ifp->if_flags & IFF_POINTOPOINT)) ! TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) if (ifa->ifa_addr->sa_family==AF_NS) { idp->idp_sna = IA_SNS(ifa)->sns_addr; break; } idp->idp_len = ntohl(m0->m_pkthdr.len); ! idp_input(m0, (int)nsp); } } } Index: netns/ns_output.c =================================================================== RCS file: /cvs/src/sys/netns/ns_output.c,v retrieving revision 1.8 diff -c -r1.8 ns_output.c *** netns/ns_output.c 3 Nov 2001 13:35:07 -0000 1.8 --- netns/ns_output.c 5 Mar 2003 06:45:54 -0000 *************** *** 35,40 **** --- 35,41 ---- */ #include + #include #include #include #include *************** *** 54,59 **** --- 55,61 ---- int ns_output_cnt = 0; struct mbuf *ns_lastout; + int ns_output(m0, ro, flags) struct mbuf *m0; struct route *ro; *************** *** 64,70 **** int error = 0; struct route idproute; struct sockaddr_ns *dst; - extern int idpcksum; if (ns_hold_output) { if (ns_lastout) { --- 66,71 ---- Index: netns/ns_pcb.c =================================================================== RCS file: /cvs/src/sys/netns/ns_pcb.c,v retrieving revision 1.14 diff -c -r1.14 ns_pcb.c *** netns/ns_pcb.c 19 Feb 2003 05:47:37 -0000 1.14 --- netns/ns_pcb.c 5 Mar 2003 08:06:16 -0000 *************** *** 51,56 **** --- 51,57 ---- struct ns_addr zerons_addr; + int ns_pcballoc(so, head) struct socket *so; struct nspcb *head; *************** *** 58,64 **** struct mbuf *m; register struct nspcb *nsp; ! m = m_getclr(M_DONTWAIT, MT_PCB); if (m == NULL) return (ENOBUFS); nsp = mtod(m, struct nspcb *); --- 59,65 ---- struct mbuf *m; register struct nspcb *nsp; ! m = m_getclr(M_DONTWAIT, MT_CONTROL); /* protocol private PCB */ if (m == NULL) return (ENOBUFS); nsp = mtod(m, struct nspcb *); *************** *** 68,73 **** --- 69,75 ---- return (0); } + int ns_pcbbind(nsp, nam) register struct nspcb *nsp; struct mbuf *nam; *************** *** 92,102 **** --- 94,107 ---- } lport = sns->sns_port; if (lport) { + #ifdef NS_PRIV_SOCKETS u_short aport = ntohs(lport); if (aport < NSPORT_RESERVED && (nsp->nsp_socket->so_state & SS_PRIV) == 0) return (EACCES); + #endif /* NS_PRIV_SOCKETS */ + if (ns_pcblookup(&zerons_addr, lport, 0)) return (EADDRINUSE); } *************** *** 118,123 **** --- 123,129 ---- * If don't have a local address for this socket yet, * then pick one. */ + int ns_pcbconnect(nsp, nam) struct nspcb *nsp; struct mbuf *nam; *************** *** 217,222 **** --- 223,229 ---- return (0); } + void ns_pcbdisconnect(nsp) struct nspcb *nsp; { *************** *** 226,231 **** --- 233,239 ---- ns_pcbdetach(nsp); } + void ns_pcbdetach(nsp) struct nspcb *nsp; { *************** *** 239,244 **** --- 247,253 ---- (void) m_free(dtom(nsp)); } + void ns_setsockaddr(nsp, nam) register struct nspcb *nsp; struct mbuf *nam; *************** *** 253,258 **** --- 262,268 ---- sns->sns_addr = nsp->nsp_laddr; } + void ns_setpeeraddr(nsp, nam) register struct nspcb *nsp; struct mbuf *nam; *************** *** 274,283 **** * Also pass an extra paramter via the nspcb. (which may in fact * be a parameter list!) */ ns_pcbnotify(dst, errno, notify, param) register struct ns_addr *dst; long param; ! int errno, (*notify)(); { register struct nspcb *nsp, *oinp; int s = splimp(); --- 284,295 ---- * Also pass an extra paramter via the nspcb. (which may in fact * be a parameter list!) */ + void ns_pcbnotify(dst, errno, notify, param) register struct ns_addr *dst; long param; ! void (*notify)(struct nspcb *); ! int errno; { register struct nspcb *nsp, *oinp; int s = splimp(); *************** *** 361,364 **** --- 373,401 ---- } } return (match); + } + + #include + #include + + /* + * Given an mbuf with a struct idp in it, return the npcb that matches + * + * XXX Dirty; sorry + */ + struct nspcb * + ns_pcblookupm(struct mbuf *m) + { + register struct idp *idp; + register struct nspcb *nsp; + + if ((m->m_flags & M_EXT || m->m_len < sizeof (struct idp)) && + (m = m_pullup(m, sizeof (struct idp))) == 0) { + idpstat.idps_toosmall++; + return( NULL); /* XXX */ + } + idp = mtod(m, struct idp *); + nsp = ns_pcblookup(&idp->idp_sna, idp->idp_dna.x_port, NS_WILDCARD); + + return(nsp); } Index: netns/ns_pcb.h =================================================================== RCS file: /cvs/src/sys/netns/ns_pcb.h,v retrieving revision 1.11 diff -c -r1.11 ns_pcb.h *** netns/ns_pcb.h 29 Dec 1999 04:46:20 -0000 1.11 --- netns/ns_pcb.h 5 Mar 2003 08:02:19 -0000 *************** *** 79,85 **** #ifdef _KERNEL struct nspcb nspcb; /* head of list */ ! struct nspcb *ns_pcblookup(); #endif #endif --- 79,94 ---- #ifdef _KERNEL struct nspcb nspcb; /* head of list */ ! struct nspcb *ns_pcblookupm __P((struct mbuf *m)); ! struct nspcb *ns_pcblookup __P((struct ns_addr *, u_short, int)); ! void ns_pcbdisconnect __P((struct nspcb *)); ! void ns_pcbdetach __P((struct nspcb *)); ! int ns_pcballoc __P((struct socket *, struct nspcb *)); ! int ns_pcbbind __P((struct nspcb *, struct mbuf *)); ! int ns_pcbconnect __P((struct nspcb *, struct mbuf *)); ! void ns_setsockaddr __P((struct nspcb *, struct mbuf *)); ! void ns_setpeeraddr __P((struct nspcb *, struct mbuf *)); ! void ns_pcbnotify __P(( struct ns_addr *, int, void(*)(struct nspcb *), long)); #endif #endif Index: netns/ns_proto.c =================================================================== RCS file: /cvs/src/sys/netns/ns_proto.c,v retrieving revision 1.10 diff -c -r1.10 ns_proto.c *** netns/ns_proto.c 28 Aug 1999 00:49:51 -0000 1.10 --- netns/ns_proto.c 5 Mar 2003 07:49:28 -0000 *************** *** 44,62 **** #include #include /* * NS protocol family: IDP, ERR, PE, SPP, ROUTE. */ - int ns_init(); - int idp_input(), idp_output(), idp_ctlinput(), idp_usrreq(); - int idp_raw_usrreq(), idp_ctloutput(); - int spp_input(), spp_ctlinput(); - int spp_usrreq(), spp_usrreq_sp(), spp_ctloutput(); - int spp_init(), spp_fasttimo(), spp_slowtimo(); - extern int raw_usrreq(); - extern struct domain nsdomain; struct protosw nssw[] = { { 0, &nsdomain, 0, 0, --- 44,70 ---- #include #include + #include + + /* XXX+ */ + void spp_input( struct mbuf *, int); + void spp_ctlinput( int, struct sockaddr *, void *); + int spp_ctloutput( struct socket *, struct sockopt *); + int spp_usrreq( struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *, struct thread *); + int spp_usrreq_sp( struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *, struct thread *); + void spp_init(void); + void spp_fasttimo(void); + void spp_slowtimo(void); + + /* XXX- */ + /* * NS protocol family: IDP, ERR, PE, SPP, ROUTE. */ struct protosw nssw[] = { { 0, &nsdomain, 0, 0, *************** *** 85,91 **** 0, 0, 0, 0, }, { SOCK_RAW, &nsdomain, NSPROTO_ERROR, PR_ATOMIC|PR_ADDR, ! idp_ctlinput, idp_output, 0, idp_ctloutput, idp_raw_usrreq, 0, 0, 0, 0, }, --- 93,99 ---- 0, 0, 0, 0, }, { SOCK_RAW, &nsdomain, NSPROTO_ERROR, PR_ATOMIC|PR_ADDR, ! /* XXX idp_ctlinput*/ 0, idp_output, 0, idp_ctloutput, idp_raw_usrreq, 0, 0, 0, 0, }, Index: netns/spp_debug.c =================================================================== RCS file: /cvs/src/sys/netns/spp_debug.c,v retrieving revision 1.10 diff -c -r1.10 spp_debug.c *** netns/spp_debug.c 28 Aug 1999 00:49:52 -0000 1.10 --- netns/spp_debug.c 5 Mar 2003 06:03:54 -0000 *************** *** 64,69 **** --- 64,70 ---- /* * spp debug routines */ + void spp_trace(act, ostate, sp, si, req) short act; u_char ostate; Index: netns/spp_debug.h =================================================================== RCS file: /cvs/src/sys/netns/spp_debug.h,v retrieving revision 1.9 diff -c -r1.9 spp_debug.h *** netns/spp_debug.h 28 Aug 1999 00:49:53 -0000 1.9 --- netns/spp_debug.h 5 Mar 2003 06:03:55 -0000 *************** *** 63,65 **** --- 63,70 ---- int spp_debx; #endif + + #ifdef _KERNEL + + void spp_trace __P(( short, u_char, struct sppcb *, struct spidp *, int)); + #endif Index: netns/spp_usrreq.c =================================================================== RCS file: /cvs/src/sys/netns/spp_usrreq.c,v retrieving revision 1.19 diff -c -r1.19 spp_usrreq.c *** netns/spp_usrreq.c 19 Feb 2003 05:47:38 -0000 1.19 --- netns/spp_usrreq.c 5 Mar 2003 08:12:56 -0000 *************** *** 58,66 **** --- 58,73 ---- #include #include + extern u_char nsctlerrmap[]; /* from ns_input.c */ + extern int idpcksum; /* from ns_input.c */ + + int spp_backoff[SPP_MAXRXTSHIFT+1] = + { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; + /* * SP protocol implementation. */ + void spp_init() { *************** *** 74,87 **** u_short spp_newchecks[50]; /*ARGSUSED*/ ! spp_input(m, nsp) register struct mbuf *m; ! register struct nspcb *nsp; { register struct sppcb *cb; register struct spidp *si = mtod(m, struct spidp *); register struct socket *so; ! short ostate; int dropsocket = 0; --- 81,96 ---- u_short spp_newchecks[50]; /*ARGSUSED*/ ! void ! spp_input(m, nsp0) register struct mbuf *m; ! int nsp0; /* XXX offset */ { + register struct nspcb *nsp = ns_pcblookupm(m); register struct sppcb *cb; register struct spidp *si = mtod(m, struct spidp *); register struct socket *so; ! short ostate = 0; /* compiler erroneously flags */ int dropsocket = 0; *************** *** 287,292 **** --- 296,302 ---- * but its function is somewhat different: It merely queues * packets up, and suppresses duplicates. */ + int spp_reass(cb, si) register struct sppcb *cb; register struct spidp *si; *************** *** 415,423 **** update_window: if (SSEQ_LT(cb->s_snxt, cb->s_rack)) cb->s_snxt = cb->s_rack; ! if (SSEQ_LT(cb->s_swl1, si->si_seq) || cb->s_swl1 == si->si_seq && (SSEQ_LT(cb->s_swl2, si->si_ack) || ! cb->s_swl2 == si->si_ack && SSEQ_LT(cb->s_ralo, si->si_alo))) { /* keep track of pure window updates */ if ((si->si_cc & SP_SP) && cb->s_swl2 == si->si_ack && SSEQ_LT(cb->s_ralo, si->si_alo)) { --- 425,433 ---- update_window: if (SSEQ_LT(cb->s_snxt, cb->s_rack)) cb->s_snxt = cb->s_rack; ! if (SSEQ_LT(cb->s_swl1, si->si_seq) || (cb->s_swl1 == si->si_seq && (SSEQ_LT(cb->s_swl2, si->si_ack) || ! (cb->s_swl2 == si->si_ack && SSEQ_LT(cb->s_ralo, si->si_alo))))) { /* keep track of pure window updates */ if ((si->si_cc & SP_SP) && cb->s_swl2 == si->si_ack && SSEQ_LT(cb->s_ralo, si->si_alo)) { *************** *** 575,589 **** return (0); } ! spp_ctlinput(cmd, arg) int cmd; ! caddr_t arg; { struct ns_addr *na; ! extern u_char nsctlerrmap[]; ! extern spp_abort(), spp_quench(); ! extern struct nspcb *idp_drop(); ! struct ns_errp *errp; struct nspcb *nsp; struct sockaddr_ns *sns; int type; --- 585,599 ---- return (0); } ! /* ARGSUSED */ ! void ! spp_ctlinput(cmd, sa, arg) int cmd; ! struct sockaddr *sa; ! void *arg; { struct ns_addr *na; ! struct ns_errp *errp = 0; /* compiler erroneously flags */ struct nspcb *nsp; struct sockaddr_ns *sns; int type; *************** *** 639,644 **** --- 649,655 ---- * When a source quench is received, close congestion window * to one packet. We will gradually open it again as we proceed. */ + void spp_quench(nsp) struct nspcb *nsp; { *************** *** 696,701 **** --- 707,713 ---- } #endif + int spp_output(cb, m0) register struct sppcb *cb; struct mbuf *m0; *************** *** 712,718 **** int idle; #endif struct mbuf *mprev; - extern int idpcksum; if (m0) { int mtu = cb->s_mtu; --- 724,729 ---- *************** *** 1111,1121 **** int spp_do_persist_panics = 0; spp_setpersist(cb) register struct sppcb *cb; { ! register t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1; ! extern int spp_backoff[]; if (cb->s_timer[SPPT_REXMT] && spp_do_persist_panics) panic("spp_output REXMT"); --- 1122,1132 ---- int spp_do_persist_panics = 0; + void spp_setpersist(cb) register struct sppcb *cb; { ! register int t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1; if (cb->s_timer[SPPT_REXMT] && spp_do_persist_panics) panic("spp_output REXMT"); *************** *** 1129,1149 **** cb->s_rxtshift++; } /*ARGSUSED*/ ! spp_ctloutput(req, so, level, name, value) ! int req; struct socket *so; ! int name; ! struct mbuf **value; { register struct mbuf *m; struct nspcb *nsp = sotonspcb(so); register struct sppcb *cb; int mask, error = 0; ! if (level != NSPROTO_SPP) { /* This will have to be changed when we do more general stacking of protocols */ ! return (idp_ctloutput(req, so, level, name, value)); } if (nsp == NULL) { error = EINVAL; --- 1140,1160 ---- cb->s_rxtshift++; } /*ARGSUSED*/ ! int ! spp_ctloutput( so, sopt) struct socket *so; ! struct sockopt *sopt; { + struct mbuf **value = sopt->sopt_val; /* XXX dangerous */ register struct mbuf *m; struct nspcb *nsp = sotonspcb(so); register struct sppcb *cb; int mask, error = 0; ! if (sopt->sopt_level != NSPROTO_SPP) { /* This will have to be changed when we do more general stacking of protocols */ ! return (idp_ctloutput(so, sopt)); } if (nsp == NULL) { error = EINVAL; *************** *** 1151,1157 **** } else cb = nstosppcb(nsp); ! switch (req) { case PRCO_GETOPT: if (value == NULL) --- 1162,1168 ---- } else cb = nstosppcb(nsp); ! switch (sopt->sopt_dir) { case PRCO_GETOPT: if (value == NULL) *************** *** 1159,1165 **** m = m_get(M_DONTWAIT, MT_DATA); if (m == NULL) return (ENOBUFS); ! switch (name) { case SO_HEADERS_ON_INPUT: mask = SF_HI; --- 1170,1176 ---- m = m_get(M_DONTWAIT, MT_DATA); if (m == NULL) return (ENOBUFS); ! switch (sopt->sopt_name) { case SO_HEADERS_ON_INPUT: mask = SF_HI; *************** *** 1198,1204 **** error = EINVAL; break; } ! switch (name) { int *ok; case SO_HEADERS_ON_INPUT: --- 1209,1215 ---- error = EINVAL; break; } ! switch (sopt->sopt_name) { int *ok; case SO_HEADERS_ON_INPUT: *************** *** 1254,1266 **** } /*ARGSUSED*/ ! spp_usrreq(so, req, m, nam, controlp) struct socket *so; int req; struct mbuf *m, *nam, *controlp; { struct nspcb *nsp = sotonspcb(so); ! register struct sppcb *cb; int s = splnet(); int error = 0, ostate; struct mbuf *mm; --- 1265,1279 ---- } /*ARGSUSED*/ ! int ! spp_usrreq(so, req, m, nam, controlp, td) struct socket *so; int req; struct mbuf *m, *nam, *controlp; + struct thread *td; { struct nspcb *nsp = sotonspcb(so); ! register struct sppcb *cb = NULL; int s = splnet(); int error = 0, ostate; struct mbuf *mm; *************** *** 1296,1302 **** } nsp = sotonspcb(so); ! mm = m_getclr(M_DONTWAIT, MT_PCB); sb = &so->so_snd; if (mm == NULL) { --- 1309,1316 ---- } nsp = sotonspcb(so); ! /* private PCB */ ! mm = m_getclr(M_DONTWAIT, MT_CONTROL); sb = &so->so_snd; if (mm == NULL) { *************** *** 1506,1517 **** return (error); } ! spp_usrreq_sp(so, req, m, nam, controlp) struct socket *so; int req; struct mbuf *m, *nam, *controlp; { ! int error = spp_usrreq(so, req, m, nam, controlp); if (req == PRU_ATTACH && error == 0) { struct nspcb *nsp = sotonspcb(so); --- 1520,1533 ---- return (error); } ! int ! spp_usrreq_sp(so, req, m, nam, controlp, td) struct socket *so; int req; struct mbuf *m, *nam, *controlp; + struct thread *td; { ! int error = spp_usrreq(so, req, m, nam, controlp, td); if (req == PRU_ATTACH && error == 0) { struct nspcb *nsp = sotonspcb(so); *************** *** 1527,1532 **** --- 1543,1549 ---- * in a skeletal spp header (choosing connection id), * minimizing the amount of work necessary when the connection is used. */ + void spp_template(cb) register struct sppcb *cb; { *************** *** 1621,1626 **** --- 1638,1644 ---- return (spp_close(cb)); } + void spp_abort(nsp) struct nspcb *nsp; { *************** *** 1628,1638 **** (void) spp_close((struct sppcb *)nsp->nsp_pcb); } - int spp_backoff[SPP_MAXRXTSHIFT+1] = - { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; /* * Fast timeout routine for processing delayed acks */ spp_fasttimo() { register struct nspcb *nsp; --- 1646,1655 ---- (void) spp_close((struct sppcb *)nsp->nsp_pcb); } /* * Fast timeout routine for processing delayed acks */ + void spp_fasttimo() { register struct nspcb *nsp; *************** *** 1657,1662 **** --- 1674,1680 ---- * Updates the timers in all active pcb's and * causes finite state machine actions if timers expire. */ + void spp_slowtimo() { register struct nspcb *ip, *ipnxt; *************** *** 1682,1688 **** (void) spp_usrreq(cb->s_nspcb->nsp_socket, PRU_SLOWTIMO, (struct mbuf *)0, (struct mbuf *)i, (struct mbuf *)0, ! (struct mbuf *)0); if (ipnxt->nsp_prev != ip) goto tpgone; } --- 1700,1706 ---- (void) spp_usrreq(cb->s_nspcb->nsp_socket, PRU_SLOWTIMO, (struct mbuf *)0, (struct mbuf *)i, (struct mbuf *)0, ! (struct thread *)0); if (ipnxt->nsp_prev != ip) goto tpgone; } Index: netns/spp_var.h =================================================================== RCS file: /cvs/src/sys/netns/spp_var.h,v retrieving revision 1.11 diff -c -r1.11 spp_var.h *** netns/spp_var.h 29 Dec 1999 04:46:21 -0000 1.11 --- netns/spp_var.h 5 Mar 2003 08:10:06 -0000 *************** *** 194,202 **** #define sppstat spp_istat.newstats #endif u_short spp_iss; ! extern struct sppcb *spp_close(), *spp_disconnect(), ! *spp_usrclosed(), *spp_timers(), *spp_drop(); #endif #define SPP_ISSINCR 128 --- 194,226 ---- #define sppstat spp_istat.newstats #endif + struct thread; /* not used */ + u_short spp_iss; ! ! void spp_init __P((void)); ! void spp_input __P((struct mbuf *, int)); ! void spp_ctlinput __P((int, struct sockaddr *, void *)); ! int spp_ctloutput __P((struct socket *, struct sockopt *)); ! int spp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, ! struct mbuf *, struct thread *)); ! int spp_usrreq_sp __P((struct socket *, int, struct mbuf *, struct mbuf *, ! struct mbuf *, struct thread *)); ! void spp_fasttimo __P((void)); ! void spp_slowtimo __P((void)); ! void spp_template __P((struct sppcb *)); ! int spp_reass __P((struct sppcb *, struct spidp *)); ! int spp_output __P((struct sppcb *, struct mbuf *)); ! void spp_quench __P((struct nspcb *)); ! void spp_abort __P((struct nspcb *)); ! void spp_setpersist __P((struct sppcb *)); ! ! struct sppcb *spp_close __P((struct sppcb *)); ! struct sppcb *spp_disconnect __P((struct sppcb *)); ! struct sppcb *spp_usrclosed __P((struct sppcb *)); ! struct sppcb *spp_timers __P((struct sppcb *, int)); ! struct sppcb *spp_drop __P((struct sppcb *, int)); ! #endif #define SPP_ISSINCR 128 --------------683C78166CD831774FABBA7C-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message