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)