Module Name: src Committed By: rjs Date: Wed Aug 1 23:35:32 UTC 2018
Modified Files: src/sys/kern: sys_socket.c uipc_syscalls.c src/sys/sys: socketvar.h sockio.h Log Message: Add ioctl(2) handler for kernel part of sctp_peeloff(). To generate a diff of this commit: cvs rdiff -u -r1.76 -r1.77 src/sys/kern/sys_socket.c cvs rdiff -u -r1.195 -r1.196 src/sys/kern/uipc_syscalls.c cvs rdiff -u -r1.157 -r1.158 src/sys/sys/socketvar.h cvs rdiff -u -r1.34 -r1.35 src/sys/sys/sockio.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/sys_socket.c diff -u src/sys/kern/sys_socket.c:1.76 src/sys/kern/sys_socket.c:1.77 --- src/sys/kern/sys_socket.c:1.76 Thu Nov 30 20:25:55 2017 +++ src/sys/kern/sys_socket.c Wed Aug 1 23:35:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_socket.c,v 1.76 2017/11/30 20:25:55 christos Exp $ */ +/* $NetBSD: sys_socket.c,v 1.77 2018/08/01 23:35:32 rjs Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.76 2017/11/30 20:25:55 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.77 2018/08/01 23:35:32 rjs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -192,6 +192,12 @@ soo_ioctl(file_t *fp, u_long cmd, void * *(int *)data = (so->so_state&SS_RCVATMARK) != 0; break; + case SIOCPEELOFF: + solock(so); + error = do_sys_peeloff(so, data); + sounlock(so); + break; + default: /* * Interface/routing/protocol specific ioctls: Index: src/sys/kern/uipc_syscalls.c diff -u src/sys/kern/uipc_syscalls.c:1.195 src/sys/kern/uipc_syscalls.c:1.196 --- src/sys/kern/uipc_syscalls.c:1.195 Tue Jul 31 13:00:13 2018 +++ src/sys/kern/uipc_syscalls.c Wed Aug 1 23:35:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.195 2018/07/31 13:00:13 rjs Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.196 2018/08/01 23:35:32 rjs Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,10 +61,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.195 2018/07/31 13:00:13 rjs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.196 2018/08/01 23:35:32 rjs Exp $"); #ifdef _KERNEL_OPT #include "opt_pipe.h" +#include "opt_sctp.h" #endif #define MBUFTYPES @@ -85,6 +86,11 @@ __KERNEL_RCSID(0, "$NetBSD: uipc_syscall #include <sys/atomic.h> #include <sys/kauth.h> +#ifdef SCTP +#include <netinet/sctp_uio.h> +#include <netinet/sctp_peeloff.h> +#endif + #include <sys/mount.h> #include <sys/syscallargs.h> @@ -1606,3 +1612,69 @@ sockargs(struct mbuf **mp, const void *b return EINVAL; } } + +int +do_sys_peeloff(struct socket *head, void *data) +{ +#ifdef SCTP + /*file_t *lfp = NULL;*/ + file_t *nfp = NULL; + int error; + struct socket *so; + int fd; + uint32_t name; + /*short fflag;*/ /* type must match fp->f_flag */ + + name = *(uint32_t *) data; + error = sctp_can_peel_off(head, name); + if (error) { + printf("peeloff failed\n"); + return error; + } + /* + * At this point we know we do have a assoc to pull + * we proceed to get the fd setup. This may block + * but that is ok. + */ + error = fd_allocfile(&nfp, &fd); + if (error) { + /* + * Probably ran out of file descriptors. Put the + * unaccepted connection back onto the queue and + * do another wakeup so some other process might + * have a chance at it. + */ + return error; + } + *(int *) data = fd; + + so = sctp_get_peeloff(head, name, &error); + if (so == NULL) { + /* + * Either someone else peeled it off OR + * we can't get a socket. + * close the new descriptor, assuming someone hasn't ripped it + * out from under us. + */ + mutex_enter(&nfp->f_lock); + nfp->f_count++; + mutex_exit(&nfp->f_lock); + fd_abort(curlwp->l_proc, nfp, fd); + return error; + } + so->so_state &= ~SS_NOFDREF; + so->so_state &= ~SS_ISCONNECTING; + so->so_head = NULL; + so->so_cred = kauth_cred_dup(head->so_cred); + nfp->f_socket = so; + nfp->f_flag = FREAD|FWRITE; + nfp->f_ops = &socketops; + nfp->f_type = DTYPE_SOCKET; + + fd_affix(curlwp->l_proc, nfp, fd); + + return error; +#else + return EOPNOTSUPP; +#endif +} Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.157 src/sys/sys/socketvar.h:1.158 --- src/sys/sys/socketvar.h:1.157 Fri Jul 20 08:26:25 2018 +++ src/sys/sys/socketvar.h Wed Aug 1 23:35:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.157 2018/07/20 08:26:25 msaitoh Exp $ */ +/* $NetBSD: socketvar.h,v 1.158 2018/08/01 23:35:32 rjs Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -378,6 +378,7 @@ int do_sys_connect(struct lwp *, int, st int do_sys_accept(struct lwp *, int, struct sockaddr *, register_t *, const sigset_t *, int, int); +int do_sys_peeloff(struct socket *, void *); /* * Inline functions for sockets and socket buffering. */ Index: src/sys/sys/sockio.h diff -u src/sys/sys/sockio.h:1.34 src/sys/sys/sockio.h:1.35 --- src/sys/sys/sockio.h:1.34 Tue Jul 31 16:44:30 2018 +++ src/sys/sys/sockio.h Wed Aug 1 23:35:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sockio.h,v 1.34 2018/07/31 16:44:30 khorben Exp $ */ +/* $NetBSD: sockio.h,v 1.35 2018/08/01 23:35:32 rjs Exp $ */ /*- * Copyright (c) 1982, 1986, 1990, 1993, 1994 @@ -44,6 +44,9 @@ #define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ #define SIOCSPGRP _IOW('s', 8, int) /* set process group */ #define SIOCGPGRP _IOR('s', 9, int) /* get process group */ +#define SIOCPEELOFF _IOWR('s', 10, int) +/* ('s', 11, ...) is SIOCCONNECTX in sctp_uio.h */ +/* ('s', 12, ...) is SIOCCONNECTXDEL in sctp_uio.h */ #define SIOCADDRT _IOW('r', 10, struct ortentry) /* add route */ #define SIOCDELRT _IOW('r', 11, struct ortentry) /* delete route */