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);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to