Module Name: src
Committed By: tls
Date: Sun Aug 10 06:56:41 UTC 2014
Modified Files:
src/sys/netnatm [tls-earlyentropy]: natm.c natm.h natm_pcb.c
natm_proto.c
Log Message:
Rebase.
To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.24.28.1 src/sys/netnatm/natm.c
cvs rdiff -u -r1.11 -r1.11.28.1 src/sys/netnatm/natm.h
cvs rdiff -u -r1.14 -r1.14.28.1 src/sys/netnatm/natm_pcb.c \
src/sys/netnatm/natm_proto.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.24 src/sys/netnatm/natm.c:1.24.28.1
--- src/sys/netnatm/natm.c:1.24 Wed Mar 9 22:06:42 2011
+++ src/sys/netnatm/natm.c Sun Aug 10 06:56:41 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: natm.c,v 1.24 2011/03/09 22:06:42 dyoung Exp $ */
+/* $NetBSD: natm.c,v 1.24.28.1 2014/08/10 06:56:41 tls Exp $ */
/*
* Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -30,14 +30,14 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.24 2011/03/09 22:06:42 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.24.28.1 2014/08/10 06:56:41 tls Exp $");
#include <sys/param.h>
+#include <sys/kmem.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/domain.h>
#include <sys/ioctl.h>
-#include <sys/proc.h>
#include <sys/protosw.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
@@ -46,7 +46,6 @@ __KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.2
#include <net/if.h>
#include <net/if_atm.h>
#include <net/netisr.h>
-#include <net/radix.h>
#include <net/route.h>
#include <netinet/in.h>
@@ -59,252 +58,421 @@ u_long natm5_recvspace = 16*1024;
u_long natm0_sendspace = 16*1024;
u_long natm0_recvspace = 16*1024;
-/*
- * user requests
- */
+static int
+natm_attach(struct socket *so, int proto)
+{
+ int error = 0;
+ struct natmpcb *npcb;
-int natm_usrreq(so, req, m, nam, control, l)
+ KASSERT(so->so_pcb == NULL);
+ sosetlock(so);
-struct socket *so;
-int req;
-struct mbuf *m, *nam, *control;
-struct lwp *l;
+ if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
+ if (proto == PROTO_NATMAAL5)
+ error = soreserve(so, natm5_sendspace, natm5_recvspace);
+ else
+ error = soreserve(so, natm0_sendspace, natm0_recvspace);
+ if (error)
+ return error;
+ }
+ npcb = npcb_alloc(true);
+ npcb->npcb_socket = so;
+ so->so_pcb = npcb;
+ return error;
+}
+static void
+natm_detach(struct socket *so)
{
- int error = 0, s, s2;
+ struct natmpcb *npcb = (struct natmpcb *)so->so_pcb;
+
+ /*
+ * we turn on 'drain' *before* we sofree.
+ */
+
+ npcb_free(npcb, NPCB_DESTROY); /* drain */
+ so->so_pcb = NULL;
+ /* sofree drops the lock */
+ sofree(so);
+ mutex_enter(softnet_lock);
+}
+
+static int
+natm_accept(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+natm_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+natm_listen(struct socket *so, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+natm_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ int error = 0, s2;
+ struct natmpcb *npcb;
+ struct sockaddr_natm *snatm;
+ struct atm_pseudoioctl api;
+ struct atm_pseudohdr *aph;
+ struct ifnet *ifp;
+ int proto = so->so_proto->pr_protocol;
+
+ KASSERT(solocked(so));
+
+ /*
+ * validate nam and npcb
+ */
+
+ if (nam->m_len != sizeof(*snatm))
+ return EINVAL;
+ snatm = mtod(nam, struct sockaddr_natm *);
+ if (snatm->snatm_len != sizeof(*snatm) ||
+ (npcb->npcb_flags & NPCB_FREE) == 0)
+ return EINVAL;
+ if (snatm->snatm_family != AF_NATM)
+ return EAFNOSUPPORT;
+
+ snatm->snatm_if[IFNAMSIZ-1] = '\0'; /* XXX ensure null termination
+ since ifunit() uses strcmp */
+
+ /*
+ * convert interface string to ifp, validate.
+ */
+
+ ifp = ifunit(snatm->snatm_if);
+ if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
+ return ENXIO;
+ }
+ if (ifp->if_output != atm_output) {
+ return EAFNOSUPPORT;
+ }
+
+ /*
+ * register us with the NATM PCB layer
+ */
+
+ if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb)
+ return EADDRINUSE;
+
+ /*
+ * enable rx
+ */
+
+ ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+ ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
+ ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
+ api.rxhand = npcb;
+ s2 = splnet();
+ if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
+ splx(s2);
+ npcb_free(npcb, NPCB_REMOVE);
+ return EIO;
+ }
+ splx(s2);
+
+ soisconnected(so);
+ return error;
+}
+
+static int
+natm_connect2(struct socket *so, struct socket *so2)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+natm_disconnect(struct socket *so)
+{
+ struct natmpcb *npcb = (struct natmpcb *)so->so_pcb;
+
+ KASSERT(solocked(so));
+ KASSERT(npcb != NULL);
+
+ if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
+ printf("natm: disconnected check\n");
+ return EIO;
+ }
+ ifp = npcb->npcb_ifp;
+
+ /*
+ * disable rx
+ */
+ ATM_PH_FLAGS(&api.aph) = ATM_PH_AAL5;
+ ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
+ ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
+ api.rxhand = npcb;
+
+ s2 = splnet();
+ ifp->if_ioctl(ifp, SIOCATMDIS, &api);
+ splx(s);
+
+ npcb_free(npcb, NPCB_REMOVE);
+ soisdisconnected(so);
+ return 0;
+}
+
+static int
+natm_shutdown(struct socket *so)
+{
+ int s;
+
+ KASSERT(solocked(so));
+
+ s = splsoftnet();
+ socantsendmore(so);
+ splx(s);
+
+ return 0;
+}
+
+static int
+natm_abort(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
+{
+ int error = 0, s;
struct natmpcb *npcb;
- struct sockaddr_natm *snatm;
- struct atm_pseudoioctl api;
- struct atm_pseudohdr *aph;
struct atm_rawioctl ario;
- struct ifnet *ifp;
- int proto = so->so_proto->pr_protocol;
s = SPLSOFTNET();
npcb = (struct natmpcb *) so->so_pcb;
- if (npcb == NULL && req != PRU_ATTACH) {
- error = EINVAL;
+ /*
+ * raw atm ioctl. comes in as a SIOCRAWATM. we convert it to
+ * SIOCXRAWATM and pass it to the driver.
+ */
+ if (cmd == SIOCRAWATM) {
+ if (npcb->npcb_ifp == NULL) {
+ error = ENOTCONN;
+ goto done;
+ }
+ ario.npcb = npcb;
+ ario.rawvalue = *((int *)nam);
+ error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, &ario);
+ if (!error) {
+ if (ario.rawvalue)
+ npcb->npcb_flags |= NPCB_RAW;
+ else
+ npcb->npcb_flags &= ~(NPCB_RAW);
+ }
+
goto done;
}
+ error = EOPNOTSUPP;
- switch (req) {
- case PRU_ATTACH: /* attach protocol to up */
+done:
+ splx(s);
+ return(error);
+}
- if (npcb) {
- error = EISCONN;
- break;
- }
-
- if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
- if (proto == PROTO_NATMAAL5)
- error = soreserve(so, natm5_sendspace, natm5_recvspace);
- else
- error = soreserve(so, natm0_sendspace, natm0_recvspace);
- if (error)
- break;
- }
+static int
+natm_stat(struct socket *so, struct stat *ub)
+{
+ KASSERT(solocked(so));
- so->so_pcb = (void *) (npcb = npcb_alloc(M_WAITOK));
- npcb->npcb_socket = so;
+ return 0;
+}
- break;
+static int
+natm_peeraddr(struct socket *so, struct mbuf *nam)
+{
+ struct natmpcb *npcb = (struct natmpcb *) so->so_pcb;
+ struct sockaddr_natm *snatm;
- case PRU_DETACH: /* detach protocol from up */
+ KASSERT(solocked(so));
+ KASSERT(pcb != NULL);
+ KASSERT(nam != NULL);
+
+ snatm = mtod(nam, struct sockaddr_natm *);
+ memset(snatm, 0, sizeof(*snatm));
+ nam->m_len = snatm->snatm_len = sizeof(*snatm);
+ snatm->snatm_family = AF_NATM;
+ memcpy(snatm->snatm_if, npcb->npcb_ifp->if_xname, sizeof(snatm->snatm_if));
+ snatm->snatm_vci = npcb->npcb_vci;
+ snatm->snatm_vpi = npcb->npcb_vpi;
+ return 0;
+}
- /*
- * we turn on 'drain' *before* we sofree.
- */
-
- npcb_free(npcb, NPCB_DESTROY); /* drain */
- so->so_pcb = NULL;
- /* sofree drops the lock */
- sofree(so);
- mutex_enter(softnet_lock);
+static int
+natm_sockaddr(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
- break;
+ return EOPNOTSUPP;
+}
- case PRU_CONNECT: /* establish connection to peer */
+static int
+natm_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+ KASSERT(solocked(so));
- /*
- * validate nam and npcb
- */
-
- if (nam->m_len != sizeof(*snatm)) {
- error = EINVAL;
- break;
- }
- snatm = mtod(nam, struct sockaddr_natm *);
- if (snatm->snatm_len != sizeof(*snatm) ||
- (npcb->npcb_flags & NPCB_FREE) == 0) {
- error = EINVAL;
- break;
- }
- if (snatm->snatm_family != AF_NATM) {
- error = EAFNOSUPPORT;
- break;
- }
+ return EOPNOTSUPP;
+}
- snatm->snatm_if[IFNAMSIZ-1] = '\0'; /* XXX ensure null termination
- since ifunit() uses strcmp */
+static int
+natm_recvoob(struct socket *so, struct mbuf *m, int flags)
+{
+ KASSERT(solocked(so));
- /*
- * convert interface string to ifp, validate.
- */
-
- ifp = ifunit(snatm->snatm_if);
- if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
- error = ENXIO;
- break;
- }
- if (ifp->if_output != atm_output) {
- error = EAFNOSUPPORT;
- break;
- }
-
-
- /*
- * register us with the NATM PCB layer
- */
-
- if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) {
- error = EADDRINUSE;
- break;
- }
-
- /*
- * enable rx
- */
-
- ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
- ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
- ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
- api.rxhand = npcb;
- s2 = splnet();
- if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
- splx(s2);
- npcb_free(npcb, NPCB_REMOVE);
- error = EIO;
- break;
- }
- splx(s2);
+ return EOPNOTSUPP;
+}
- soisconnected(so);
+static int
+natm_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control)
+{
+ struct natmpcb *npcb = (struct natmpcb *) so->so_pcb;
+ struct atm_pseudohdr *aph;
- break;
+ KASSERT(solocked(so));
+ KASSERT(pcb != NULL);
+ KASSERT(m != NULL);
+
+ if (control && control->m_len) {
+ m_freem(control);
+ m_freem(m);
+ return EINVAL;
+ }
- case PRU_DISCONNECT: /* disconnect from peer */
+ /*
+ * send the data. we must put an atm_pseudohdr on first
+ */
+ s = SPLSOFTNET();
+ M_PREPEND(m, sizeof(*aph), M_WAITOK);
+ if (m == NULL) {
+ error = ENOBUFS;
+ break;
+ }
+ aph = mtod(m, struct atm_pseudohdr *);
+ ATM_PH_VPI(aph) = npcb->npcb_vpi;
+ ATM_PH_SETVCI(aph, npcb->npcb_vci);
+ ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+ error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
+ splx(s);
- if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
- printf("natm: disconnected check\n");
- error = EIO;
- break;
- }
- ifp = npcb->npcb_ifp;
-
- /*
- * disable rx
- */
-
- ATM_PH_FLAGS(&api.aph) = ATM_PH_AAL5;
- ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
- ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
- api.rxhand = npcb;
- s2 = splnet();
- ifp->if_ioctl(ifp, SIOCATMDIS, &api);
- splx(s);
+ return error;
+}
- npcb_free(npcb, NPCB_REMOVE);
- soisdisconnected(so);
+static int
+natm_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct natmpcb *npcb = (struct natmpcb *) so->so_pcb;
+ struct atm_pseudohdr *aph;
- break;
+ KASSERT(solocked(so));
+ KASSERT(pcb != NULL);
+ KASSERT(m != NULL);
+
+ if (control && control->m_len) {
+ m_freem(control);
+ m_freem(m);
+ return EINVAL;
+ }
- case PRU_SHUTDOWN: /* won't send any more data */
- socantsendmore(so);
- break;
+ /*
+ * send the data. we must put an atm_pseudohdr on first
+ */
+ s = SPLSOFTNET();
+ M_PREPEND(m, sizeof(*aph), M_WAITOK);
+ if (m == NULL) {
+ error = ENOBUFS;
+ break;
+ }
+ aph = mtod(m, struct atm_pseudohdr *);
+ ATM_PH_VPI(aph) = npcb->npcb_vpi;
+ ATM_PH_SETVCI(aph, npcb->npcb_vci);
+ ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+ error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
+ splx(s);
- case PRU_SEND: /* send this data */
- if (control && control->m_len) {
- m_freem(control);
- m_freem(m);
- error = EINVAL;
- break;
- }
-
- /*
- * send the data. we must put an atm_pseudohdr on first
- */
-
- M_PREPEND(m, sizeof(*aph), M_WAITOK);
- if (m == NULL) {
- error = ENOBUFS;
- break;
- }
- aph = mtod(m, struct atm_pseudohdr *);
- ATM_PH_VPI(aph) = npcb->npcb_vpi;
- ATM_PH_SETVCI(aph, npcb->npcb_vci);
- ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+ return error;
+}
- error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
+static int
+natm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
+{
+ KASSERT(solocked(so));
- break;
+ return EOPNOTSUPP;
+}
- case PRU_SENSE: /* return status into m */
- /* return zero? */
- break;
+static int
+natm_purgeif(struct socket *so, struct ifnet *ifp)
+{
- case PRU_PEERADDR: /* fetch peer's address */
- snatm = mtod(nam, struct sockaddr_natm *);
- memset(snatm, 0, sizeof(*snatm));
- nam->m_len = snatm->snatm_len = sizeof(*snatm);
- snatm->snatm_family = AF_NATM;
- memcpy(snatm->snatm_if, npcb->npcb_ifp->if_xname, sizeof(snatm->snatm_if));
- snatm->snatm_vci = npcb->npcb_vci;
- snatm->snatm_vpi = npcb->npcb_vpi;
- break;
+ return EOPNOTSUPP;
+}
- case PRU_CONTROL: /* control operations on protocol */
- /*
- * raw atm ioctl. comes in as a SIOCRAWATM. we convert it to
- * SIOCXRAWATM and pass it to the driver.
- */
- if ((u_long)m == SIOCRAWATM) {
- if (npcb->npcb_ifp == NULL) {
- error = ENOTCONN;
- break;
- }
- ario.npcb = npcb;
- ario.rawvalue = *((int *)nam);
- error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, &ario);
- if (!error) {
- if (ario.rawvalue)
- npcb->npcb_flags |= NPCB_RAW;
- else
- npcb->npcb_flags &= ~(NPCB_RAW);
- }
+/*
+ * user requests
+ */
- break;
- }
+static int
+natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ int error = 0, s, s2;
+ struct natmpcb *npcb;
+ struct sockaddr_natm *snatm;
+ struct atm_pseudoioctl api;
+ struct atm_pseudohdr *aph;
+ struct ifnet *ifp;
+ int proto = so->so_proto->pr_protocol;
- error = EOPNOTSUPP;
- break;
+ KASSERT(req != PRU_ATTACH);
+ KASSERT(req != PRU_DETACH);
+ KASSERT(req != PRU_ACCEPT);
+ KASSERT(req != PRU_BIND);
+ KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
+ KASSERT(req != PRU_CONNECT2);
+ KASSERT(req != PRU_DISCONNECT);
+ KASSERT(req != PRU_SHUTDOWN);
+ KASSERT(req != PRU_ABORT);
+ KASSERT(req != PRU_CONTROL);
+ KASSERT(req != PRU_SENSE);
+ KASSERT(req != PRU_PEERADDR);
+ KASSERT(req != PRU_SOCKADDR);
+ KASSERT(req != PRU_RCVD);
+ KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
+ KASSERT(req != PRU_SENDOOB);
+ KASSERT(req != PRU_PURGEIF);
- case PRU_BIND: /* bind socket to address */
- case PRU_LISTEN: /* listen for connection */
- case PRU_ACCEPT: /* accept connection from peer */
- case PRU_CONNECT2: /* connect two sockets */
- case PRU_ABORT: /* abort (fast DISCONNECT, DETATCH) */
- /* (only happens if LISTEN socket) */
- case PRU_RCVD: /* have taken data; more room now */
+ if (so->so_pcb == NULL)
+ return EINVAL;
+
+ switch (req) {
case PRU_FASTTIMO: /* 200ms timeout */
case PRU_SLOWTIMO: /* 500ms timeout */
- case PRU_RCVOOB: /* retrieve out of band data */
- case PRU_SENDOOB: /* send out of band data */
case PRU_PROTORCV: /* receive from below */
case PRU_PROTOSEND: /* send to below */
- case PRU_SOCKADDR: /* fetch socket's address */
#ifdef DIAGNOSTIC
printf("natm: PRU #%d unsupported\n", req);
#endif
@@ -315,8 +483,7 @@ struct lwp *l;
}
done:
- splx(s);
- return(error);
+ return error;
}
/*
@@ -361,7 +528,7 @@ next:
if (npcb->npcb_flags & NPCB_DRAIN) {
m_freem(m);
if (npcb->npcb_inq == 0)
- free(npcb, M_PCB); /* done! */
+ kmem_intr_free(npcb, sizeof(*npcb));
goto next;
}
@@ -396,3 +563,48 @@ m->m_pkthdr.rcvif = NULL; /* null it out
goto next;
}
+
+PR_WRAP_USRREQS(natm)
+#define natm_attach natm_attach_wrapper
+#define natm_detach natm_detach_wrapper
+#define natm_accept natm_accept_wrapper
+#define natm_bind natm_bind_wrapper
+#define natm_listen natm_listen_wrapper
+#define natm_connect natm_connect_wrapper
+#define natm_connect2 natm_connect2_wrapper
+#define natm_disconnect natm_disconnect_wrapper
+#define natm_shutdown natm_shutdown_wrapper
+#define natm_abort natm_abort_wrapper
+#define natm_ioctl natm_ioctl_wrapper
+#define natm_stat natm_stat_wrapper
+#define natm_peeraddr natm_peeraddr_wrapper
+#define natm_sockaddr natm_sockaddr_wrapper
+#define natm_rcvd natm_rcvd_wrapper
+#define natm_recvoob natm_recvoob_wrapper
+#define natm_send natm_send_wrapper
+#define natm_sendoob natm_sendoob_wrapper
+#define natm_purgeif natm_purgeif_wrapper
+#define natm_usrreq natm_usrreq_wrapper
+
+const struct pr_usrreqs natm_usrreqs = {
+ .pr_attach = natm_attach,
+ .pr_detach = natm_detach,
+ .pr_accept = natm_accept,
+ .pr_bind = natm_bind,
+ .pr_listen = natm_listen,
+ .pr_connect = natm_connect,
+ .pr_connect2 = natm_connect2,
+ .pr_disconnect = natm_disconnect,
+ .pr_shutdown = natm_shutdown,
+ .pr_abort = natm_abort,
+ .pr_ioctl = natm_ioctl,
+ .pr_stat = natm_stat,
+ .pr_peeraddr = natm_peeraddr,
+ .pr_sockaddr = natm_sockaddr,
+ .pr_rcvd = natm_rcvd,
+ .pr_recvoob = natm_recvoob,
+ .pr_send = natm_send,
+ .pr_sendoob = natm_sendoob,
+ .pr_purgeif = natm_purgeif,
+ .pr_generic = natm_usrreq,
+};
Index: src/sys/netnatm/natm.h
diff -u src/sys/netnatm/natm.h:1.11 src/sys/netnatm/natm.h:1.11.28.1
--- src/sys/netnatm/natm.h:1.11 Tue Feb 1 19:40:24 2011
+++ src/sys/netnatm/natm.h Sun Aug 10 06:56:41 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: natm.h,v 1.11 2011/02/01 19:40:24 chuck Exp $ */
+/* $NetBSD: natm.h,v 1.11.28.1 2014/08/10 06:56:41 tls Exp $ */
/*
* Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -119,6 +119,8 @@ extern u_int natm_sookcnt,
natm_sookbytes; /* account of ok */
#endif
+extern const struct pr_usrreqs natm_usrreqs;
+
/* atm_rawioctl: kernel's version of SIOCRAWATM [for internal use only!] */
struct atm_rawioctl {
struct natmpcb *npcb;
@@ -129,18 +131,11 @@ struct atm_rawioctl {
/* external functions */
/* natm_pcb.c */
-struct natmpcb *npcb_alloc(int);
+struct natmpcb *npcb_alloc(bool);
void npcb_free(struct natmpcb *, int);
-struct natmpcb *npcb_add(struct natmpcb *, struct ifnet *, int, int);
+struct natmpcb *npcb_add(struct natmpcb *, struct ifnet *, u_int16_t, u_int8_t);
/* natm.c */
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-int natm_usrreq(struct socket *, int, struct mbuf *,
- struct mbuf *, struct mbuf *, struct lwp *);
-#elif defined(__FreeBSD__)
-int natm_usrreq(struct socket *, int, struct mbuf *,
- struct mbuf *, struct mbuf *);
-#endif
int natm0_sysctl(int *, u_int, void *, size_t *, void *, size_t);
int natm5_sysctl(int *, u_int, void *, size_t *, void *, size_t);
void natmintr(void);
Index: src/sys/netnatm/natm_pcb.c
diff -u src/sys/netnatm/natm_pcb.c:1.14 src/sys/netnatm/natm_pcb.c:1.14.28.1
--- src/sys/netnatm/natm_pcb.c:1.14 Tue Feb 1 19:40:24 2011
+++ src/sys/netnatm/natm_pcb.c Sun Aug 10 06:56:41 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: natm_pcb.c,v 1.14 2011/02/01 19:40:24 chuck Exp $ */
+/* $NetBSD: natm_pcb.c,v 1.14.28.1 2014/08/10 06:56:41 tls Exp $ */
/*
* Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -31,18 +31,18 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: natm_pcb.c,v 1.14 2011/02/01 19:40:24 chuck Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm_pcb.c,v 1.14.28.1 2014/08/10 06:56:41 tls Exp $");
#include "opt_ddb.h"
#include <sys/param.h>
+#include <sys/kmem.h>
#include <sys/systm.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/protosw.h>
#include <sys/domain.h>
#include <sys/mbuf.h>
-#include <sys/malloc.h>
#include <net/if.h>
#include <net/radix.h>
@@ -56,21 +56,13 @@ __KERNEL_RCSID(0, "$NetBSD: natm_pcb.c,v
* npcb_alloc: allocate a npcb [in the free state]
*/
-struct natmpcb *npcb_alloc(wait)
-
-int wait;
-
+struct natmpcb *
+npcb_alloc(bool wait)
{
struct natmpcb *npcb;
- npcb = malloc(sizeof(*npcb), M_PCB, wait);
-
-#ifdef DIAGNOSTIC
- if (wait == M_WAITOK && npcb == NULL) panic("npcb_alloc: malloc didn't wait");
-#endif
-
+ npcb = kmem_intr_zalloc(sizeof(*npcb), wait ? KM_SLEEP : KM_NOSLEEP);
if (npcb) {
- memset(npcb, 0, sizeof(*npcb));
npcb->npcb_flags = NPCB_FREE;
}
return(npcb);
@@ -81,11 +73,8 @@ int wait;
* npcb_free: free a npcb
*/
-void npcb_free(npcb, op)
-
-struct natmpcb *npcb;
-int op;
-
+void
+npcb_free(struct natmpcb *npcb, int op)
{
int s = splnet();
@@ -95,9 +84,9 @@ int op;
}
if (op == NPCB_DESTROY) {
if (npcb->npcb_inq) {
- npcb->npcb_flags = NPCB_DRAIN; /* flag for distruction */
+ npcb->npcb_flags = NPCB_DRAIN; /* flag for destruction */
} else {
- free(npcb, M_PCB); /* kill it! */
+ kmem_intr_free(npcb, sizeof(*npcb));
}
}
@@ -110,13 +99,9 @@ int op;
* returns npcb if ok
*/
-struct natmpcb *npcb_add(npcb, ifp, vci, vpi)
-
-struct natmpcb *npcb;
-struct ifnet *ifp;
-u_int16_t vci;
-u_int8_t vpi;
-
+struct natmpcb *
+npcb_add(struct natmpcb *npcb, struct ifnet *ifp,
+ u_int16_t vci, u_int8_t vpi)
{
struct natmpcb *cpcb = NULL; /* current pcb */
int s = splnet();
@@ -146,7 +131,7 @@ u_int8_t vpi;
*/
if (npcb == NULL) {
- cpcb = npcb_alloc(M_NOWAIT); /* could be called from lower half */
+ cpcb = npcb_alloc(false); /* could be called from lower half */
if (cpcb == NULL)
goto done; /* fail */
} else {
Index: src/sys/netnatm/natm_proto.c
diff -u src/sys/netnatm/natm_proto.c:1.14 src/sys/netnatm/natm_proto.c:1.14.28.1
--- src/sys/netnatm/natm_proto.c:1.14 Tue Feb 1 19:40:24 2011
+++ src/sys/netnatm/natm_proto.c Sun Aug 10 06:56:41 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: natm_proto.c,v 1.14 2011/02/01 19:40:24 chuck Exp $ */
+/* $NetBSD: natm_proto.c,v 1.14.28.1 2014/08/10 06:56:41 tls Exp $ */
/*
* Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: natm_proto.c,v 1.14 2011/02/01 19:40:24 chuck Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm_proto.c,v 1.14.28.1 2014/08/10 06:56:41 tls Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -42,7 +42,6 @@ __KERNEL_RCSID(0, "$NetBSD: natm_proto.c
#include <sys/mbuf.h>
#include <net/if.h>
-#include <net/radix.h>
#include <net/route.h>
#include <netinet/in.h>
@@ -57,10 +56,6 @@ struct npcblist natm_pcbs = LIST_HEAD_IN
struct ifqueue natmintrq; /* natm packet input queue */
int natmqmaxlen = IFQ_MAXLEN; /* max # of packets on queue */
-PR_WRAP_USRREQ(natm_usrreq)
-
-#define natm_usrreq natm_usrreq_wrapper
-
const struct protosw natmsw[] = {
{ .pr_type = SOCK_STREAM,
.pr_domain = &natmdomain,
@@ -70,7 +65,7 @@ const struct protosw natmsw[] = {
.pr_output = 0,
.pr_ctlinput = 0,
.pr_ctloutput = 0,
- .pr_usrreq = natm_usrreq,
+ .pr_usrreqs = &natm_usrreq,
.pr_init = 0,
.pr_fasttimo = 0,
.pr_slowtimo = 0,
@@ -84,7 +79,7 @@ const struct protosw natmsw[] = {
.pr_output = 0,
.pr_ctlinput = 0,
.pr_ctloutput = 0,
- .pr_usrreq = natm_usrreq,
+ .pr_usrreqs = &natm_usrreq,
.pr_init = 0,
.pr_fasttimo = 0,
.pr_slowtimo = 0,
@@ -98,7 +93,7 @@ const struct protosw natmsw[] = {
.pr_output = 0,
.pr_ctlinput = 0,
.pr_ctloutput = 0,
- .pr_usrreq = natm_usrreq,
+ .pr_usrreqs = &natm_usrreqs,
.pr_init = 0,
.pr_fasttimo = 0,
.pr_slowtimo = 0,