Author: tuexen
Date: Sun Aug  3 14:10:10 2014
New Revision: 269475
URL: http://svnweb.freebsd.org/changeset/base/269475

Log:
  Add SCTP socket option SCTP_NRSACK_SUPPORTED to control the
  NRSACK extension. The default will still be off, since it
  it not an RFC (yet).
  Changing the sysctl name will be in a separate commit.
  
  MFC after: 1 week

Modified:
  head/lib/libc/net/sctp_sys_calls.c
  head/sys/netinet/sctp.h
  head/sys/netinet/sctp_input.c
  head/sys/netinet/sctp_output.c
  head/sys/netinet/sctp_pcb.c
  head/sys/netinet/sctp_pcb.h
  head/sys/netinet/sctp_peeloff.c
  head/sys/netinet/sctp_structs.h
  head/sys/netinet/sctp_sysctl.c
  head/sys/netinet/sctp_sysctl.h
  head/sys/netinet/sctp_usrreq.c
  head/sys/netinet/sctputil.c

Modified: head/lib/libc/net/sctp_sys_calls.c
==============================================================================
--- head/lib/libc/net/sctp_sys_calls.c  Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/lib/libc/net/sctp_sys_calls.c  Sun Aug  3 14:10:10 2014        
(r269475)
@@ -356,6 +356,9 @@ sctp_opt_info(int sd, sctp_assoc_t id, i
        case SCTP_PR_SUPPORTED:
                ((struct sctp_assoc_value *)arg)->assoc_id = id;
                break;
+       case SCTP_NRSACK_SUPPORTED:
+               ((struct sctp_assoc_value *)arg)->assoc_id = id;
+               break;
        case SCTP_MAX_BURST:
                ((struct sctp_assoc_value *)arg)->assoc_id = id;
                break;

Modified: head/sys/netinet/sctp.h
==============================================================================
--- head/sys/netinet/sctp.h     Sun Aug  3 13:07:25 2014        (r269474)
+++ head/sys/netinet/sctp.h     Sun Aug  3 14:10:10 2014        (r269475)
@@ -123,6 +123,7 @@ struct sctp_paramhdr {
 #define SCTP_REMOTE_UDP_ENCAPS_PORT     0x00000024
 #define SCTP_ECN_SUPPORTED              0x00000025
 #define SCTP_PR_SUPPORTED               0x00000026
+#define SCTP_NRSACK_SUPPORTED           0x00000027
 
 /*
  * read-only options

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c       Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_input.c       Sun Aug  3 14:10:10 2014        
(r269475)
@@ -2787,6 +2787,7 @@ sctp_handle_cookie_echo(struct mbuf *m, 
                        inp->sctp_cmt_on_off = (*inp_p)->sctp_cmt_on_off;
                        inp->ecn_supported = (*inp_p)->ecn_supported;
                        inp->prsctp_supported = (*inp_p)->prsctp_supported;
+                       inp->nrsack_supported = (*inp_p)->nrsack_supported;
                        inp->partial_delivery_point = 
(*inp_p)->partial_delivery_point;
                        inp->sctp_context = (*inp_p)->sctp_context;
                        inp->local_strreset_support = 
(*inp_p)->local_strreset_support;
@@ -4911,8 +4912,7 @@ process_control_chunks:
                                        SCTPDBG(SCTP_DEBUG_INDATA1, "No stcb 
when processing NR-SACK chunk\n");
                                        break;
                                }
-                               if ((stcb->asoc.sctp_nr_sack_on_off == 0) ||
-                                   (stcb->asoc.peer_supports_nr_sack == 0)) {
+                               if (stcb->asoc.nrsack_supported == 0) {
                                        goto unknown_chunk;
                                }
                                if (chk_length < sizeof(struct 
sctp_nr_sack_chunk)) {

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c      Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_output.c      Sun Aug  3 14:10:10 2014        
(r269475)
@@ -4822,7 +4822,7 @@ sctp_send_initiate(struct sctp_inpcb *in
        if (!SCTP_BASE_SYSCTL(sctp_auth_disable)) {
                pr_supported->chunk_types[num_ext++] = SCTP_AUTHENTICATION;
        }
-       if (stcb->asoc.sctp_nr_sack_on_off == 1) {
+       if (stcb->asoc.nrsack_supported == 1) {
                pr_supported->chunk_types[num_ext++] = SCTP_NR_SELECTIVE_ACK;
        }
        parameter_len = (uint16_t) sizeof(struct 
sctp_supported_chunk_types_param) + num_ext;
@@ -5925,7 +5925,8 @@ do_a_abort:
        if (!SCTP_BASE_SYSCTL(sctp_auth_disable)) {
                pr_supported->chunk_types[num_ext++] = SCTP_AUTHENTICATION;
        }
-       if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off)) {
+       if (((asoc != NULL) && (asoc->nrsack_supported == 1)) ||
+           ((asoc == NULL) && (inp->nrsack_supported == 1))) {
                pr_supported->chunk_types[num_ext++] = SCTP_NR_SELECTIVE_ACK;
        }
        parameter_len = (uint16_t) sizeof(struct 
sctp_supported_chunk_types_param) + num_ext;
@@ -10419,8 +10420,7 @@ sctp_send_sack(struct sctp_tcb *stcb, in
        uint8_t type;
        uint8_t tsn_map;
 
-       if ((stcb->asoc.sctp_nr_sack_on_off == 1) &&
-           (stcb->asoc.peer_supports_nr_sack == 1)) {
+       if (stcb->asoc.nrsack_supported == 1) {
                type = SCTP_NR_SELECTIVE_ACK;
        } else {
                type = SCTP_SELECTIVE_ACK;

Modified: head/sys/netinet/sctp_pcb.c
==============================================================================
--- head/sys/netinet/sctp_pcb.c Sun Aug  3 13:07:25 2014        (r269474)
+++ head/sys/netinet/sctp_pcb.c Sun Aug  3 14:10:10 2014        (r269475)
@@ -2485,6 +2485,7 @@ sctp_inpcb_alloc(struct socket *so, uint
        inp->sctp_cmt_on_off = SCTP_BASE_SYSCTL(sctp_cmt_on_off);
        inp->ecn_supported = (uint8_t) SCTP_BASE_SYSCTL(sctp_ecn_enable);
        inp->prsctp_supported = (uint8_t) SCTP_BASE_SYSCTL(sctp_pr_enable);
+       inp->nrsack_supported = (uint8_t) SCTP_BASE_SYSCTL(sctp_nrsack_enable);
        /* init the small hash table we use to track asocid <-> tcb */
        inp->sctp_asocidhash = SCTP_HASH_INIT(SCTP_STACK_VTAG_HASH_SIZE, 
&inp->hashasocidmark);
        if (inp->sctp_asocidhash == NULL) {
@@ -6084,6 +6085,7 @@ sctp_load_addresses_from_init(struct sct
        int got_random = 0, got_hmacs = 0, got_chklist = 0;
        uint8_t ecn_supported;
        uint8_t prsctp_supported;
+       uint8_t nrsack_supported;
 
 #ifdef INET
        struct sockaddr_in sin;
@@ -6115,6 +6117,7 @@ sctp_load_addresses_from_init(struct sct
        /* Turn off ECN until we get through all params */
        ecn_supported = 0;
        prsctp_supported = 0;
+       nrsack_supported = 0;
        TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
                /* mark all addresses that we have currently on the list */
                net->dest_state |= SCTP_ADDR_NOT_IN_ASSOC;
@@ -6454,7 +6457,6 @@ sctp_load_addresses_from_init(struct sct
                        stcb->asoc.peer_supports_asconf = 0;
                        stcb->asoc.peer_supports_pktdrop = 0;
                        stcb->asoc.peer_supports_strreset = 0;
-                       stcb->asoc.peer_supports_nr_sack = 0;
                        stcb->asoc.peer_supports_auth = 0;
                        pr_supported = (struct sctp_supported_chunk_types_param 
*)phdr;
                        num_ent = plen - sizeof(struct sctp_paramhdr);
@@ -6471,7 +6473,7 @@ sctp_load_addresses_from_init(struct sct
                                        stcb->asoc.peer_supports_pktdrop = 1;
                                        break;
                                case SCTP_NR_SELECTIVE_ACK:
-                                       stcb->asoc.peer_supports_nr_sack = 1;
+                                       nrsack_supported = 1;
                                        break;
                                case SCTP_STREAM_RESET:
                                        stcb->asoc.peer_supports_strreset = 1;
@@ -6616,6 +6618,7 @@ next_param:
        }
        stcb->asoc.ecn_supported &= ecn_supported;
        stcb->asoc.prsctp_supported &= prsctp_supported;
+       stcb->asoc.nrsack_supported &= nrsack_supported;
        /* validate authentication required parameters */
        if (got_random && got_hmacs) {
                stcb->asoc.peer_supports_auth = 1;

Modified: head/sys/netinet/sctp_pcb.h
==============================================================================
--- head/sys/netinet/sctp_pcb.h Sun Aug  3 13:07:25 2014        (r269474)
+++ head/sys/netinet/sctp_pcb.h Sun Aug  3 14:10:10 2014        (r269475)
@@ -408,6 +408,7 @@ struct sctp_inpcb {
        uint32_t sctp_cmt_on_off;
        uint8_t ecn_supported;
        uint8_t prsctp_supported;
+       uint8_t nrsack_supported;
        struct sctp_nonpad_sndrcvinfo def_send;
        /*-
         * These three are here for the sosend_dgram

Modified: head/sys/netinet/sctp_peeloff.c
==============================================================================
--- head/sys/netinet/sctp_peeloff.c     Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_peeloff.c     Sun Aug  3 14:10:10 2014        
(r269475)
@@ -120,6 +120,7 @@ sctp_do_peeloff(struct socket *head, str
        n_inp->sctp_cmt_on_off = inp->sctp_cmt_on_off;
        n_inp->ecn_supported = inp->ecn_supported;
        n_inp->prsctp_supported = inp->prsctp_supported;
+       n_inp->nrsack_supported = inp->nrsack_supported;
        n_inp->partial_delivery_point = inp->partial_delivery_point;
        n_inp->sctp_context = inp->sctp_context;
        n_inp->local_strreset_support = inp->local_strreset_support;

Modified: head/sys/netinet/sctp_structs.h
==============================================================================
--- head/sys/netinet/sctp_structs.h     Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_structs.h     Sun Aug  3 14:10:10 2014        
(r269475)
@@ -1153,14 +1153,13 @@ struct sctp_association {
        /* Flags whether an extension is supported or not */
        uint8_t ecn_supported;
        uint8_t prsctp_supported;
+       uint8_t nrsack_supported;
 
        /* Did the peer make the stream config (add out) request */
        uint8_t peer_req_out;
 
        /* flag to indicate if peer can do asconf */
        uint8_t peer_supports_asconf;
-       /* EY - flag to indicate if peer can do nr_sack */
-       uint8_t peer_supports_nr_sack;
        /* peer authentication support flag */
        uint8_t peer_supports_auth;
        /* stream resets are supported by the peer */
@@ -1197,8 +1196,6 @@ struct sctp_association {
        uint8_t sctp_cmt_on_off;
        uint8_t iam_blocking;
        uint8_t cookie_how[8];
-       /* EY 05/05/08 - NR_SACK variable */
-       uint8_t sctp_nr_sack_on_off;
        /* JRS 5/21/07 - CMT PF variable */
        uint8_t sctp_cmt_pf;
        uint8_t use_precise_time;

Modified: head/sys/netinet/sctp_sysctl.c
==============================================================================
--- head/sys/netinet/sctp_sysctl.c      Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_sysctl.c      Sun Aug  3 14:10:10 2014        
(r269475)
@@ -55,6 +55,7 @@ sctp_init_sysctls()
        SCTP_BASE_SYSCTL(sctp_multiple_asconfs) = 
SCTPCTL_MULTIPLEASCONFS_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_ecn_enable) = SCTPCTL_ECN_ENABLE_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_pr_enable) = SCTPCTL_PR_ENABLE_DEFAULT;
+       SCTP_BASE_SYSCTL(sctp_nrsack_enable) = SCTPCTL_NRSACK_ENABLE_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_strict_sacks) = SCTPCTL_STRICT_SACKS_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_peer_chunk_oh) = SCTPCTL_PEER_CHKOH_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_max_burst_default) = SCTPCTL_MAXBURST_DEFAULT;
@@ -85,8 +86,6 @@ sctp_init_sysctls()
        SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default) = 
SCTPCTL_INCOMING_STREAMS_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default) = 
SCTPCTL_OUTGOING_STREAMS_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_cmt_on_off) = SCTPCTL_CMT_ON_OFF_DEFAULT;
-       /* EY */
-       SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) = SCTPCTL_NR_SACK_ON_OFF_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_cmt_use_dac) = SCTPCTL_CMT_USE_DAC_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) = 
SCTPCTL_CWND_MAXBURST_DEFAULT;
        SCTP_BASE_SYSCTL(sctp_auth_disable) = SCTPCTL_AUTH_DISABLE_DEFAULT;
@@ -602,6 +601,7 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS)
                RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf), 
SCTPCTL_AUTOASCONF_MIN, SCTPCTL_AUTOASCONF_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_enable), 
SCTPCTL_ECN_ENABLE_MIN, SCTPCTL_ECN_ENABLE_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_pr_enable), 
SCTPCTL_PR_ENABLE_MIN, SCTPCTL_PR_ENABLE_MAX);
+               RANGECHK(SCTP_BASE_SYSCTL(sctp_nrsack_enable), 
SCTPCTL_NRSACK_ENABLE_MIN, SCTPCTL_NRSACK_ENABLE_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_sacks), 
SCTPCTL_STRICT_SACKS_MIN, SCTPCTL_STRICT_SACKS_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_peer_chunk_oh), 
SCTPCTL_PEER_CHKOH_MIN, SCTPCTL_PEER_CHKOH_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_max_burst_default), 
SCTPCTL_MAXBURST_MIN, SCTPCTL_MAXBURST_MAX);
@@ -632,8 +632,6 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS)
                RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default), 
SCTPCTL_INCOMING_STREAMS_MIN, SCTPCTL_INCOMING_STREAMS_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), 
SCTPCTL_OUTGOING_STREAMS_MIN, SCTPCTL_OUTGOING_STREAMS_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_on_off), 
SCTPCTL_CMT_ON_OFF_MIN, SCTPCTL_CMT_ON_OFF_MAX);
-               /* EY */
-               RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_sack_on_off), 
SCTPCTL_NR_SACK_ON_OFF_MIN, SCTPCTL_NR_SACK_ON_OFF_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_use_dac), 
SCTPCTL_CMT_USE_DAC_MIN, SCTPCTL_CMT_USE_DAC_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst), 
SCTPCTL_CWND_MAXBURST_MIN, SCTPCTL_CWND_MAXBURST_MAX);
                RANGECHK(SCTP_BASE_SYSCTL(sctp_auth_disable), 
SCTPCTL_AUTH_DISABLE_MIN, SCTPCTL_AUTH_DISABLE_MAX);
@@ -867,6 +865,10 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUT
     &SCTP_BASE_SYSCTL(sctp_pr_enable), 0, sysctl_sctp_check, "IU",
     SCTPCTL_PR_ENABLE_DESC);
 
+SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, nr_sack_on_off, CTLTYPE_UINT | 
CTLFLAG_RW,
+    &SCTP_BASE_SYSCTL(sctp_nrsack_enable), 0, sysctl_sctp_check, "IU",
+    SCTPCTL_NRSACK_ENABLE_DESC);
+
 SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, strict_sacks, CTLTYPE_UINT | 
CTLFLAG_RW,
     &SCTP_BASE_SYSCTL(sctp_strict_sacks), 0, sysctl_sctp_check, "IU",
     SCTPCTL_STRICT_SACKS_DESC);
@@ -988,10 +990,6 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUT
     &SCTP_BASE_SYSCTL(sctp_cmt_on_off), 0, sysctl_sctp_check, "IU",
     SCTPCTL_CMT_ON_OFF_DESC);
 
-SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, nr_sack_on_off, CTLTYPE_UINT | 
CTLFLAG_RW,
-    &SCTP_BASE_SYSCTL(sctp_nr_sack_on_off), 0, sysctl_sctp_check, "IU",
-    SCTPCTL_NR_SACK_ON_OFF_DESC);
-
 SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, cmt_use_dac, CTLTYPE_UINT | 
CTLFLAG_RW,
     &SCTP_BASE_SYSCTL(sctp_cmt_use_dac), 0, sysctl_sctp_check, "IU",
     SCTPCTL_CMT_USE_DAC_DESC);

Modified: head/sys/netinet/sctp_sysctl.h
==============================================================================
--- head/sys/netinet/sctp_sysctl.h      Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_sysctl.h      Sun Aug  3 14:10:10 2014        
(r269475)
@@ -46,6 +46,7 @@ struct sctp_sysctl {
        uint32_t sctp_multiple_asconfs;
        uint32_t sctp_ecn_enable;
        uint32_t sctp_pr_enable;
+       uint32_t sctp_nrsack_enable;
        uint32_t sctp_fr_max_burst_default;
        uint32_t sctp_strict_sacks;
        uint32_t sctp_peer_chunk_oh;
@@ -77,8 +78,6 @@ struct sctp_sysctl {
        uint32_t sctp_nr_outgoing_streams_default;
        uint32_t sctp_cmt_on_off;
        uint32_t sctp_cmt_use_dac;
-       /* EY 5/5/08 - nr_sack flag variable */
-       uint32_t sctp_nr_sack_on_off;
        uint32_t sctp_use_cwnd_based_maxburst;
        uint32_t sctp_auth_disable;
        uint32_t sctp_nat_friendly;
@@ -161,6 +160,13 @@ struct sctp_sysctl {
 #define SCTPCTL_PR_ENABLE_MAX          1
 #define SCTPCTL_PR_ENABLE_DEFAULT      1
 
+/* nrsack_enable: Enable NR_SACK */
+#define SCTPCTL_NRSACK_ENABLE_DESC     "Enable NR_SACK"
+#define SCTPCTL_NRSACK_ENABLE_MIN      0
+#define SCTPCTL_NRSACK_ENABLE_MAX      1
+#define SCTPCTL_NRSACK_ENABLE_DEFAULT  0
+
+
 /* strict_sacks: Enable SCTP Strict SACK checking */
 #define SCTPCTL_STRICT_SACKS_DESC      "Enable SCTP Strict SACK checking"
 #define SCTPCTL_STRICT_SACKS_MIN       0
@@ -348,12 +354,6 @@ struct sctp_sysctl {
 #define SCTPCTL_CMT_ON_OFF_MAX         SCTP_CMT_MAX
 #define SCTPCTL_CMT_ON_OFF_DEFAULT     SCTP_CMT_OFF
 
-/* EY - nr_sack_on_off: NR_SACK on/off flag */
-#define SCTPCTL_NR_SACK_ON_OFF_DESC    "NR_SACK on/off flag"
-#define SCTPCTL_NR_SACK_ON_OFF_MIN     0
-#define SCTPCTL_NR_SACK_ON_OFF_MAX     1
-#define SCTPCTL_NR_SACK_ON_OFF_DEFAULT 0
-
 /* cmt_use_dac: CMT DAC on/off flag */
 #define SCTPCTL_CMT_USE_DAC_DESC       "CMT DAC on/off flag"
 #define SCTPCTL_CMT_USE_DAC_MIN                0

Modified: head/sys/netinet/sctp_usrreq.c
==============================================================================
--- head/sys/netinet/sctp_usrreq.c      Sun Aug  3 13:07:25 2014        
(r269474)
+++ head/sys/netinet/sctp_usrreq.c      Sun Aug  3 14:10:10 2014        
(r269475)
@@ -3348,6 +3348,33 @@ flags_out:
                        }
                        break;
                }
+       case SCTP_NRSACK_SUPPORTED:
+               {
+                       struct sctp_assoc_value *av;
+
+                       SCTP_CHECK_AND_CAST(av, optval, struct 
sctp_assoc_value, *optsize);
+                       SCTP_FIND_STCB(inp, stcb, av->assoc_id);
+
+                       if (stcb) {
+                               av->assoc_value = stcb->asoc.nrsack_supported;
+                               SCTP_TCB_UNLOCK(stcb);
+                       } else {
+                               if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) 
||
+                                   (inp->sctp_flags & 
SCTP_PCB_FLAGS_IN_TCPPOOL) ||
+                                   (av->assoc_id == SCTP_FUTURE_ASSOC)) {
+                                       SCTP_INP_RLOCK(inp);
+                                       av->assoc_value = inp->nrsack_supported;
+                                       SCTP_INP_RUNLOCK(inp);
+                               } else {
+                                       SCTP_LTRACE_ERR_RET(inp, NULL, NULL, 
SCTP_FROM_SCTP_USRREQ, EINVAL);
+                                       error = EINVAL;
+                               }
+                       }
+                       if (error == 0) {
+                               *optsize = sizeof(struct sctp_assoc_value);
+                       }
+                       break;
+               }
        case SCTP_ENABLE_STREAM_RESET:
                {
                        struct sctp_assoc_value *av;
@@ -5969,6 +5996,35 @@ sctp_setopt(struct socket *so, int optna
                        }
                        break;
                }
+       case SCTP_NRSACK_SUPPORTED:
+               {
+                       struct sctp_assoc_value *av;
+
+                       SCTP_CHECK_AND_CAST(av, optval, struct 
sctp_assoc_value, optsize);
+                       SCTP_FIND_STCB(inp, stcb, av->assoc_id);
+
+                       if (stcb) {
+                               SCTP_LTRACE_ERR_RET(inp, NULL, NULL, 
SCTP_FROM_SCTP_USRREQ, EINVAL);
+                               error = EINVAL;
+                               SCTP_TCB_UNLOCK(stcb);
+                       } else {
+                               if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) 
||
+                                   (inp->sctp_flags & 
SCTP_PCB_FLAGS_IN_TCPPOOL) ||
+                                   (av->assoc_id == SCTP_FUTURE_ASSOC)) {
+                                       SCTP_INP_WLOCK(inp);
+                                       if (av->assoc_value == 0) {
+                                               inp->nrsack_supported = 0;
+                                       } else {
+                                               inp->nrsack_supported = 1;
+                                       }
+                                       SCTP_INP_WUNLOCK(inp);
+                               } else {
+                                       SCTP_LTRACE_ERR_RET(inp, NULL, NULL, 
SCTP_FROM_SCTP_USRREQ, EINVAL);
+                                       error = EINVAL;
+                               }
+                       }
+                       break;
+               }
        default:
                SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, 
ENOPROTOOPT);
                error = ENOPROTOOPT;

Modified: head/sys/netinet/sctputil.c
==============================================================================
--- head/sys/netinet/sctputil.c Sun Aug  3 13:07:25 2014        (r269474)
+++ head/sys/netinet/sctputil.c Sun Aug  3 14:10:10 2014        (r269475)
@@ -906,7 +906,7 @@ sctp_init_asoc(struct sctp_inpcb *inp, s
        asoc->sctp_cmt_on_off = inp->sctp_cmt_on_off;
        asoc->ecn_supported = inp->ecn_supported;
        asoc->prsctp_supported = inp->prsctp_supported;
-       asoc->sctp_nr_sack_on_off = (uint8_t) 
SCTP_BASE_SYSCTL(sctp_nr_sack_on_off);
+       asoc->nrsack_supported = inp->nrsack_supported;
        asoc->sctp_cmt_pf = (uint8_t) 0;
        asoc->sctp_frag_point = inp->sctp_frag_point;
        asoc->sctp_features = inp->sctp_features;
_______________________________________________
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