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
This commit is contained in:
parent
dbbb1f8a83
commit
fb7bbef5e1
@ -356,6 +356,9 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
|
||||
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;
|
||||
|
@ -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
|
||||
|
@ -2787,6 +2787,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
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 @@ __attribute__((noinline))
|
||||
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)) {
|
||||
|
@ -4822,7 +4822,7 @@ sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked
|
||||
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 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
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, int so_locked
|
||||
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;
|
||||
|
@ -2485,6 +2485,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
|
||||
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 sctp_tcb *stcb, struct mbuf *m,
|
||||
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 sctp_tcb *stcb, struct mbuf *m,
|
||||
/* 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 sctp_tcb *stcb, struct mbuf *m,
|
||||
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 sctp_tcb *stcb, struct mbuf *m,
|
||||
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 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
}
|
||||
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;
|
||||
|
@ -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
|
||||
|
@ -120,6 +120,7 @@ sctp_do_peeloff(struct socket *head, struct socket *so, sctp_assoc_t assoc_id)
|
||||
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;
|
||||
|
@ -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;
|
||||
|
@ -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_AUTO, pr_enable, CTLTYPE_UINT | CTLFLAG_RW,
|
||||
&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_AUTO, cmt_on_off, CTLTYPE_UINT | CTLFLAG_RW
|
||||
&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);
|
||||
|
@ -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
|
||||
|
@ -3348,6 +3348,33 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
}
|
||||
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 optname, void *optval, size_t optsize,
|
||||
}
|
||||
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;
|
||||
|
@ -906,7 +906,7 @@ sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user