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 */