Module Name: src
Committed By: rjs
Date: Tue Oct 17 16:07:18 UTC 2017
Modified Files:
src/sys/netinet: sctp_usrreq.c
Log Message:
Set SPL level to match usage for TCP.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/netinet/sctp_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/netinet/sctp_usrreq.c
diff -u src/sys/netinet/sctp_usrreq.c:1.6 src/sys/netinet/sctp_usrreq.c:1.7
--- src/sys/netinet/sctp_usrreq.c:1.6 Thu Jul 7 09:32:02 2016
+++ src/sys/netinet/sctp_usrreq.c Tue Oct 17 16:07:18 2017
@@ -1,5 +1,5 @@
/* $KAME: sctp_usrreq.c,v 1.50 2005/06/16 20:45:29 jinmei Exp $ */
-/* $NetBSD: sctp_usrreq.c,v 1.6 2016/07/07 09:32:02 ozaki-r Exp $ */
+/* $NetBSD: sctp_usrreq.c,v 1.7 2017/10/17 16:07:18 rjs Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc.
@@ -33,7 +33,7 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.6 2016/07/07 09:32:02 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.7 2017/10/17 16:07:18 rjs Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -571,6 +571,7 @@ static int
sctp_detach(struct socket *so)
{
struct sctp_inpcb *inp;
+
inp = (struct sctp_inpcb *)so->so_pcb;
if (inp == 0)
return EINVAL;
@@ -685,16 +686,19 @@ static int
sctp_disconnect(struct socket *so)
{
struct sctp_inpcb *inp;
+ int s;
inp = (struct sctp_inpcb *)so->so_pcb;
if (inp == NULL) {
return (ENOTCONN);
}
+ s = splsoftnet();
SCTP_INP_RLOCK(inp);
if (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) {
if (LIST_EMPTY(&inp->sctp_asoc_list)) {
/* No connection */
SCTP_INP_RUNLOCK(inp);
+ splx(s);
return (0);
} else {
int some_on_streamwheel = 0;
@@ -704,6 +708,7 @@ sctp_disconnect(struct socket *so)
stcb = LIST_FIRST(&inp->sctp_asoc_list);
if (stcb == NULL) {
SCTP_INP_RUNLOCK(inp);
+ splx(s);
return (EINVAL);
}
asoc = &stcb->asoc;
@@ -730,6 +735,7 @@ sctp_disconnect(struct socket *so)
SCTP_INP_RUNLOCK(inp);
sctp_free_assoc(inp, stcb);
/* No unlock tcb assoc is gone */
+ splx(s);
return (0);
}
if (!TAILQ_EMPTY(&asoc->out_wheel)) {
@@ -787,12 +793,14 @@ sctp_disconnect(struct socket *so)
}
SCTP_TCB_UNLOCK(stcb);
SCTP_INP_RUNLOCK(inp);
+ splx(s);
return (0);
}
/* not reached */
} else {
/* UDP model does not support this */
SCTP_INP_RUNLOCK(inp);
+ splx(s);
return EOPNOTSUPP;
}
}