From 7b51e07b5a13b26225076cff75ed92cfd9bb984e Mon Sep 17 00:00:00 2001 From: David Rhodus Date: Sat, 6 Sep 2003 21:51:12 +0000 Subject: [PATCH] Inital cleanup work to make NETNS compile again before someone tries to remove it. 8-) Also fix a few small bugs and try to make the code do the right thing. --- sys/conf/files | 3 +- sys/netproto/ns/idp_usrreq.c | 29 ++++++++++--- sys/netproto/ns/idp_var.h | 14 +++++- sys/netproto/ns/ns.c | 83 ++++++++++++++++++------------------ sys/netproto/ns/ns.h | 21 ++++++++- sys/netproto/ns/ns_error.c | 14 +++++- sys/netproto/ns/ns_error.h | 9 +++- sys/netproto/ns/ns_if.h | 6 ++- sys/netproto/ns/ns_input.c | 25 +++++------ sys/netproto/ns/ns_output.c | 4 +- sys/netproto/ns/ns_pcb.c | 18 ++++++-- sys/netproto/ns/ns_pcb.h | 13 +++++- sys/netproto/ns/ns_proto.c | 25 ++++++----- sys/netproto/ns/spp_debug.c | 3 +- sys/netproto/ns/spp_debug.h | 7 ++- sys/netproto/ns/spp_usrreq.c | 49 +++++++++++++-------- sys/netproto/ns/spp_var.h | 27 ++++++++++-- 17 files changed, 241 insertions(+), 109 deletions(-) diff --git a/sys/conf/files b/sys/conf/files index 391e6454f0..57210c6da6 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.11 2003/08/27 01:43:05 dillon Exp $ +# $DragonFly: src/sys/conf/files,v 1.12 2003/09/06 21:51:11 drhodus Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1016,6 +1016,7 @@ netproto/ns/ns_ip.c optional ns netproto/ns/ns_output.c optional ns netproto/ns/ns_pcb.c optional ns netproto/ns/ns_proto.c optional ns +netproto/ns/ns_cksum.c optional ns netproto/ns/spp_debug.c optional ns netproto/ns/spp_usrreq.c optional ns vfs/nfs/nfs_bio.c optional nfs diff --git a/sys/netproto/ns/idp_usrreq.c b/sys/netproto/ns/idp_usrreq.c index 5691a18dc8..9f3507fd1d 100644 --- a/sys/netproto/ns/idp_usrreq.c +++ b/sys/netproto/ns/idp_usrreq.c @@ -32,7 +32,7 @@ * * @(#)idp_usrreq.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/idp_usrreq.c,v 1.9 1999/08/28 00:49:47 peter Exp $ - * $DragonFly: src/sys/netproto/ns/idp_usrreq.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/idp_usrreq.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -55,6 +55,10 @@ #include "idp_var.h" #include "ns_error.h" +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. */ @@ -64,6 +68,7 @@ struct sockaddr_ns idp_ns = { sizeof(idp_ns), AF_NS }; /* * This may also be called for raw listeners. */ +void idp_input(m, nsp) struct mbuf *m; struct nspcb *nsp; @@ -80,14 +85,16 @@ idp_input(m, nsp) idp_ns.sns_addr = idp->idp_sna; if (ns_neteqnn(idp->idp_sna.x_net, ns_zeronet) && ifp) { struct ifaddr *ifa; + int s; - for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) { + 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) ) { @@ -104,6 +111,7 @@ bad: m_freem(m); } +void idp_abort(nsp) struct nspcb *nsp; { @@ -138,6 +146,8 @@ idp_drop(nsp, errno) } int noIdpRoute; + +int idp_output(nsp, m0) struct nspcb *nsp; struct mbuf *m0; @@ -147,7 +157,7 @@ idp_output(nsp, m0) struct socket *so; int len = 0; struct route *ro; - struct mbuf *mprev; + struct mbuf *mprev = NULL; extern int idpcksum; /* @@ -260,7 +270,9 @@ idp_output(nsp, m0) if (noIdpRoute) ro = 0; return (ns_output(m, ro, so->so_options & SO_BROADCAST)); } + /* ARGSUSED */ +int idp_ctloutput(req, so, level, name, value) int req, level; struct socket *so; @@ -270,7 +282,6 @@ idp_ctloutput(req, so, level, name, value) struct mbuf *m; struct nspcb *nsp = sotonspcb(so); int mask, error = 0; - extern long ns_pexseq; if (nsp == NULL) return (EINVAL); @@ -372,6 +383,7 @@ idp_ctloutput(req, so, level, name, value) } /*ARGSUSED*/ +int idp_usrreq(so, req, m, nam, control) struct socket *so; int req; @@ -456,7 +468,7 @@ idp_usrreq(so, req, m, nam, control) case PRU_SEND: { struct ns_addr laddr; - int s; + int s = -1; /* XXX compiler warns improperly */ if (nam) { laddr = nsp->nsp_laddr; @@ -534,6 +546,7 @@ release: return (error); } /*ARGSUSED*/ +int idp_raw_usrreq(so, req, m, nam, control) struct socket *so; int req; @@ -541,16 +554,18 @@ idp_raw_usrreq(so, req, m, nam, control) { int error = 0; struct nspcb *nsp = sotonspcb(so); - extern struct nspcb nsrawpcb; switch (req) { case PRU_ATTACH: +#ifdef NS_PRIV_SOCKETS if (!(so->so_state & SS_PRIV) || (nsp != NULL)) { error = EINVAL; break; } +#endif + error = ns_pcballoc(so, &nsrawpcb); if (error) break; diff --git a/sys/netproto/ns/idp_var.h b/sys/netproto/ns/idp_var.h index 69b9eba3e4..cfa87a6a2f 100644 --- a/sys/netproto/ns/idp_var.h +++ b/sys/netproto/ns/idp_var.h @@ -32,7 +32,7 @@ * * @(#)idp_var.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/idp_var.h,v 1.10 1999/12/29 04:46:18 peter Exp $ - * $DragonFly: src/sys/netproto/ns/idp_var.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/idp_var.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_IDP_VAR_H_ @@ -51,6 +51,18 @@ struct idpstat { #ifdef _KERNEL struct idpstat idpstat; +struct nspcb; /* declare in scope for ptr parameter */ + +void idp_abort (struct nspcb *); +void idp_input (struct mbuf *, struct nspcb *); +struct nspcb *idp_drop (struct nspcb *, int); +int idp_output (struct nspcb *, struct mbuf *); +int idp_ctloutput (int, struct socket *, int, int, struct mbuf **); +int idp_usrreq (struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *); +int idp_raw_usrreq ( struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *); + #endif #endif diff --git a/sys/netproto/ns/ns.c b/sys/netproto/ns/ns.c index d74d4daac8..e91f68f208 100644 --- a/sys/netproto/ns/ns.c +++ b/sys/netproto/ns/ns.c @@ -32,11 +32,12 @@ * * @(#)ns.c 8.2 (Berkeley) 11/15/93 * $FreeBSD: src/sys/netns/ns.c,v 1.9 1999/08/28 00:49:47 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include #include +#include #include #include #include @@ -50,6 +51,8 @@ #include "ns.h" #include "ns_if.h" +#include "opt_ns.h" + #ifdef NS struct ns_ifaddr *ns_ifaddr; @@ -60,6 +63,7 @@ extern struct sockaddr_ns ns_netmask, ns_hostmask; * Generic internet control operations (ioctl's). */ /* ARGSUSED */ +int ns_control(so, cmd, data, ifp) struct socket *so; int cmd; @@ -69,9 +73,10 @@ ns_control(so, cmd, data, ifp) struct ifreq *ifr = (struct ifreq *)data; struct ns_aliasreq *ifra = (struct ns_aliasreq *)data; struct ns_ifaddr *ia; - struct ifaddr *ifa; + struct ifaddr *ifa = NULL; /* XXX used ininitialized ?*/ struct ns_ifaddr *oia; - int error, dstIsNew, hostIsNew; + int dstIsNew, hostIsNew; + int error = 0; /* initalize because of scoping */ /* * Find address for this interface, if it exists. @@ -108,8 +113,10 @@ ns_control(so, cmd, data, ifp) return (0); } +#ifdef NS_PRIV_SOCKETS if ((so->so_state & SS_PRIV) == 0) return (EPERM); +#endif switch (cmd) { case SIOCAIFADDR: @@ -133,19 +140,15 @@ ns_control(so, cmd, data, ifp) if (oia == (struct ns_ifaddr *)NULL) return (ENOBUFS); bzero((caddr_t)oia, sizeof(*oia)); - if (ia = ns_ifaddr) { + if ((ia = ns_ifaddr) != NULL) { 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; + + TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link); ia->ia_ifp = ifp; ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; @@ -164,8 +167,6 @@ ns_control(so, cmd, data, ifp) } switch (cmd) { - int error; - case SIOCSIFDSTADDR: if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); @@ -174,7 +175,8 @@ ns_control(so, cmd, data, ifp) ia->ia_flags &= ~IFA_ROUTE; } if (ifp->if_ioctl) { - error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia); + error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, + (caddr_t)ia); if (error) return (error); } @@ -182,34 +184,25 @@ ns_control(so, cmd, data, ifp) return (0); case SIOCSIFADDR: - return (ns_ifinit(ifp, ia, + return (ns_ifinit(ifp, (struct ns_ifaddr *)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"); - } + ns_ifscrub(ifp, (struct ns_ifaddr *)ia); + /* XXX not on list */ oia = ia; - if (oia == (ia = ns_ifaddr)) { - ns_ifaddr = ia->ia_next; - } else { - while (ia->ia_next && (ia->ia_next != oia)) { - ia = ia->ia_next; - } - if (ia->ia_next) - ia->ia_next = oia->ia_next; - else - printf("Didn't unlink nsifadr from list\n"); - } + TAILQ_REMOVE(&ifp->if_addrhead, (struct ifaddr *)ia, ifa_link); + if (oia == (ia = ns_ifaddr)) { + ns_ifaddr = ia->ia_next; + } else { + while (ia->ia_next && (ia->ia_next != oia)) { + ia = ia->ia_next; + } + if (ia->ia_next) + ia->ia_next = oia->ia_next; + else + printf("Didn't unlink nsifadr from list\n"); + } IFAFREE((&oia->ia_ifa)); if (0 == --ns_interfaces) { /* @@ -232,13 +225,14 @@ ns_control(so, cmd, data, ifp) if ((ifp->if_flags & IFF_POINTOPOINT) && (ifra->ifra_dstaddr.sns_family == AF_NS)) { if (hostIsNew == 0) - ns_ifscrub(ifp, ia); + 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, ia, &ifra->ifra_addr, 0); + error = ns_ifinit(ifp, (struct ns_ifra_addr *)ia, + &ifra->ifra_addr, 0); return (error); default: @@ -251,6 +245,7 @@ ns_control(so, cmd, data, ifp) /* * Delete any previous route for an old address. */ +void ns_ifscrub(ifp, ia) struct ifnet *ifp; struct ns_ifaddr *ia; @@ -267,10 +262,12 @@ ns_ifscrub(ifp, ia) * Initialize an interface's internet address * and routing table entry. */ +int ns_ifinit(ifp, ia, sns, scrub) struct ifnet *ifp; struct ns_ifaddr *ia; struct sockaddr_ns *sns; + int scrub; { struct sockaddr_ns oldaddr; union ns_host *h = &ia->ia_addr.sns_addr.x_host; @@ -295,7 +292,8 @@ ns_ifinit(ifp, ia, sns, scrub) */ if (ns_hosteqnh(ns_thishost, ns_zerohost)) { if (ifp->if_ioctl && - (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) { + (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, + (caddr_t)ia))) { ia->ia_addr = oldaddr; splx(s); return (error); @@ -305,7 +303,8 @@ ns_ifinit(ifp, ia, sns, scrub) || ns_hosteqnh(sns->sns_addr.x_host, ns_thishost)) { *h = ns_thishost; if (ifp->if_ioctl && - (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) { + (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, + (caddr_t)ia))) { ia->ia_addr = oldaddr; splx(s); return (error); @@ -353,7 +352,7 @@ ns_iaonnetof(dst) union ns_net net = dst->x_net; for (ia = ns_ifaddr; ia; ia = ia->ia_next) { - if (ifp = ia->ia_ifp) { + if ((ifp = ia->ia_ifp) != NULL) { if (ifp->if_flags & IFF_POINTOPOINT) { compare = &satons_addr(ia->ia_dstaddr); if (ns_hosteq(*dst, *compare)) diff --git a/sys/netproto/ns/ns.h b/sys/netproto/ns/ns.h index 84ce294026..7acd81bf7e 100644 --- a/sys/netproto/ns/ns.h +++ b/sys/netproto/ns/ns.h @@ -32,7 +32,7 @@ * * @(#)ns.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns.h,v 1.13.2.1 2002/12/01 14:03:09 sobomax Exp $ - * $DragonFly: src/sys/netproto/ns/ns.h,v 1.3 2003/08/23 10:06:24 rob Exp $ + * $DragonFly: src/sys/netproto/ns/ns.h,v 1.4 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_NS_H_ @@ -143,7 +143,24 @@ extern union ns_host ns_zerohost; extern union ns_host ns_broadhost; extern union ns_net ns_zeronet; extern union ns_net ns_broadnet; -u_short ns_cksum(void); + +struct route; +struct ns_ifaddr; + +u_short ns_cksum (struct mbuf *, int); +int ns_output (struct mbuf *, struct route *, int); +int ns_control (struct socket *, int, caddr_t, struct ifnet *); +void ns_init (void); +void idp_forward (struct mbuf *); +void idp_ctlinput (int, caddr_t); +int idp_do_route (struct ns_addr *, struct route *); +void idp_undo_route (struct route *); +void ns_watch_output (struct mbuf *, struct ifnet *); +int ns_ifinit (struct ifnet *, struct ns_ifaddr *, struct sockaddr_ns *, + int); +void ns_ifscrub (struct ifnet *, struct ns_ifaddr *); + + #else #include diff --git a/sys/netproto/ns/ns_error.c b/sys/netproto/ns/ns_error.c index 4bc06eeb4c..83ff030881 100644 --- a/sys/netproto/ns/ns_error.c +++ b/sys/netproto/ns/ns_error.c @@ -32,7 +32,7 @@ * * @(#)ns_error.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_error.c,v 1.9 1999/08/28 00:49:49 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_error.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_error.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -51,6 +51,9 @@ #include "idp.h" #include "ns_error.h" +extern int idpchsum; /* from ns_input.c */ +extern void spp_ctlinput( int, caddr_t); /* from spp_usrreq.c XXX */ + #ifdef lint #define NS_ERRPRINTFS 1 #endif @@ -63,7 +66,9 @@ int ns_errprintfs = 0; #endif +int ns_err_x(c) +int c; { u_short *w, *lim, *base = ns_errstat.ns_es_codes; u_short x = c; @@ -88,9 +93,11 @@ ns_err_x(c) * in response to bad packet. */ +void ns_error(om, type, param) struct mbuf *om; int type; + int param; { struct ns_epidp *ep; struct mbuf *m; @@ -166,6 +173,7 @@ freeit: m_freem(om); } +void ns_printhost(p) struct ns_addr *p; { @@ -183,11 +191,14 @@ struct ns_addr *p; /* * Process a received NS_ERR message. */ +void ns_err_input(m) struct mbuf *m; { struct ns_errp *ep; +#ifdef NS_ERRPRINTFS struct ns_epidp *epidp = mtod(m, struct ns_epidp *); +#endif int i; int type, code, param; @@ -296,6 +307,7 @@ nstime() } #endif +int ns_echo(m) struct mbuf *m; { diff --git a/sys/netproto/ns/ns_error.h b/sys/netproto/ns/ns_error.h index e99212d4cd..35f7809094 100644 --- a/sys/netproto/ns/ns_error.h +++ b/sys/netproto/ns/ns_error.h @@ -32,7 +32,7 @@ * * @(#)ns_error.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_error.h,v 1.10 1999/12/29 04:46:19 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_error.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_error.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_NS_ERROR_H_ @@ -92,6 +92,13 @@ struct ns_errstat { #ifdef _KERNEL struct ns_errstat ns_errstat; + +int ns_err_x (int); +void ns_error (struct mbuf *, int, int); +int ns_echo (struct mbuf *); +void ns_printhost (struct ns_addr *); +void ns_err_input (struct mbuf *); + #endif #endif diff --git a/sys/netproto/ns/ns_if.h b/sys/netproto/ns/ns_if.h index c4bc2bb28a..2cb2b92072 100644 --- a/sys/netproto/ns/ns_if.h +++ b/sys/netproto/ns/ns_if.h @@ -32,7 +32,7 @@ * * @(#)ns_if.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_if.h,v 1.12.2.1 2002/12/01 14:03:09 sobomax Exp $ - * $DragonFly: src/sys/netproto/ns/ns_if.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_if.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_NS_IF_H_ @@ -82,8 +82,10 @@ struct nsip_req { #ifdef _KERNEL extern struct ns_ifaddr *ns_ifaddr; -struct ns_ifaddr *ns_iaonnetof(void); + +struct ns_ifaddr *ns_iaonnetof (struct ns_addr *); void nsintr(void); + extern struct ifqueue nsintrq; /* XNS input packet queue */ #endif diff --git a/sys/netproto/ns/ns_input.c b/sys/netproto/ns/ns_input.c index 8fc767f7e5..05c925b3e5 100644 --- a/sys/netproto/ns/ns_input.c +++ b/sys/netproto/ns/ns_input.c @@ -32,7 +32,7 @@ * * @(#)ns_input.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_input.c,v 1.13 2000/02/13 03:32:04 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_input.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -60,6 +60,8 @@ #include "idp_var.h" #include "ns_error.h" +extern void spp_input(struct mbuf *, struct nspcb *); /* spp_usrreq.c XXX */ + /* * NS initialization. */ @@ -72,7 +74,6 @@ struct sockaddr_ns ns_netmask, ns_hostmask; static u_short allones[] = {-1, -1, -1}; -struct nspcb nspcb; struct nspcb nsrawpcb; int nsqmaxlen = IFQ_MAXLEN; @@ -82,16 +83,15 @@ long ns_pexseq; const int nsintrq_present = 1; +void 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; nsintrq.ifq_maxlen = nsqmaxlen; - ns_pexseq = time.tv_usec; + ns_pexseq = tick; ns_netmask.sns_len = 6; ns_netmask.sns_addr.x_net = ns_broadnet; ns_hostmask.sns_len = 12; @@ -142,7 +142,7 @@ next: idp = mtod(m, struct idp *); len = ntohs(idp->idp_len); - if (oddpacketp = len & 1) { + if ((oddpacketp = (len & 1))) { len++; /* If this packet is of odd length, preserve garbage byte for checksum */ } @@ -251,15 +251,14 @@ u_char nsctlerrmap[PRC_NCMDS] = { int idp_donosocks = 1; +void 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(); + struct ns_errp *errp = (struct ns_errp *)arg; /* XXX */ int type; if (cmd < 0 || cmd > PRC_NCMDS) @@ -310,6 +309,7 @@ int idpforwarding = 1; struct route idp_droute; struct route idp_sroute; +void idp_forward(m) struct mbuf *m; { @@ -429,6 +429,7 @@ cleanup: m_freem(mcopy); } +int idp_do_route(src, ro) struct ns_addr *src; struct route *ro; @@ -451,12 +452,14 @@ struct route *ro; return (1); } +void idp_undo_route(ro) struct route *ro; { if (ro->ro_rt) {RTFREE(ro->ro_rt);} } +void ns_watch_output(m, ifp) struct mbuf *m; struct ifnet *ifp; @@ -478,13 +481,11 @@ struct ifnet *ifp; 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) { + 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, nsp); } diff --git a/sys/netproto/ns/ns_output.c b/sys/netproto/ns/ns_output.c index f333dcc094..9b43fed4c2 100644 --- a/sys/netproto/ns/ns_output.c +++ b/sys/netproto/ns/ns_output.c @@ -32,7 +32,7 @@ * * @(#)ns_output.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_output.c,v 1.7 1999/08/28 00:49:51 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_output.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_output.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -58,6 +58,7 @@ int ns_copy_output = 0; int ns_output_cnt = 0; struct mbuf *ns_lastout; +int ns_output(m0, ro, flags) struct mbuf *m0; struct route *ro; @@ -68,7 +69,6 @@ ns_output(m0, ro, flags) int error = 0; struct route idproute; struct sockaddr_ns *dst; - extern int idpcksum; if (ns_hold_output) { if (ns_lastout) { diff --git a/sys/netproto/ns/ns_pcb.c b/sys/netproto/ns/ns_pcb.c index 6fdc8798d4..966e97575e 100644 --- a/sys/netproto/ns/ns_pcb.c +++ b/sys/netproto/ns/ns_pcb.c @@ -32,7 +32,7 @@ * * @(#)ns_pcb.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_pcb.c,v 1.9 1999/08/28 00:49:51 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_pcb.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_pcb.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -52,6 +52,7 @@ struct ns_addr zerons_addr; +int ns_pcballoc(so, head) struct socket *so; struct nspcb *head; @@ -59,7 +60,7 @@ ns_pcballoc(so, head) struct mbuf *m; struct nspcb *nsp; - m = m_getclr(M_DONTWAIT, MT_PCB); + m = m_getclr(M_DONTWAIT, MT_CONTROL); /*protocol private PCB */ if (m == NULL) return (ENOBUFS); nsp = mtod(m, struct nspcb *); @@ -69,6 +70,7 @@ ns_pcballoc(so, head) return (0); } +int ns_pcbbind(nsp, nam) struct nspcb *nsp; struct mbuf *nam; @@ -95,9 +97,12 @@ ns_pcbbind(nsp, nam) if (lport) { u_short aport = ntohs(lport); +#ifdef NS_PRIV_SOCKETS 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); } @@ -119,6 +124,7 @@ noname: * 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; @@ -218,6 +224,7 @@ ns_pcbconnect(nsp, nam) return (0); } +void ns_pcbdisconnect(nsp) struct nspcb *nsp; { @@ -227,6 +234,7 @@ ns_pcbdisconnect(nsp) ns_pcbdetach(nsp); } +void ns_pcbdetach(nsp) struct nspcb *nsp; { @@ -240,6 +248,7 @@ ns_pcbdetach(nsp) (void) m_free(dtom(nsp)); } +void ns_setsockaddr(nsp, nam) struct nspcb *nsp; struct mbuf *nam; @@ -254,6 +263,7 @@ ns_setsockaddr(nsp, nam) sns->sns_addr = nsp->nsp_laddr; } +void ns_setpeeraddr(nsp, nam) struct nspcb *nsp; struct mbuf *nam; @@ -275,10 +285,12 @@ ns_setpeeraddr(nsp, nam) * Also pass an extra paramter via the nspcb. (which may in fact * be a parameter list!) */ +void ns_pcbnotify(dst, errno, notify, param) struct ns_addr *dst; long param; - int errno, (*notify)(); + void (*notify)(struct nspcb *); + int errno; { struct nspcb *nsp, *oinp; int s = splimp(); diff --git a/sys/netproto/ns/ns_pcb.h b/sys/netproto/ns/ns_pcb.h index 427da399fe..c711594e04 100644 --- a/sys/netproto/ns/ns_pcb.h +++ b/sys/netproto/ns/ns_pcb.h @@ -32,7 +32,7 @@ * * @(#)ns_pcb.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_pcb.h,v 1.11 1999/12/29 04:46:20 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_pcb.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_pcb.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_NS_PCB_H_ @@ -80,7 +80,16 @@ struct nspcb { #ifdef _KERNEL struct nspcb nspcb; /* head of list */ -struct nspcb *ns_pcblookup(); +struct nspcb *ns_pcblookup (struct ns_addr *, u_short, int); +void ns_pcbdisconnect (struct nspcb *); +void ns_pcbdetach (struct nspcb *); +int ns_pcballoc (struct socket *, struct nspcb *); +int ns_pcbbind (struct nspcb *, struct mbuf *); +int ns_pcbconnect (struct nspcb *, struct mbuf *); +void ns_setsockaddr (struct nspcb *, struct mbuf *); +void ns_setpeeraddr (struct nspcb *, struct mbuf *); +void ns_pcbnotify (struct ns_addr *, int, void(*)(struct nspcb *), long); + #endif #endif diff --git a/sys/netproto/ns/ns_proto.c b/sys/netproto/ns/ns_proto.c index e214d6e694..a1b9b46495 100644 --- a/sys/netproto/ns/ns_proto.c +++ b/sys/netproto/ns/ns_proto.c @@ -32,7 +32,7 @@ * * From: @(#)ns_proto.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/ns_proto.c,v 1.10 1999/08/28 00:49:51 peter Exp $ - * $DragonFly: src/sys/netproto/ns/ns_proto.c,v 1.3 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/ns_proto.c,v 1.4 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -45,19 +45,24 @@ #include #include "ns.h" +#include "idp_var.h" + +/* XXX+ */ +void spp_input( struct mbuf *, struct nspcb *); +void spp_ctlinput( int, caddr_t); +int spp_ctloutput( int, struct socket *, int, int, struct mbuf **); +int spp_usrreq( struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *); +int spp_usrreq_sp( struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *); +void spp_init(void); +void spp_fasttimo(void); +void spp_slowtimo(void); + +/* XXX- */ + /* * 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, diff --git a/sys/netproto/ns/spp_debug.c b/sys/netproto/ns/spp_debug.c index 508873cb64..7e6b1259bc 100644 --- a/sys/netproto/ns/spp_debug.c +++ b/sys/netproto/ns/spp_debug.c @@ -32,7 +32,7 @@ * * @(#)spp_debug.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/spp_debug.c,v 1.10 1999/08/28 00:49:52 peter Exp $ - * $DragonFly: src/sys/netproto/ns/spp_debug.c,v 1.3 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/spp_debug.c,v 1.4 2003/09/06 21:51:12 drhodus Exp $ */ #include "opt_inet.h" @@ -65,6 +65,7 @@ int sppconsdebug = 0; /* * spp debug routines */ +void spp_trace(act, ostate, sp, si, req) short act; u_char ostate; diff --git a/sys/netproto/ns/spp_debug.h b/sys/netproto/ns/spp_debug.h index fbf5a82d25..0d4fce8994 100644 --- a/sys/netproto/ns/spp_debug.h +++ b/sys/netproto/ns/spp_debug.h @@ -32,7 +32,7 @@ * * @(#)spp_debug.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/spp_debug.h,v 1.9 1999/08/28 00:49:53 peter Exp $ - * $DragonFly: src/sys/netproto/ns/spp_debug.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/spp_debug.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_SPP_DEBUG_H_ @@ -64,3 +64,8 @@ struct spp_debug spp_debug[SPP_NDEBUG]; int spp_debx; #endif + +#ifdef _KERNEL + +void spp_trace (short, u_char, struct sppcb *, struct spidp *, int); +#endif diff --git a/sys/netproto/ns/spp_usrreq.c b/sys/netproto/ns/spp_usrreq.c index 51d364461e..2be1650ff6 100644 --- a/sys/netproto/ns/spp_usrreq.c +++ b/sys/netproto/ns/spp_usrreq.c @@ -32,7 +32,7 @@ * * @(#)spp_usrreq.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/spp_usrreq.c,v 1.11 1999/08/28 00:49:53 peter Exp $ - * $DragonFly: src/sys/netproto/ns/spp_usrreq.c,v 1.4 2003/08/07 21:17:38 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/spp_usrreq.c,v 1.5 2003/09/06 21:51:12 drhodus Exp $ */ #include @@ -59,9 +59,16 @@ #include "spp_var.h" #include "spp_debug.h" +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() { @@ -75,6 +82,7 @@ int spp_use_delack = 0; u_short spp_newchecks[50]; /*ARGSUSED*/ +void spp_input(m, nsp) struct mbuf *m; struct nspcb *nsp; @@ -82,7 +90,7 @@ spp_input(m, nsp) struct sppcb *cb; struct spidp *si = mtod(m, struct spidp *); struct socket *so; - short ostate; + short ostate = 0; int dropsocket = 0; @@ -288,6 +296,7 @@ int spprexmtthresh = 3; * but its function is somewhat different: It merely queues * packets up, and suppresses duplicates. */ +int spp_reass(cb, si) struct sppcb *cb; struct spidp *si; @@ -416,9 +425,9 @@ struct spidp *si; 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 && + 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))) { + (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)) { @@ -576,15 +585,13 @@ present: return (0); } +void 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 ns_errp *errp = 0; struct nspcb *nsp; struct sockaddr_ns *sns; int type; @@ -640,6 +647,7 @@ spp_ctlinput(cmd, arg) * 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; { @@ -698,6 +706,7 @@ struct nspcb *nsp; } #endif +int spp_output(cb, m0) struct sppcb *cb; struct mbuf *m0; @@ -714,7 +723,6 @@ spp_output(cb, m0) int idle; #endif struct mbuf *mprev; - extern int idpcksum; if (m0) { int mtu = cb->s_mtu; @@ -1113,11 +1121,11 @@ send: int spp_do_persist_panics = 0; +void spp_setpersist(cb) struct sppcb *cb; { - t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1; - extern int spp_backoff[]; + int t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1; if (cb->s_timer[SPPT_REXMT] && spp_do_persist_panics) panic("spp_output REXMT"); @@ -1131,6 +1139,7 @@ spp_setpersist(cb) cb->s_rxtshift++; } /*ARGSUSED*/ +int spp_ctloutput(req, so, level, name, value) int req; struct socket *so; @@ -1256,13 +1265,14 @@ spp_ctloutput(req, so, level, name, value) } /*ARGSUSED*/ +int spp_usrreq(so, req, m, nam, controlp) struct socket *so; int req; struct mbuf *m, *nam, *controlp; { struct nspcb *nsp = sotonspcb(so); - struct sppcb *cb; + struct sppcb *cb = NULL; int s = splnet(); int error = 0, ostate; struct mbuf *mm; @@ -1298,7 +1308,8 @@ spp_usrreq(so, req, m, nam, controlp) } nsp = sotonspcb(so); - mm = m_getclr(M_DONTWAIT, MT_PCB); + /* private PCB */ + mm = m_getclr(M_DONTWAIT, MT_CONTROL); sb = &so->so_snd; if (mm == NULL) { @@ -1508,6 +1519,7 @@ release: return (error); } +int spp_usrreq_sp(so, req, m, nam, controlp) struct socket *so; int req; @@ -1529,6 +1541,7 @@ spp_usrreq_sp(so, req, m, nam, controlp) * in a skeletal spp header (choosing connection id), * minimizing the amount of work necessary when the connection is used. */ +void spp_template(cb) struct sppcb *cb; { @@ -1623,6 +1636,7 @@ spp_drop(cb, errno) return (spp_close(cb)); } +void spp_abort(nsp) struct nspcb *nsp; { @@ -1630,11 +1644,10 @@ spp_abort(nsp) (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 */ +void spp_fasttimo() { struct nspcb *nsp; @@ -1659,6 +1672,7 @@ spp_fasttimo() * Updates the timers in all active pcb's and * causes finite state machine actions if timers expire. */ +void spp_slowtimo() { struct nspcb *ip, *ipnxt; @@ -1681,10 +1695,9 @@ spp_slowtimo() goto tpgone; for (i = 0; i < SPPT_NTIMERS; i++) { if (cb->s_timer[i] && --cb->s_timer[i] == 0) { - (void) spp_usrreq(cb->s_nspcb->nsp_socket, + (void) spp_usrreq(cb->s_nspcb->nsp_socket, PRU_SLOWTIMO, (struct mbuf *)0, - (struct mbuf *)i, (struct mbuf *)0, - (struct mbuf *)0); + (struct mbuf *)i, (struct mbuf *)0); if (ipnxt->nsp_prev != ip) goto tpgone; } diff --git a/sys/netproto/ns/spp_var.h b/sys/netproto/ns/spp_var.h index 71fb4b26f7..a2e8582d8f 100644 --- a/sys/netproto/ns/spp_var.h +++ b/sys/netproto/ns/spp_var.h @@ -32,7 +32,7 @@ * * @(#)spp_var.h 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netns/spp_var.h,v 1.11 1999/12/29 04:46:21 peter Exp $ - * $DragonFly: src/sys/netproto/ns/spp_var.h,v 1.2 2003/06/17 04:28:53 dillon Exp $ + * $DragonFly: src/sys/netproto/ns/spp_var.h,v 1.3 2003/09/06 21:51:12 drhodus Exp $ */ #ifndef _NETNS_SPP_VAR_H_ @@ -196,8 +196,29 @@ struct spp_istat spp_istat; #endif u_short spp_iss; -extern struct sppcb *spp_close(), *spp_disconnect(), - *spp_usrclosed(), *spp_timers(), *spp_drop(); +void spp_init (void); +void spp_input (struct mbuf *, struct nspcb *); +void spp_ctlinput (int, caddr_t); +int spp_ctloutput (int, struct socket *, int, int, struct mbuf **); +int spp_usrreq (struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *); +int spp_usrreq_sp (struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *); +void spp_fasttimo (void); +void spp_slowtimo (void); +void spp_template (struct sppcb *); +int spp_reass (struct sppcb *, struct spidp *); +int spp_output (struct sppcb *, struct mbuf *); +void spp_quench (struct nspcb *); +void spp_abort (struct nspcb *); +void spp_setpersist (struct sppcb *); + +struct sppcb *spp_close (struct sppcb *); +struct sppcb *spp_disconnect (struct sppcb *); +struct sppcb *spp_usrclosed (struct sppcb *); +struct sppcb *spp_timers (struct sppcb *, int); +struct sppcb *spp_drop (struct sppcb *, int); + #endif #define SPP_ISSINCR 128 -- 2.41.0