summaryrefslogtreecommitdiff
path: root/sys/netinet/sctp_usrreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/sctp_usrreq.c')
-rw-r--r--sys/netinet/sctp_usrreq.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index f5a213566c88..9425797319d4 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -429,6 +429,7 @@ SYSCTL_PROC(_net_inet_sctp, OID_AUTO, getcred, CTLTYPE_OPAQUE | CTLFLAG_RW,
static void
sctp_abort(struct socket *so)
{
+ struct epoch_tracker et;
struct sctp_inpcb *inp;
uint32_t flags;
@@ -437,6 +438,7 @@ sctp_abort(struct socket *so)
return;
}
+ NET_EPOCH_ENTER(et);
sctp_must_try_again:
flags = inp->sctp_flags;
#ifdef SCTP_LOG_CLOSING
@@ -466,6 +468,7 @@ sctp_must_try_again:
goto sctp_must_try_again;
}
}
+ NET_EPOCH_EXIT(et);
return;
}
@@ -526,6 +529,7 @@ sctp_bind(struct socket *so, struct sockaddr *addr, struct thread *p)
void
sctp_close(struct socket *so)
{
+ struct epoch_tracker et;
struct sctp_inpcb *inp;
uint32_t flags;
@@ -536,6 +540,7 @@ sctp_close(struct socket *so)
/*
* Inform all the lower layer assoc that we are done.
*/
+ NET_EPOCH_ENTER(et);
sctp_must_try_again:
flags = inp->sctp_flags;
#ifdef SCTP_LOG_CLOSING
@@ -578,6 +583,7 @@ sctp_must_try_again:
goto sctp_must_try_again;
}
}
+ NET_EPOCH_EXIT(et);
return;
}
@@ -660,9 +666,12 @@ connected_type:
* definitions) but this is not advisable. This code is used
* by FreeBSD when sending a file with sendfile() though.
*/
+ struct epoch_tracker et;
int ret;
+ NET_EPOCH_ENTER(et);
ret = sctp_output(inp, inp->pkt, addr, inp->control, p, flags);
+ NET_EPOCH_EXIT(et);
inp->pkt = NULL;
inp->control = NULL;
return (ret);
@@ -689,6 +698,7 @@ sctp_disconnect(struct socket *so)
SCTP_INP_RUNLOCK(inp);
return (0);
} else {
+ struct epoch_tracker et;
struct sctp_association *asoc;
struct sctp_tcb *stcb;
@@ -706,6 +716,7 @@ sctp_disconnect(struct socket *so)
SCTP_INP_RUNLOCK(inp);
return (0);
}
+ NET_EPOCH_ENTER(et);
if (((so->so_options & SO_LINGER) &&
(so->so_linger == 0)) ||
(so->so_rcv.sb_cc > 0)) {
@@ -725,6 +736,7 @@ sctp_disconnect(struct socket *so)
(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_3);
/* No unlock tcb assoc is gone */
+ NET_EPOCH_EXIT(et);
return (0);
}
if (TAILQ_EMPTY(&asoc->send_queue) &&
@@ -799,12 +811,14 @@ sctp_disconnect(struct socket *so)
SCTP_INP_RUNLOCK(inp);
(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_5);
+ NET_EPOCH_EXIT(et);
return (0);
} else {
sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CLOSING, SCTP_SO_LOCKED);
}
}
soisdisconnecting(so);
+ NET_EPOCH_EXIT(et);
SCTP_TCB_UNLOCK(stcb);
SCTP_INP_RUNLOCK(inp);
return (0);
@@ -896,6 +910,7 @@ sctp_shutdown(struct socket *so)
* SHUT_WR or SHUT_RDWR. This means we put the shutdown flag
* against it.
*/
+ struct epoch_tracker et;
struct sctp_tcb *stcb;
struct sctp_association *asoc;
struct sctp_nets *netp;
@@ -935,6 +950,7 @@ sctp_shutdown(struct socket *so)
SCTP_INP_RUNLOCK(inp);
return (0);
}
+ NET_EPOCH_ENTER(et);
if (stcb->asoc.alternate) {
netp = stcb->asoc.alternate;
} else {
@@ -974,6 +990,7 @@ sctp_shutdown(struct socket *so)
SCTP_INP_RUNLOCK(inp);
sctp_abort_an_association(stcb->sctp_ep, stcb,
op_err, SCTP_SO_LOCKED);
+ NET_EPOCH_EXIT(et);
return (0);
}
}
@@ -985,6 +1002,7 @@ sctp_shutdown(struct socket *so)
sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CLOSING, SCTP_SO_LOCKED);
SCTP_TCB_UNLOCK(stcb);
SCTP_INP_RUNLOCK(inp);
+ NET_EPOCH_EXIT(et);
return (0);
}
}
@@ -6906,11 +6924,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
int
sctp_ctloutput(struct socket *so, struct sockopt *sopt)
{
+ struct epoch_tracker et;
+ struct sctp_inpcb *inp;
void *optval = NULL;
- size_t optsize = 0;
void *p;
+ size_t optsize = 0;
int error = 0;
- struct sctp_inpcb *inp;
if ((sopt->sopt_level == SOL_SOCKET) &&
(sopt->sopt_name == SO_SETFIB)) {
@@ -6957,7 +6976,9 @@ sctp_ctloutput(struct socket *so, struct sockopt *sopt)
}
p = (void *)sopt->sopt_td;
if (sopt->sopt_dir == SOPT_SET) {
+ NET_EPOCH_ENTER(et);
error = sctp_setopt(so, sopt->sopt_name, optval, optsize, p);
+ NET_EPOCH_EXIT(et);
} else if (sopt->sopt_dir == SOPT_GET) {
error = sctp_getopt(so, sopt->sopt_name, optval, &optsize, p);
} else {
@@ -6978,6 +6999,7 @@ out:
static int
sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
{
+ struct epoch_tracker et;
int error = 0;
int create_lock_on = 0;
uint32_t vrf_id;
@@ -7037,7 +7059,7 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
SCTP_INP_INCR_REF(inp);
SCTP_ASOC_CREATE_LOCK(inp);
create_lock_on = 1;
-
+ NET_EPOCH_ENTER(et);
if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) ||
(inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) {
@@ -7122,10 +7144,10 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
sctp_send_initiate(inp, stcb, SCTP_SO_LOCKED);
SCTP_TCB_UNLOCK(stcb);
out_now:
+ NET_EPOCH_EXIT(et);
if (create_lock_on) {
SCTP_ASOC_CREATE_UNLOCK(inp);
}
-
SCTP_INP_DECR_REF(inp);
return (error);
}