summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authortuexen <tuexen@FreeBSD.org>2016-01-16 12:20:47 +0000
committertuexen <tuexen@FreeBSD.org>2016-01-16 12:20:47 +0000
commitb5c94b6d8f01b34ef05559b14b24dd7beee13af1 (patch)
treeb85bd9b959d4951ac08934d6b38cdcdc281b94eb /sys/netinet
parent8553fd695466577a4971c5c4bb56ae899fcf4be4 (diff)
downloadFreeBSD-src-b5c94b6d8f01b34ef05559b14b24dd7beee13af1.zip
FreeBSD-src-b5c94b6d8f01b34ef05559b14b24dd7beee13af1.tar.gz
MFC r285837, r285838
Fix an issue with MAC OS locking and also optimize the case where we are sending back a stream-reset and a sack timer is running, in that case we should just send the SACK. Fix silly syntax error emacs chugged in for me.. gesh.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_input.c4
-rw-r--r--sys/netinet/sctp_output.c15
-rw-r--r--sys/netinet/sctp_output.h2
-rw-r--r--sys/netinet/sctp_usrreq.c3
4 files changed, 15 insertions, 9 deletions
diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c
index eb0dd87..a1caf75 100644
--- a/sys/netinet/sctp_input.c
+++ b/sys/netinet/sctp_input.c
@@ -3764,7 +3764,7 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb,
}
}
if (asoc->stream_reset_outstanding == 0) {
- sctp_send_stream_reset_out_if_possible(stcb);
+ sctp_send_stream_reset_out_if_possible(stcb, SCTP_SO_NOT_LOCKED);
}
return (0);
}
@@ -3832,7 +3832,7 @@ bad_boy:
} else {
sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO);
}
- sctp_send_stream_reset_out_if_possible(stcb);
+ sctp_send_stream_reset_out_if_possible(stcb, SCTP_SO_NOT_LOCKED);
}
static int
diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c
index 1b1a976..7764f3d 100644
--- a/sys/netinet/sctp_output.c
+++ b/sys/netinet/sctp_output.c
@@ -10120,7 +10120,7 @@ do_it_again:
sctp_fix_ecn_echo(asoc);
if (stcb->asoc.trigger_reset) {
- if (sctp_send_stream_reset_out_if_possible(stcb) == 0) {
+ if (sctp_send_stream_reset_out_if_possible(stcb, so_locked) == 0) {
goto do_it_again;
}
}
@@ -11855,7 +11855,7 @@ sctp_add_an_in_stream(struct sctp_tmit_chunk *chk,
}
int
-sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb)
+sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb, int so_locked)
{
struct sctp_association *asoc;
struct sctp_tmit_chunk *chk;
@@ -11881,7 +11881,7 @@ sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb)
chk->book_size_scale = 0;
chk->data = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA);
if (chk->data == NULL) {
- sctp_free_a_chunk(stcb, chk, SCTP_SO_LOCKED);
+ sctp_free_a_chunk(stcb, chk, so_locked);
SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM);
return (ENOMEM);
}
@@ -11908,7 +11908,7 @@ sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb)
} else {
m_freem(chk->data);
chk->data = NULL;
- sctp_free_a_chunk(stcb, chk, SCTP_SO_LOCKED);
+ sctp_free_a_chunk(stcb, chk, so_locked);
return (ENOENT);
}
asoc->str_reset = chk;
@@ -11917,6 +11917,10 @@ sctp_send_stream_reset_out_if_possible(struct sctp_tcb *stcb)
chk,
sctp_next);
asoc->ctrl_queue_cnt++;
+
+ if (stcb->asoc.send_sack) {
+ sctp_send_sack(stcb, so_locked);
+ }
sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb, chk->whoTo);
return (0);
}
@@ -12117,6 +12121,9 @@ skip_stuff:
chk,
sctp_next);
asoc->ctrl_queue_cnt++;
+ if (stcb->asoc.send_sack) {
+ sctp_send_sack(stcb, SCTP_SO_LOCKED);
+ }
sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb, chk->whoTo);
return (0);
}
diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h
index 8fd5659..d7222c4 100644
--- a/sys/netinet/sctp_output.h
+++ b/sys/netinet/sctp_output.h
@@ -181,7 +181,7 @@ void
sctp_add_stream_reset_result_tsn(struct sctp_tmit_chunk *,
uint32_t, uint32_t, uint32_t, uint32_t);
int
- sctp_send_stream_reset_out_if_possible(struct sctp_tcb *);
+ sctp_send_stream_reset_out_if_possible(struct sctp_tcb *, int);
int
sctp_send_str_reset_req(struct sctp_tcb *, uint16_t, uint16_t *,
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index 53a0a0a..76a2857 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -4689,8 +4689,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
strrst->srs_stream_list,
send_in, 0, 0, 0, 0, 0);
} else
- error = sctp_send_stream_reset_out_if_possible(stcb);
-
+ error = sctp_send_stream_reset_out_if_possible(stcb, SCTP_SO_LOCKED);
if (!error)
sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_STRRST_REQ, SCTP_SO_LOCKED);
OpenPOWER on IntegriCloud