Module Name: src
Committed By: tls
Date: Sun Aug 10 06:56:21 UTC 2014
Modified Files:
src/sys/netatalk [tls-earlyentropy]: at_control.c at_extern.h
at_proto.c ddp_usrreq.c
Log Message:
Rebase.
To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.34.26.1 src/sys/netatalk/at_control.c
cvs rdiff -u -r1.16 -r1.16.76.1 src/sys/netatalk/at_extern.h
cvs rdiff -u -r1.17 -r1.17.28.1 src/sys/netatalk/at_proto.c
cvs rdiff -u -r1.41 -r1.41.2.1 src/sys/netatalk/ddp_usrreq.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/netatalk/at_control.c
diff -u src/sys/netatalk/at_control.c:1.34 src/sys/netatalk/at_control.c:1.34.26.1
--- src/sys/netatalk/at_control.c:1.34 Wed Oct 19 01:50:27 2011
+++ src/sys/netatalk/at_control.c Sun Aug 10 06:56:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: at_control.c,v 1.34 2011/10/19 01:50:27 dyoung Exp $ */
+/* $NetBSD: at_control.c,v 1.34.26.1 2014/08/10 06:56:21 tls Exp $ */
/*
* Copyright (c) 1990,1994 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at_control.c,v 1.34 2011/10/19 01:50:27 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at_control.c,v 1.34.26.1 2014/08/10 06:56:21 tls Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -72,7 +72,7 @@ static void aa_clean(void);
(a)->sat_addr.s_node == (b)->sat_addr.s_node )
int
-at_control(u_long cmd, void * data, struct ifnet *ifp, struct lwp *l)
+at_control(u_long cmd, void *data, struct ifnet *ifp)
{
struct ifreq *ifr = (struct ifreq *) data;
const struct sockaddr_at *csat;
@@ -125,7 +125,7 @@ at_control(u_long cmd, void * data, stru
* If we are not superuser, then we don't get to do these
* ops.
*/
- if (l && kauth_authorize_network(l->l_cred,
+ if (kauth_authorize_network(curlwp->l_cred,
KAUTH_NETWORK_INTERFACE,
KAUTH_REQ_NETWORK_INTERFACE_SETPRIV, ifp, (void *)cmd,
NULL) != 0)
Index: src/sys/netatalk/at_extern.h
diff -u src/sys/netatalk/at_extern.h:1.16 src/sys/netatalk/at_extern.h:1.16.76.1
--- src/sys/netatalk/at_extern.h:1.16 Wed Dec 5 23:47:18 2007
+++ src/sys/netatalk/at_extern.h Sun Aug 10 06:56:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: at_extern.h,v 1.16 2007/12/05 23:47:18 dyoung Exp $ */
+/* $NetBSD: at_extern.h,v 1.16.76.1 2014/08/10 06:56:21 tls Exp $ */
/*
* Copyright (c) 1990,1994 Regents of The University of Michigan.
@@ -41,6 +41,8 @@ struct socket;
extern struct mowner atalk_rx_mowner;
extern struct mowner atalk_tx_mowner;
+extern const struct pr_usrreqs ddp_usrreqs;
+
void atintr(void);
void aarpprobe(void *);
int aarpresolve(struct ifnet *, struct mbuf *, const struct sockaddr_at *,
@@ -48,14 +50,12 @@ int aarpresolve(struct ifnet *, struct m
void aarpinput(struct ifnet *, struct mbuf *);
int at_broadcast(const struct sockaddr_at *);
void aarp_clean(void);
-int at_control(u_long, void *, struct ifnet *, struct lwp *);
+int at_control(u_long, void *, struct ifnet *);
int at_inithead(void **, int);
void at_purgeaddr(struct ifaddr *);
void at_purgeif(struct ifnet *);
u_int16_t
at_cksum(struct mbuf *, int);
-int ddp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
- struct mbuf *, struct lwp *);
void ddp_init(void);
struct ifaddr *
at_ifawithnet(const struct sockaddr_at *, struct ifnet *);
Index: src/sys/netatalk/at_proto.c
diff -u src/sys/netatalk/at_proto.c:1.17 src/sys/netatalk/at_proto.c:1.17.28.1
--- src/sys/netatalk/at_proto.c:1.17 Thu Mar 31 19:40:52 2011
+++ src/sys/netatalk/at_proto.c Sun Aug 10 06:56:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: at_proto.c,v 1.17 2011/03/31 19:40:52 dyoung Exp $ */
+/* $NetBSD: at_proto.c,v 1.17.28.1 2014/08/10 06:56:21 tls Exp $ */
/*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.17 2011/03/31 19:40:52 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.17.28.1 2014/08/10 06:56:21 tls Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -37,7 +37,6 @@ __KERNEL_RCSID(0, "$NetBSD: at_proto.c,v
#include <sys/kernel.h>
#include <net/if.h>
-#include <net/radix.h>
#include <net/if_ether.h>
#include <netinet/in.h>
#include <net/route.h>
@@ -50,9 +49,6 @@ __KERNEL_RCSID(0, "$NetBSD: at_proto.c,v
DOMAIN_DEFINE(atalkdomain); /* forward declare and add to link set */
-PR_WRAP_USRREQ(ddp_usrreq)
-#define ddp_usrreq ddp_usrreq_wrapper
-
const struct protosw atalksw[] = {
{
.pr_type = SOCK_DGRAM,
@@ -60,7 +56,7 @@ const struct protosw atalksw[] = {
.pr_protocol = ATPROTO_DDP,
.pr_flags = PR_ATOMIC|PR_ADDR,
.pr_output = ddp_output,
- .pr_usrreq = ddp_usrreq,
+ .pr_usrreqs = &ddp_usrreqs,
.pr_init = ddp_init,
},
};
Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.41 src/sys/netatalk/ddp_usrreq.c:1.41.2.1
--- src/sys/netatalk/ddp_usrreq.c:1.41 Tue Feb 25 18:30:12 2014
+++ src/sys/netatalk/ddp_usrreq.c Sun Aug 10 06:56:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: ddp_usrreq.c,v 1.41 2014/02/25 18:30:12 pooka Exp $ */
+/* $NetBSD: ddp_usrreq.c,v 1.41.2.1 2014/08/10 06:56:21 tls Exp $ */
/*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,14 +27,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.41 2014/02/25 18:30:12 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.41.2.1 2014/08/10 06:56:21 tls Exp $");
#include "opt_mbuftrace.h"
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/systm.h>
-#include <sys/proc.h>
#include <sys/mbuf.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
@@ -42,6 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c
#include <sys/socketvar.h>
#include <sys/protosw.h>
#include <sys/kauth.h>
+#include <sys/kmem.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/route.h>
@@ -58,10 +58,9 @@ __KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c
static void at_pcbdisconnect(struct ddpcb *);
static void at_sockaddr(struct ddpcb *, struct mbuf *);
-static int at_pcbsetaddr(struct ddpcb *, struct mbuf *, struct lwp *);
-static int at_pcbconnect(struct ddpcb *, struct mbuf *, struct lwp *);
-static void at_pcbdetach(struct socket *, struct ddpcb *);
-static int at_pcballoc(struct socket *);
+static int at_pcbsetaddr(struct ddpcb *, struct mbuf *);
+static int at_pcbconnect(struct ddpcb *, struct mbuf *);
+static void ddp_detach(struct socket *);
struct ifqueue atintrq1, atintrq2;
struct ddpcb *ddp_ports[ATPORT_LAST];
@@ -76,120 +75,44 @@ struct mowner atalk_rx_mowner = MOWNER_I
struct mowner atalk_tx_mowner = MOWNER_INIT("atalk", "tx");
#endif
-/* ARGSUSED */
-int
-ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, struct mbuf *rights, struct lwp *l)
+static int
+ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr,
+ struct mbuf *rights, struct lwp *l)
{
struct ddpcb *ddp;
int error = 0;
+ 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);
+
ddp = sotoddpcb(so);
- if (req == PRU_CONTROL) {
- return (at_control((long) m, (void *) addr,
- (struct ifnet *) rights, l));
- }
- if (req == PRU_PURGEIF) {
- mutex_enter(softnet_lock);
- at_purgeif((struct ifnet *) rights);
- mutex_exit(softnet_lock);
- return (0);
- }
if (rights && rights->m_len) {
error = EINVAL;
goto release;
}
- if (ddp == NULL && req != PRU_ATTACH) {
+ if (ddp == NULL) {
error = EINVAL;
goto release;
}
switch (req) {
- case PRU_ATTACH:
- if (ddp != NULL) {
- error = EINVAL;
- break;
- }
- sosetlock(so);
- if ((error = at_pcballoc(so)) != 0) {
- break;
- }
- error = soreserve(so, ddp_sendspace, ddp_recvspace);
- break;
-
- case PRU_DETACH:
- at_pcbdetach(so, ddp);
- break;
-
- case PRU_BIND:
- error = at_pcbsetaddr(ddp, addr, l);
- break;
-
- case PRU_SOCKADDR:
- at_sockaddr(ddp, addr);
- break;
-
- case PRU_CONNECT:
- if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) {
- error = EISCONN;
- break;
- }
- error = at_pcbconnect(ddp, addr, l);
- if (error == 0)
- soisconnected(so);
- break;
-
- case PRU_DISCONNECT:
- if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE) {
- error = ENOTCONN;
- break;
- }
- at_pcbdisconnect(ddp);
- soisdisconnected(so);
- break;
-
- case PRU_SHUTDOWN:
- socantsendmore(so);
- break;
-
- case PRU_SEND:{
- int s = 0;
-
- if (addr) {
- if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) {
- error = EISCONN;
- break;
- }
- s = splnet();
- error = at_pcbconnect(ddp, addr, l);
- if (error) {
- splx(s);
- break;
- }
- } else {
- if (ddp->ddp_fsat.sat_port == ATADDR_ANYPORT) {
- error = ENOTCONN;
- break;
- }
- }
-
- error = ddp_output(m, ddp);
- m = NULL;
- if (addr) {
- at_pcbdisconnect(ddp);
- splx(s);
- }
- }
- break;
-
- case PRU_ABORT:
- soisdisconnected(so);
- at_pcbdetach(so, ddp);
- break;
-
- case PRU_LISTEN:
- case PRU_CONNECT2:
- case PRU_ACCEPT:
- case PRU_SENDOOB:
case PRU_FASTTIMO:
case PRU_SLOWTIMO:
case PRU_PROTORCV:
@@ -197,20 +120,6 @@ ddp_usrreq(struct socket *so, int req, s
error = EOPNOTSUPP;
break;
- case PRU_RCVD:
- case PRU_RCVOOB:
- /*
- * Don't mfree. Good architecture...
- */
- return (EOPNOTSUPP);
-
- case PRU_SENSE:
- /*
- * 1. Don't return block size.
- * 2. Don't mfree.
- */
- return (0);
-
default:
error = EOPNOTSUPP;
}
@@ -233,7 +142,7 @@ at_sockaddr(struct ddpcb *ddp, struct mb
}
static int
-at_pcbsetaddr(struct ddpcb *ddp, struct mbuf *addr, struct lwp *l)
+at_pcbsetaddr(struct ddpcb *ddp, struct mbuf *addr)
{
struct sockaddr_at lsat, *sat;
struct at_ifaddr *aa;
@@ -269,8 +178,8 @@ at_pcbsetaddr(struct ddpcb *ddp, struct
sat->sat_port >= ATPORT_LAST)
return (EINVAL);
- if (sat->sat_port < ATPORT_RESERVED && l &&
- (error = kauth_authorize_network(l->l_cred,
+ if (sat->sat_port < ATPORT_RESERVED &&
+ (error = kauth_authorize_network(curlwp->l_cred,
KAUTH_NETWORK_BIND, KAUTH_REQ_NETWORK_BIND_PRIVPORT,
ddpcb->ddp_socket, sat, NULL)) != 0)
return (error);
@@ -328,7 +237,7 @@ at_pcbsetaddr(struct ddpcb *ddp, struct
}
static int
-at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr, struct lwp *l)
+at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr)
{
struct rtentry *rt;
const struct sockaddr_at *cdst;
@@ -414,7 +323,7 @@ at_pcbconnect(struct ddpcb *ddp, struct
return ENETUNREACH;
ddp->ddp_fsat = *sat;
if (ddp->ddp_lsat.sat_port == ATADDR_ANYPORT)
- return at_pcbsetaddr(ddp, NULL, l);
+ return at_pcbsetaddr(ddp, NULL);
return 0;
}
@@ -427,13 +336,23 @@ at_pcbdisconnect(struct ddpcb *ddp)
}
static int
-at_pcballoc(struct socket *so)
+ddp_attach(struct socket *so, int proto)
{
- struct ddpcb *ddp;
+ struct ddpcb *ddp;
+ int error;
- ddp = malloc(sizeof(*ddp), M_PCB, M_WAITOK|M_ZERO);
- if (!ddp)
- panic("at_pcballoc");
+ KASSERT(sotoddpcb(so) == NULL);
+ sosetlock(so);
+#ifdef MBUFTRACE
+ so->so_rcv.sb_mowner = &atalk_rx_mowner;
+ so->so_snd.sb_mowner = &atalk_tx_mowner;
+#endif
+ error = soreserve(so, ddp_sendspace, ddp_recvspace);
+ if (error) {
+ return error;
+ }
+
+ ddp = kmem_zalloc(sizeof(*ddp), KM_SLEEP);
ddp->ddp_lsat.sat_port = ATADDR_ANYPORT;
ddp->ddp_next = ddpcb;
@@ -446,19 +365,17 @@ at_pcballoc(struct socket *so)
ddpcb = ddp;
ddp->ddp_socket = so;
- so->so_pcb = (void *) ddp;
-#ifdef MBUFTRACE
- so->so_rcv.sb_mowner = &atalk_rx_mowner;
- so->so_snd.sb_mowner = &atalk_tx_mowner;
-#endif
+ so->so_pcb = ddp;
return 0;
}
static void
-at_pcbdetach(struct socket *so, struct ddpcb *ddp)
+ddp_detach(struct socket *so)
{
+ struct ddpcb *ddp = sotoddpcb(so);
+
soisdisconnected(so);
- so->so_pcb = 0;
+ so->so_pcb = NULL;
/* sofree drops the lock */
sofree(so);
mutex_enter(softnet_lock);
@@ -484,7 +401,201 @@ at_pcbdetach(struct socket *so, struct d
if (ddp->ddp_next) {
ddp->ddp_next->ddp_prev = ddp->ddp_prev;
}
- free(ddp, M_PCB);
+ kmem_free(ddp, sizeof(*ddp));
+}
+
+static int
+ddp_accept(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ KASSERT(solocked(so));
+ KASSERT(sotoddpcb(so) != NULL);
+
+ return at_pcbsetaddr(sotoddpcb(so), nam);
+}
+
+static int
+ddp_listen(struct socket *so, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+ struct ddpcb *ddp = sotoddpcb(so);
+ int error = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(ddp != NULL);
+ KASSERT(nam != NULL);
+
+ if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT)
+ return EISCONN;
+ error = at_pcbconnect(ddp, nam);
+ if (error == 0)
+ soisconnected(so);
+
+ return error;
+}
+
+static int
+ddp_connect2(struct socket *so, struct socket *so2)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_disconnect(struct socket *so)
+{
+ struct ddpcb *ddp = sotoddpcb(so);
+
+ KASSERT(solocked(so));
+ KASSERT(ddp != NULL);
+
+ if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE)
+ return ENOTCONN;
+
+ at_pcbdisconnect(ddp);
+ soisdisconnected(so);
+ return 0;
+}
+
+static int
+ddp_shutdown(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ socantsendmore(so);
+ return 0;
+}
+
+static int
+ddp_abort(struct socket *so)
+{
+ KASSERT(solocked(so));
+
+ soisdisconnected(so);
+ ddp_detach(so);
+ return 0;
+}
+
+static int
+ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp)
+{
+ return at_control(cmd, addr, ifp);
+}
+
+static int
+ddp_stat(struct socket *so, struct stat *ub)
+{
+ KASSERT(solocked(so));
+
+ /* stat: don't bother with a blocksize. */
+ return 0;
+}
+
+static int
+ddp_peeraddr(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_sockaddr(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+ KASSERT(sotoddpcb(so) != NULL);
+ KASSERT(nam != NULL);
+
+ at_sockaddr(sotoddpcb(so), nam);
+ return 0;
+}
+
+static int
+ddp_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_recvoob(struct socket *so, struct mbuf *m, int flags)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct ddpcb *ddp = sotoddpcb(so);
+ int error = 0;
+ int s = 0; /* XXX gcc 4.8 warns on sgimips */
+
+ KASSERT(solocked(so));
+ KASSERT(ddp != NULL);
+
+ if (nam) {
+ if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT)
+ return EISCONN;
+ s = splnet();
+ error = at_pcbconnect(ddp, nam);
+ if (error) {
+ splx(s);
+ return error;
+ }
+ } else {
+ if (ddp->ddp_fsat.sat_port == ATADDR_ANYPORT)
+ return ENOTCONN;
+ }
+
+ error = ddp_output(m, ddp);
+ m = NULL;
+ if (nam) {
+ at_pcbdisconnect(ddp);
+ splx(s);
+ }
+
+ return error;
+}
+
+static int
+ddp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
+{
+ KASSERT(solocked(so));
+
+ if (m)
+ m_freem(m);
+
+ return EOPNOTSUPP;
+}
+
+static int
+ddp_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+ mutex_enter(softnet_lock);
+ at_purgeif(ifp);
+ mutex_exit(softnet_lock);
+
+ return 0;
}
/*
@@ -557,16 +668,50 @@ ddp_init(void)
MOWNER_ATTACH(&aarp_mowner);
}
-#if 0
-static void
-ddp_clean(void)
-{
- struct ddpcb *ddp;
-
- for (ddp = ddpcb; ddp; ddp = ddp->ddp_next)
- at_pcbdetach(ddp->ddp_socket, ddp);
-}
-#endif
+PR_WRAP_USRREQS(ddp)
+#define ddp_attach ddp_attach_wrapper
+#define ddp_detach ddp_detach_wrapper
+#define ddp_accept ddp_accept_wrapper
+#define ddp_bind ddp_bind_wrapper
+#define ddp_listen ddp_listen_wrapper
+#define ddp_connect ddp_connect_wrapper
+#define ddp_connect2 ddp_connect2_wrapper
+#define ddp_disconnect ddp_disconnect_wrapper
+#define ddp_shutdown ddp_shutdown_wrapper
+#define ddp_abort ddp_abort_wrapper
+#define ddp_ioctl ddp_ioctl_wrapper
+#define ddp_stat ddp_stat_wrapper
+#define ddp_peeraddr ddp_peeraddr_wrapper
+#define ddp_sockaddr ddp_sockaddr_wrapper
+#define ddp_rcvd ddp_rcvd_wrapper
+#define ddp_recvoob ddp_recvoob_wrapper
+#define ddp_send ddp_send_wrapper
+#define ddp_sendoob ddp_sendoob_wrapper
+#define ddp_purgeif ddp_purgeif_wrapper
+#define ddp_usrreq ddp_usrreq_wrapper
+
+const struct pr_usrreqs ddp_usrreqs = {
+ .pr_attach = ddp_attach,
+ .pr_detach = ddp_detach,
+ .pr_accept = ddp_accept,
+ .pr_bind = ddp_bind,
+ .pr_listen = ddp_listen,
+ .pr_connect = ddp_connect,
+ .pr_connect2 = ddp_connect2,
+ .pr_disconnect = ddp_disconnect,
+ .pr_shutdown = ddp_shutdown,
+ .pr_abort = ddp_abort,
+ .pr_ioctl = ddp_ioctl,
+ .pr_stat = ddp_stat,
+ .pr_peeraddr = ddp_peeraddr,
+ .pr_sockaddr = ddp_sockaddr,
+ .pr_rcvd = ddp_rcvd,
+ .pr_recvoob = ddp_recvoob,
+ .pr_send = ddp_send,
+ .pr_sendoob = ddp_sendoob,
+ .pr_purgeif = ddp_purgeif,
+ .pr_generic = ddp_usrreq,
+};
static int
sysctl_net_atalk_ddp_stats(SYSCTLFN_ARGS)