diff options
author | tuexen <tuexen@FreeBSD.org> | 2016-01-16 12:20:47 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2016-01-16 12:20:47 +0000 |
commit | b5c94b6d8f01b34ef05559b14b24dd7beee13af1 (patch) | |
tree | b85bd9b959d4951ac08934d6b38cdcdc281b94eb /sys/netinet | |
parent | 8553fd695466577a4971c5c4bb56ae899fcf4be4 (diff) | |
download | FreeBSD-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.c | 4 | ||||
-rw-r--r-- | sys/netinet/sctp_output.c | 15 | ||||
-rw-r--r-- | sys/netinet/sctp_output.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_usrreq.c | 3 |
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); |