Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Jul 2015 14:09:04 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285837 - head/sys/netinet
Message-ID:  <201507241409.t6OE94PI020024@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Fri Jul 24 14:09:03 2015
New Revision: 285837
URL: https://svnweb.freebsd.org/changeset/base/285837

Log:
  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.
  
  MFC after:	3 weeks

Modified:
  head/sys/netinet/sctp_input.c
  head/sys/netinet/sctp_output.c
  head/sys/netinet/sctp_output.h
  head/sys/netinet/sctp_usrreq.c

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c	Fri Jul 24 09:20:02 2015	(r285836)
+++ head/sys/netinet/sctp_input.c	Fri Jul 24 14:09:03 2015	(r285837)
@@ -3764,7 +3764,7 @@ sctp_handle_stream_reset_response(struct
 		}
 	}
 	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
@@ -3957,6 +3957,7 @@ sctp_handle_str_reset_request_out(struct
 			memcpy(&liste->list_of_streams, req->list_of_streams, number_entries * sizeof(uint16_t));
 			TAILQ_INSERT_TAIL(&asoc->resetHead, liste, next_resp);
 			asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_IN_PROGRESS;
+			x
 		}
 		sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[0]);
 		asoc->str_reset_seq_in++;

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c	Fri Jul 24 09:20:02 2015	(r285836)
+++ head/sys/netinet/sctp_output.c	Fri Jul 24 14:09:03 2015	(r285837)
@@ -10104,7 +10104,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;
 		}
 	}
@@ -11839,7 +11839,7 @@ sctp_add_an_in_stream(struct sctp_tmit_c
 }
 
 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;
@@ -11865,7 +11865,7 @@ sctp_send_stream_reset_out_if_possible(s
 	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);
 	}
@@ -11892,7 +11892,7 @@ sctp_send_stream_reset_out_if_possible(s
 	} 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;
@@ -11901,6 +11901,10 @@ sctp_send_stream_reset_out_if_possible(s
 	    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);
 }
@@ -12101,6 +12105,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);
 }

Modified: head/sys/netinet/sctp_output.h
==============================================================================
--- head/sys/netinet/sctp_output.h	Fri Jul 24 09:20:02 2015	(r285836)
+++ head/sys/netinet/sctp_output.h	Fri Jul 24 14:09:03 2015	(r285837)
@@ -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 *,

Modified: head/sys/netinet/sctp_usrreq.c
==============================================================================
--- head/sys/netinet/sctp_usrreq.c	Fri Jul 24 09:20:02 2015	(r285836)
+++ head/sys/netinet/sctp_usrreq.c	Fri Jul 24 14:09:03 2015	(r285837)
@@ -4689,8 +4689,7 @@ sctp_setopt(struct socket *so, int optna
 				    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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507241409.t6OE94PI020024>