Whitespace changes due to changes in ident.
This commit is contained in:
parent
7fb935da15
commit
0053ed28ff
@ -277,6 +277,7 @@ sctp_asconf_del_remote_addrs_except(struct sctp_tcb *stcb, struct sockaddr *src)
|
||||
/* not found */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* delete all destination addresses except the source */
|
||||
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||
if (net != src_net) {
|
||||
@ -383,6 +384,7 @@ sctp_process_asconf_delete_ip(struct sockaddr *src,
|
||||
aparam_length);
|
||||
return (m_reply);
|
||||
}
|
||||
|
||||
/* if deleting 0.0.0.0/::0, delete all addresses except src addr */
|
||||
if (zero_address && SCTP_BASE_SYSCTL(sctp_nat_friendly)) {
|
||||
result = sctp_asconf_del_remote_addrs_except(stcb, src);
|
||||
@ -401,6 +403,7 @@ sctp_process_asconf_delete_ip(struct sockaddr *src,
|
||||
}
|
||||
return (m_reply);
|
||||
}
|
||||
|
||||
/* delete the address */
|
||||
result = sctp_del_remote_addr(stcb, sa);
|
||||
/*
|
||||
@ -616,6 +619,7 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset,
|
||||
serial_num, asoc->asconf_seq_in + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* it's the expected "next" sequence number, so process it */
|
||||
asoc->asconf_seq_in = serial_num; /* update sequence */
|
||||
/* get length of all the param's in the ASCONF */
|
||||
@ -640,6 +644,7 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset,
|
||||
SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asconf_ack), ack);
|
||||
}
|
||||
}
|
||||
|
||||
m_ack = sctp_get_mbuf_for_msg(sizeof(struct sctp_asconf_ack_chunk), 0,
|
||||
M_NOWAIT, 1, MT_DATA);
|
||||
if (m_ack == NULL) {
|
||||
@ -974,6 +979,7 @@ sctp_assoc_immediate_retrans(struct sctp_tcb *stcb, struct sctp_nets *dstnet)
|
||||
if (stcb->asoc.deleted_primary == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TAILQ_EMPTY(&stcb->asoc.sent_queue)) {
|
||||
SCTPDBG(SCTP_DEBUG_ASCONF1, "assoc_immediate_retrans: Deleted primary is ");
|
||||
SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, &stcb->asoc.deleted_primary->ro._l_addr.sa);
|
||||
@ -1077,6 +1083,7 @@ sctp_path_check_and_react(struct sctp_tcb *stcb, struct sctp_ifa *newifa)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Multiple local addresses exsist in the association. */
|
||||
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||
/* clear any cached route and source address */
|
||||
@ -1323,6 +1330,7 @@ sctp_asconf_queue_add(struct sctp_tcb *stcb, struct sctp_ifa *ifa,
|
||||
if (stcb->asoc.asconf_supported == 0) {
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* if this is deleting the last address from the assoc, mark it as
|
||||
* pending.
|
||||
@ -1343,6 +1351,7 @@ sctp_asconf_queue_add(struct sctp_tcb *stcb, struct sctp_ifa *ifa,
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* queue an asconf parameter */
|
||||
status = sctp_asconf_queue_mgmt(stcb, ifa, type);
|
||||
|
||||
@ -1364,6 +1373,7 @@ sctp_asconf_queue_add(struct sctp_tcb *stcb, struct sctp_ifa *ifa,
|
||||
stcb->asoc.asconf_addr_del_pending = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (pending_delete_queued) {
|
||||
struct sctp_nets *net;
|
||||
|
||||
@ -1388,6 +1398,7 @@ sctp_asconf_queue_add(struct sctp_tcb *stcb, struct sctp_ifa *ifa,
|
||||
SCTP_FROM_SCTP_ASCONF,
|
||||
__LINE__);
|
||||
}
|
||||
|
||||
/* queue in an advisory set primary too */
|
||||
(void)sctp_asconf_queue_mgmt(stcb, ifa, SCTP_SET_PRIM_ADDR);
|
||||
/* let caller know we should send this out immediately */
|
||||
@ -1685,11 +1696,13 @@ sctp_handle_asconf_ack(struct mbuf *m, int offset,
|
||||
serial_num, asoc->asconf_seq_out_acked + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (serial_num == asoc->asconf_seq_out - 1) {
|
||||
/* stop our timer */
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_ASCONF, stcb->sctp_ep, stcb, net,
|
||||
SCTP_FROM_SCTP_ASCONF + SCTP_LOC_5);
|
||||
}
|
||||
|
||||
/* process the ASCONF-ACK contents */
|
||||
ack_length = ntohs(cp->ch.chunk_length) -
|
||||
sizeof(struct sctp_asconf_ack_chunk);
|
||||
@ -2058,6 +2071,7 @@ sctp_asconf_iterator_ep_end(struct sctp_inpcb *inp, void *ptr, uint32_t val SCTP
|
||||
laddr->action = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
} else if (l->action == SCTP_DEL_IP_ADDRESS) {
|
||||
LIST_FOREACH_SAFE(laddr, &inp->sctp_addr_list, sctp_nxt_addr, nladdr) {
|
||||
@ -2091,6 +2105,7 @@ sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
if (ifa->vrf_id != stcb->asoc.vrf_id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Same checks again for assoc */
|
||||
switch (ifa->address.sa.sa_family) {
|
||||
#ifdef INET6
|
||||
@ -2281,6 +2296,7 @@ sctp_set_primary_ip_address_sa(struct sctp_tcb *stcb, struct sockaddr *sa)
|
||||
/* Invalid address */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* queue an ASCONF:SET_PRIM_ADDR to be sent */
|
||||
if (!sctp_asconf_queue_add(stcb, ifa, SCTP_SET_PRIM_ADDR)) {
|
||||
/* set primary queuing succeeded */
|
||||
@ -2359,11 +2375,13 @@ sctp_is_addr_pending(struct sctp_tcb *stcb, struct sctp_ifa *sctp_ifa)
|
||||
SCTPDBG(SCTP_DEBUG_ASCONF1, "is_addr_pending: param length(%u) too short\n", param_length);
|
||||
break;
|
||||
}
|
||||
|
||||
aph = (struct sctp_asconf_paramhdr *)sctp_m_getptr(chk->data, offset, param_length, aparam_buf);
|
||||
if (aph == NULL) {
|
||||
SCTPDBG(SCTP_DEBUG_ASCONF1, "is_addr_pending: couldn't get entire param\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ph = (struct sctp_paramhdr *)(aph + 1);
|
||||
if (sctp_addr_match(ph, &sctp_ifa->address.sa) != 0) {
|
||||
switch (param_type) {
|
||||
@ -2378,6 +2396,7 @@ sctp_is_addr_pending(struct sctp_tcb *stcb, struct sctp_ifa *sctp_ifa)
|
||||
}
|
||||
last_param_type = param_type;
|
||||
}
|
||||
|
||||
offset += SCTP_SIZE32(param_length);
|
||||
if (offset >= asconf_limit) {
|
||||
/* no more data in the mbuf chain */
|
||||
@ -2461,6 +2480,7 @@ sctp_find_valid_localaddr(struct sctp_tcb *stcb, int addr_locked)
|
||||
if (sctp_ifa->localifa_flags & SCTP_ADDR_IFA_UNUSEABLE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
sin6 = &sctp_ifa->address.sin6;
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
|
||||
/*
|
||||
@ -2836,6 +2856,7 @@ sctp_process_initack_addresses(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next_addr:
|
||||
/*
|
||||
* Sanity check: Make sure the length isn't 0, otherwise
|
||||
@ -3370,6 +3391,7 @@ sctp_asconf_send_nat_state_update(struct sctp_tcb *stcb,
|
||||
if (vrf == NULL) {
|
||||
goto skip_rest;
|
||||
}
|
||||
|
||||
SCTP_IPI_ADDR_RLOCK();
|
||||
LIST_FOREACH(sctp_ifnp, &vrf->ifnlist, next_ifn) {
|
||||
LIST_FOREACH(sctp_ifap, &sctp_ifnp->ifalist, next_ifa) {
|
||||
|
@ -1309,6 +1309,7 @@ sctp_auth_setactivekey(struct sctp_tcb *stcb, uint16_t keyid)
|
||||
/* can't reactivate a deactivated key with other refcounts */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* set the (new) active key */
|
||||
stcb->asoc.authinfo.active_keyid = keyid;
|
||||
/* reset the deactivated flag */
|
||||
@ -1363,6 +1364,7 @@ sctp_deact_sharedkey(struct sctp_tcb *stcb, uint16_t keyid)
|
||||
sctp_ulp_notify(SCTP_NOTIFY_AUTH_FREE_KEY, stcb, keyid, 0,
|
||||
SCTP_SO_LOCKED);
|
||||
}
|
||||
|
||||
/* mark the key as deactivated */
|
||||
skey->deactivated = 1;
|
||||
|
||||
@ -1582,6 +1584,7 @@ sctp_fill_hmac_digest_m(struct mbuf *m, uint32_t auth_offset,
|
||||
"Assoc Key");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* set in the active key id */
|
||||
auth->shared_key_id = htons(keyid);
|
||||
|
||||
@ -1769,6 +1772,7 @@ sctp_notify_authentication(struct sctp_tcb *stcb, uint32_t indication,
|
||||
/* If the socket is gone we are out of here */
|
||||
return;
|
||||
}
|
||||
|
||||
if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_AUTHEVNT))
|
||||
/* event not enabled */
|
||||
return;
|
||||
@ -1929,6 +1933,7 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
if (num_chunks)
|
||||
got_chklist = 1;
|
||||
}
|
||||
|
||||
offset += SCTP_SIZE32(plen);
|
||||
if (offset >= limit) {
|
||||
break;
|
||||
@ -2023,6 +2028,7 @@ sctp_initialize_auth_params(struct sctp_inpcb *inp, struct sctp_tcb *stcb)
|
||||
new_key->key[keylen++] = i;
|
||||
}
|
||||
}
|
||||
|
||||
/* append in the HMACs */
|
||||
ph = (struct sctp_paramhdr *)(new_key->key + keylen);
|
||||
ph->param_type = htons(SCTP_HMAC_LIST);
|
||||
|
@ -305,10 +305,12 @@ sctp_addr_change(struct ifaddr *ifa, int cmd)
|
||||
SCTP_BASE_VAR(first_time) = 1;
|
||||
sctp_init_ifns_for_vrf(SCTP_DEFAULT_VRFID);
|
||||
}
|
||||
|
||||
if ((cmd != RTM_ADD) && (cmd != RTM_DELETE)) {
|
||||
/* don't know what to do with this */
|
||||
return;
|
||||
}
|
||||
|
||||
if (ifa->ifa_addr == NULL) {
|
||||
return;
|
||||
}
|
||||
|
@ -131,6 +131,7 @@ sctp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
t_ucwnd_sbw = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*-
|
||||
* CMT fast recovery code. Need to debug. ((sctp_cmt_on_off > 0) &&
|
||||
* (net->fast_retran_loss_recovery == 0)))
|
||||
@ -1119,6 +1120,7 @@ sctp_cwnd_update_after_ecn_echo_common(struct sctp_tcb *stcb, struct sctp_nets *
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd), SCTP_CWND_LOG_FROM_SAT);
|
||||
}
|
||||
|
||||
}
|
||||
SCTP_STAT_INCR(sctps_ecnereducedcwnd);
|
||||
} else {
|
||||
@ -1935,6 +1937,7 @@ measure_achieved_throughput(struct sctp_nets *net)
|
||||
net->cc_mod.htcp_ca.lasttime = now;
|
||||
return;
|
||||
}
|
||||
|
||||
net->cc_mod.htcp_ca.bytecount += net->net_ack;
|
||||
if ((net->cc_mod.htcp_ca.bytecount >= net->cwnd - (((net->cc_mod.htcp_ca.alpha >> 7) ? (net->cc_mod.htcp_ca.alpha >> 7) : 1) * net->mtu)) &&
|
||||
(now - net->cc_mod.htcp_ca.lasttime >= net->cc_mod.htcp_ca.minRTT) &&
|
||||
@ -1971,6 +1974,7 @@ htcp_beta_update(struct htcp *ca, uint32_t minRTT, uint32_t maxRTT)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (ca->modeswitch && minRTT > (uint32_t)MSEC_TO_TICKS(10) && maxRTT) {
|
||||
ca->beta = (minRTT << 7) / maxRTT;
|
||||
if (ca->beta < BETA_MIN)
|
||||
@ -1994,6 +1998,7 @@ htcp_alpha_update(struct htcp *ca)
|
||||
diff -= hz;
|
||||
factor = 1 + (10 * diff + ((diff / 2) * (diff / 2) / hz)) / hz;
|
||||
}
|
||||
|
||||
if (use_rtt_scaling && minRTT) {
|
||||
uint32_t scale = (hz << 3) / (10 * minRTT);
|
||||
|
||||
@ -2003,6 +2008,7 @@ htcp_alpha_update(struct htcp *ca)
|
||||
if (!factor)
|
||||
factor = 1;
|
||||
}
|
||||
|
||||
ca->alpha = 2 * factor * ((1 << 7) - ca->beta);
|
||||
if (!ca->alpha)
|
||||
ca->alpha = ALPHA_BASE;
|
||||
@ -2057,12 +2063,14 @@ htcp_cong_avoid(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
sctp_log_cwnd(stcb, net, net->mtu,
|
||||
SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
|
||||
} else {
|
||||
net->cwnd += net->net_ack;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->net_ack,
|
||||
SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
|
||||
}
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
} else {
|
||||
|
@ -90,6 +90,7 @@ sctp_calc_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
|
||||
if (stcb->sctp_socket == NULL) {
|
||||
return (calc);
|
||||
}
|
||||
|
||||
KASSERT(asoc->cnt_on_reasm_queue > 0 || asoc->size_on_reasm_queue == 0,
|
||||
("size_on_reasm_queue is %u", asoc->size_on_reasm_queue));
|
||||
KASSERT(asoc->cnt_on_all_streams > 0 || asoc->size_on_all_streams == 0,
|
||||
@ -115,6 +116,7 @@ sctp_calc_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
|
||||
/* out of space */
|
||||
return (calc);
|
||||
}
|
||||
|
||||
/* what is the overhead of all these rwnd's */
|
||||
calc = sctp_sbspace_sub(calc, stcb->asoc.my_rwnd_control_len);
|
||||
/*
|
||||
@ -185,6 +187,7 @@ sctp_build_ctl_nchunk(struct sctp_inpcb *inp, struct sctp_sndrcvinfo *sinfo)
|
||||
/* user does not want any ancillary data */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
len = 0;
|
||||
if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO)) {
|
||||
len += CMSG_SPACE(sizeof(struct sctp_rcvinfo));
|
||||
@ -1044,6 +1047,7 @@ place_chunk:
|
||||
SCTP_FROM_SCTP_INDATA + SCTP_LOC_5);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
if (inserted == 0) {
|
||||
/* Its at the end */
|
||||
@ -2138,6 +2142,7 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
control = NULL;
|
||||
goto finish_express_del;
|
||||
}
|
||||
|
||||
/* Now will we need a chunk too? */
|
||||
if ((chk_flags & SCTP_DATA_NOT_FRAG) != SCTP_DATA_NOT_FRAG) {
|
||||
sctp_alloc_a_chunk(stcb, chk);
|
||||
@ -3096,6 +3101,7 @@ sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1
|
||||
tp1->do_rtt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (tp1->sent <= SCTP_DATAGRAM_RESEND) {
|
||||
if (SCTP_TSN_GT(tp1->rec.data.tsn,
|
||||
@ -3361,6 +3367,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->this_sack_highest_gap) &&
|
||||
!(accum_moved && asoc->fast_retran_loss_recovery)) {
|
||||
@ -3596,6 +3603,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
tp1);
|
||||
}
|
||||
}
|
||||
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) {
|
||||
sctp_log_rwnd(SCTP_INCREASE_PEER_RWND,
|
||||
asoc->peers_rwnd, tp1->send_size, SCTP_BASE_SYSCTL(sctp_peer_chunk_oh));
|
||||
@ -3677,6 +3685,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
tp1->whoTo->find_pseudo_cumack = 1;
|
||||
tp1->whoTo->find_rtx_pseudo_cumack = 1;
|
||||
}
|
||||
|
||||
} else { /* CMT is OFF */
|
||||
|
||||
#ifdef SCTP_FR_TO_ALTERNATE
|
||||
@ -3965,6 +3974,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack,
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* First setup for CC stuff */
|
||||
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
|
||||
if (SCTP_TSN_GT(cumack, net->cwr_window_tsn)) {
|
||||
@ -4230,6 +4240,7 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack,
|
||||
asoc->total_flight = 0;
|
||||
asoc->total_flight_count = 0;
|
||||
}
|
||||
|
||||
/* RWND update */
|
||||
asoc->peers_rwnd = sctp_sbspace_sub(rwnd,
|
||||
(uint32_t)(asoc->total_flight + (asoc->total_flight_count * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))));
|
||||
@ -4482,6 +4493,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup,
|
||||
sctp_misc_ints(SCTP_SACK_LOG_NORMAL, cum_ack,
|
||||
rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd);
|
||||
}
|
||||
|
||||
old_rwnd = stcb->asoc.peers_rwnd;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
|
||||
sctp_misc_ints(SCTP_THRESHOLD_CLEAR,
|
||||
@ -4553,6 +4565,7 @@ hopeless_peer:
|
||||
/* acking something behind */
|
||||
return;
|
||||
}
|
||||
|
||||
/* update the Rwnd of the peer */
|
||||
if (TAILQ_EMPTY(&asoc->sent_queue) &&
|
||||
TAILQ_EMPTY(&asoc->send_queue) &&
|
||||
@ -4606,6 +4619,7 @@ hopeless_peer:
|
||||
if (stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) {
|
||||
(*stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) (stcb, net);
|
||||
}
|
||||
|
||||
/*
|
||||
* CMT: SFR algo (and HTNA) - this_sack_highest_newack has
|
||||
* to be greater than the cumack. Also reset saw_newack to 0
|
||||
@ -4841,6 +4855,7 @@ hopeless_peer:
|
||||
#endif
|
||||
asoc->total_flight = 0;
|
||||
}
|
||||
|
||||
/* sa_ignore NO_NULL_CHK */
|
||||
if ((wake_him) && (stcb->sctp_socket)) {
|
||||
#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
|
||||
@ -4945,6 +4960,7 @@ hopeless_peer:
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb,
|
||||
0, (void *)net, SCTP_SO_NOT_LOCKED);
|
||||
}
|
||||
|
||||
if (net == stcb->asoc.primary_destination) {
|
||||
if (stcb->asoc.alternate) {
|
||||
/*
|
||||
@ -4955,6 +4971,7 @@ hopeless_peer:
|
||||
stcb->asoc.alternate = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (net->dest_state & SCTP_ADDR_PF) {
|
||||
net->dest_state &= ~SCTP_ADDR_PF;
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT,
|
||||
@ -4977,6 +4994,7 @@ hopeless_peer:
|
||||
}
|
||||
asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery);
|
||||
}
|
||||
|
||||
if (TAILQ_EMPTY(&asoc->sent_queue)) {
|
||||
/* nothing left in-flight */
|
||||
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
|
||||
@ -4990,6 +5008,7 @@ hopeless_peer:
|
||||
asoc->total_flight = 0;
|
||||
asoc->total_flight_count = 0;
|
||||
}
|
||||
|
||||
/**********************************/
|
||||
/* Now what about shutdown issues */
|
||||
/**********************************/
|
||||
@ -5124,6 +5143,7 @@ hopeless_peer:
|
||||
if (asoc->peers_rwnd > old_rwnd) {
|
||||
win_probe_recovery = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we must setup so we have a timer up for anyone with
|
||||
* outstanding data.
|
||||
|
@ -99,8 +99,7 @@ void
|
||||
sctp_handle_forward_tsn(struct sctp_tcb *,
|
||||
struct sctp_forward_tsn_chunk *, int *, struct mbuf *, int);
|
||||
|
||||
struct sctp_tmit_chunk *
|
||||
sctp_try_advance_peer_ack_point(struct sctp_tcb *, struct sctp_association *);
|
||||
struct sctp_tmit_chunk *sctp_try_advance_peer_ack_point(struct sctp_tcb *, struct sctp_association *);
|
||||
|
||||
void sctp_service_queues(struct sctp_tcb *, struct sctp_association *);
|
||||
|
||||
|
@ -305,6 +305,7 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb)
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_CWND_MONITOR_ENABLE | SCTP_CWND_LOGGING_ENABLE)) {
|
||||
sctp_log_cwnd(stcb, lnet, 0, SCTP_CWND_INITIALIZATION);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
SCTP_TCB_SEND_LOCK(stcb);
|
||||
@ -491,6 +492,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
SCTP_FREE(param, SCTP_M_ASC_ADDR);
|
||||
}
|
||||
}
|
||||
|
||||
stcb->asoc.peer_hmac_id = sctp_negotiate_hmacid(stcb->asoc.peer_hmacs,
|
||||
stcb->asoc.local_hmacs);
|
||||
if (op_err) {
|
||||
@ -553,6 +555,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
}
|
||||
return (retval);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -570,6 +573,7 @@ sctp_handle_heartbeat_ack(struct sctp_heartbeat_chunk *cp,
|
||||
/* Invalid length */
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&store, 0, sizeof(store));
|
||||
switch (cp->heartbeat.hb_info.addr_family) {
|
||||
#ifdef INET
|
||||
@ -1716,6 +1720,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset,
|
||||
asoc->cookie_how[how_indx] = 5;
|
||||
return (stcb);
|
||||
}
|
||||
|
||||
if (ntohl(initack_cp->init.initiate_tag) != asoc->my_vtag &&
|
||||
ntohl(init_cp->init.initiate_tag) == asoc->peer_vtag &&
|
||||
cookie->tie_tag_my_vtag == 0 &&
|
||||
@ -2291,6 +2296,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset,
|
||||
stcb->asoc.authenticated = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* if we're doing ASCONFs, check to see if we have any new local
|
||||
* addresses that need to get added to the peer (eg. addresses
|
||||
@ -2588,6 +2594,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
(uint32_t)offset, cookie_offset, sig_offset);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* check the cookie timestamps to be sure it's not stale
|
||||
*/
|
||||
@ -2708,6 +2715,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cookie_len -= SCTP_SIGNATURE_SIZE;
|
||||
if (*stcb == NULL) {
|
||||
/* this is the "normal" case... get a new TCB */
|
||||
@ -2910,6 +2918,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_CONFIRMED,
|
||||
(*stcb), 0, (void *)netl, SCTP_SO_NOT_LOCKED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pull it from the incomplete queue and wake the
|
||||
* guy
|
||||
@ -2950,6 +2959,7 @@ sctp_handle_cookie_ack(struct sctp_cookie_ack_chunk *cp SCTP_UNUSED,
|
||||
if ((stcb == NULL) || (net == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
asoc = &stcb->asoc;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
|
||||
sctp_misc_ints(SCTP_THRESHOLD_CLEAR,
|
||||
@ -3016,6 +3026,7 @@ sctp_handle_cookie_ack(struct sctp_cookie_ack_chunk *cp SCTP_UNUSED,
|
||||
*/
|
||||
goto closed_socket;
|
||||
}
|
||||
|
||||
sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep,
|
||||
stcb, net);
|
||||
|
||||
@ -3794,6 +3805,7 @@ sctp_handle_stream_reset_response(struct sctp_tcb *stcb,
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
|
||||
sctp_log_map(0, 7, asoc->highest_tsn_inside_map, SCTP_MAP_SLIDE_RESULT);
|
||||
}
|
||||
|
||||
stcb->asoc.tsn_last_delivered = stcb->asoc.cumulative_tsn = stcb->asoc.highest_tsn_inside_map;
|
||||
stcb->asoc.mapping_array_base_tsn = ntohl(resp->senders_next_tsn);
|
||||
memset(stcb->asoc.mapping_array, 0, stcb->asoc.mapping_array_size);
|
||||
@ -4393,6 +4405,7 @@ sctp_handle_packet_dropped(struct sctp_pktdrop_chunk *cp,
|
||||
if (trunc_len > limit) {
|
||||
trunc_len = limit;
|
||||
}
|
||||
|
||||
/* now the chunks themselves */
|
||||
while ((ch != NULL) && (chlen >= sizeof(struct sctp_chunkhdr))) {
|
||||
desc.chunk_type = ch->chunk_type;
|
||||
@ -4652,6 +4665,7 @@ sctp_process_control(struct mbuf *m, int iphlen, int *offset, int length,
|
||||
*/
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
}
|
||||
|
||||
/* now go back and verify any auth chunk to be sure */
|
||||
if (auth_skipped && (stcb != NULL)) {
|
||||
struct sctp_auth_chunk *auth;
|
||||
@ -4751,6 +4765,7 @@ sctp_process_control(struct mbuf *m, int iphlen, int *offset, int length,
|
||||
sctp_handle_cookie_ack((struct sctp_cookie_ack_chunk *)ch, stcb,
|
||||
*netp);
|
||||
}
|
||||
|
||||
process_control_chunks:
|
||||
while (IS_SCTP_CONTROL(ch)) {
|
||||
/* validate chunk length */
|
||||
@ -4790,6 +4805,7 @@ process_control_chunks:
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
num_chunks++;
|
||||
/* Save off the last place we got a control from */
|
||||
if (stcb != NULL) {
|
||||
@ -5156,6 +5172,7 @@ process_control_chunks:
|
||||
goto abend;
|
||||
}
|
||||
}
|
||||
|
||||
if (netp != NULL) {
|
||||
struct sctp_tcb *locked_stcb;
|
||||
|
||||
@ -5328,6 +5345,7 @@ process_control_chunks:
|
||||
*offset = length;
|
||||
return (stcb);
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
int abort_flag = 0;
|
||||
|
||||
@ -5390,6 +5408,7 @@ process_control_chunks:
|
||||
*offset = length;
|
||||
return (stcb);
|
||||
}
|
||||
|
||||
if ((ch != NULL) && (stcb != NULL) && (netp != NULL) && (*netp != NULL)) {
|
||||
if (stcb->asoc.pktdrop_supported == 0) {
|
||||
goto unknown_chunk;
|
||||
@ -5652,6 +5671,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
vrf_id, port);
|
||||
goto out;
|
||||
}
|
||||
|
||||
}
|
||||
if (IS_SCTP_CONTROL(ch)) {
|
||||
/* process the control portion of the SCTP packet */
|
||||
@ -5727,6 +5747,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
*/
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* DATA chunk processing
|
||||
*/
|
||||
@ -5805,6 +5826,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
* process_data
|
||||
*/
|
||||
}
|
||||
|
||||
/* take care of ecn */
|
||||
if ((data_processed == 1) &&
|
||||
(stcb->asoc.ecn_supported == 1) &&
|
||||
@ -5812,6 +5834,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
/* Yep, we need to add a ECNE */
|
||||
sctp_send_ecn_echo(stcb, net, high_tsn);
|
||||
}
|
||||
|
||||
if ((data_processed == 0) && (fwd_tsn_seen)) {
|
||||
int was_a_gap;
|
||||
uint32_t highest_tsn;
|
||||
|
@ -185,6 +185,7 @@ sctp_allocate_vrf(int vrf_id)
|
||||
SCTP_FREE(vrf, SCTP_M_VRF);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Add it to the hash table */
|
||||
bucket = &SCTP_BASE_INFO(sctp_vrfhash)[(vrf_id & SCTP_BASE_INFO(hashvrfmark))];
|
||||
LIST_INSERT_HEAD(bucket, vrf, next_vrf);
|
||||
@ -736,6 +737,7 @@ sctp_del_addr_from_vrf(uint32_t vrf_id, struct sockaddr *addr,
|
||||
SCTPDBG(SCTP_DEBUG_PCB4, "Can't find vrf_id 0x%x\n", vrf_id);
|
||||
goto out_now;
|
||||
}
|
||||
|
||||
#ifdef SCTP_DEBUG
|
||||
SCTPDBG(SCTP_DEBUG_PCB4, "vrf_id 0x%x: deleting address:", vrf_id);
|
||||
SCTPDBG_ADDR(SCTP_DEBUG_PCB4, addr);
|
||||
@ -864,6 +866,7 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to)
|
||||
SCTP_IPI_ADDR_RUNLOCK();
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
|
||||
LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) {
|
||||
if ((loopback_scope == 0) &&
|
||||
@ -1025,6 +1028,7 @@ sctp_tcb_special_locate(struct sctp_inpcb **inp_p, struct sockaddr *from,
|
||||
if ((to == NULL) || (from == NULL)) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
switch (to->sa_family) {
|
||||
#ifdef INET
|
||||
case AF_INET:
|
||||
@ -1387,6 +1391,7 @@ sctp_findassociation_ep_addr(struct sctp_inpcb **inp_p, struct sockaddr *remote,
|
||||
if (locked_tcb) {
|
||||
atomic_subtract_int(&locked_tcb->asoc.refcnt, 1);
|
||||
}
|
||||
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
SCTP_INP_INFO_RUNLOCK();
|
||||
return (stcb);
|
||||
@ -2252,6 +2257,7 @@ sctp_findassociation_addr(struct mbuf *m, int offset,
|
||||
return (stcb);
|
||||
}
|
||||
}
|
||||
|
||||
if (inp_p) {
|
||||
stcb = sctp_findassociation_addr_sa(src, dst, inp_p, netp,
|
||||
1, vrf_id);
|
||||
@ -2847,6 +2853,7 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
sin = (struct sockaddr_in *)addr;
|
||||
lport = sin->sin_port;
|
||||
/*
|
||||
@ -3501,6 +3508,7 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
|
||||
LIST_REMOVE(inp, sctp_hash);
|
||||
inp->sctp_flags |= SCTP_PCB_FLAGS_UNBOUND;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is a timer running to kill us, forget it, since it may
|
||||
* have a contest on the INP lock.. which would cause us to die ...
|
||||
@ -3633,6 +3641,8 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
|
||||
(void)sctp_m_free(ip_pcb->inp_options);
|
||||
ip_pcb->inp_options = 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef INET6
|
||||
if (ip_pcb->inp_vflag & INP_IPV6) {
|
||||
struct in6pcb *in6p;
|
||||
@ -4860,6 +4870,7 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
|
||||
sctp_sorwakeup(inp, so);
|
||||
sctp_sowwakeup(inp, so);
|
||||
}
|
||||
|
||||
#ifdef SCTP_LOG_CLOSING
|
||||
sctp_log_closing(inp, stcb, 9);
|
||||
#endif
|
||||
@ -4918,6 +4929,7 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Make it invalid too, that way if its about to run it will abort
|
||||
* and return.
|
||||
@ -5335,6 +5347,7 @@ sctp_update_ep_vflag(struct sctp_inpcb *inp)
|
||||
__func__);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (laddr->ifa->localifa_flags & SCTP_BEING_DELETED) {
|
||||
continue;
|
||||
}
|
||||
@ -5748,6 +5761,7 @@ sctp_startup_mcore_threads(void)
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now start them all */
|
||||
CPU_FOREACH(cpu) {
|
||||
(void)kproc_create(sctp_mcore_thread,
|
||||
@ -6282,6 +6296,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb_tmp);
|
||||
}
|
||||
|
||||
if (stcb->asoc.state == 0) {
|
||||
/* the assoc was freed? */
|
||||
return (-12);
|
||||
@ -7001,6 +7016,7 @@ sctp_drain_mbufs(struct sctp_tcb *stcb)
|
||||
if (!fnd) {
|
||||
asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Question, should we go through the delivery queue? The
|
||||
* only reason things are on here is the app not reading OR
|
||||
|
@ -492,8 +492,7 @@ int SCTP6_ARE_ADDR_EQUAL(struct sockaddr_in6 *a, struct sockaddr_in6 *b);
|
||||
|
||||
void sctp_fill_pcbinfo(struct sctp_pcbinfo *);
|
||||
|
||||
struct sctp_ifn *
|
||||
sctp_find_ifn(void *ifn, uint32_t ifn_index);
|
||||
struct sctp_ifn *sctp_find_ifn(void *ifn, uint32_t ifn_index);
|
||||
|
||||
struct sctp_vrf *sctp_allocate_vrf(int vrfid);
|
||||
struct sctp_vrf *sctp_find_vrf(uint32_t vrfid);
|
||||
@ -563,8 +562,7 @@ sctp_findassociation_ep_addr(struct sctp_inpcb **,
|
||||
struct sockaddr *, struct sctp_nets **, struct sockaddr *,
|
||||
struct sctp_tcb *);
|
||||
|
||||
struct sctp_tcb *
|
||||
sctp_findasoc_ep_asocid_locked(struct sctp_inpcb *inp, sctp_assoc_t asoc_id, int want_lock);
|
||||
struct sctp_tcb *sctp_findasoc_ep_asocid_locked(struct sctp_inpcb *inp, sctp_assoc_t asoc_id, int want_lock);
|
||||
|
||||
struct sctp_tcb *
|
||||
sctp_findassociation_ep_asocid(struct sctp_inpcb *,
|
||||
|
@ -103,6 +103,7 @@ sctp_do_peeloff(struct socket *head, struct socket *so, sctp_assoc_t assoc_id)
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PEELOFF, ENOTCONN);
|
||||
return (ENOTCONN);
|
||||
}
|
||||
|
||||
state = SCTP_GET_STATE((&stcb->asoc));
|
||||
if ((state == SCTP_STATE_EMPTY) ||
|
||||
(state == SCTP_STATE_INUSE)) {
|
||||
@ -110,6 +111,7 @@ sctp_do_peeloff(struct socket *head, struct socket *so, sctp_assoc_t assoc_id)
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PEELOFF, ENOTCONN);
|
||||
return (ENOTCONN);
|
||||
}
|
||||
|
||||
n_inp = (struct sctp_inpcb *)so->so_pcb;
|
||||
n_inp->sctp_flags = (SCTP_PCB_FLAGS_UDPTYPE |
|
||||
SCTP_PCB_FLAGS_CONNECTED |
|
||||
|
@ -240,7 +240,8 @@ struct rtcc_cc {
|
||||
uint8_t use_dccc_ecn; /* Flag to enable DCCC ECN */
|
||||
uint8_t tls_needs_set; /* Flag to indicate we need to set tls 0 or 1
|
||||
* means set at send 2 not */
|
||||
uint8_t last_step_state;/* Last state if steady state stepdown is on */
|
||||
uint8_t last_step_state; /* Last state if steady state stepdown
|
||||
* is on */
|
||||
uint8_t rtt_set_this_sack; /* Flag saying this sack had RTT calc
|
||||
* on it */
|
||||
uint8_t last_inst_ind; /* Last saved inst indication */
|
||||
@ -331,8 +332,8 @@ struct sctp_nets {
|
||||
uint8_t dscp;
|
||||
|
||||
struct timeval start_time; /* time when this net was created */
|
||||
uint32_t marked_retrans;/* number or DATA chunks marked for timer
|
||||
* based retransmissions */
|
||||
uint32_t marked_retrans; /* number or DATA chunks marked for
|
||||
* timer based retransmissions */
|
||||
uint32_t marked_fastretrans;
|
||||
uint32_t heart_beat_delay; /* Heart Beat delay in ms */
|
||||
|
||||
|
@ -649,6 +649,7 @@ start_again:
|
||||
sctp_log_fr(chk->rec.data.tsn, chk->snd_count,
|
||||
0, SCTP_FR_T3_MARKED);
|
||||
}
|
||||
|
||||
if (chk->rec.data.chunk_was_revoked) {
|
||||
/* deflate the cwnd */
|
||||
chk->whoTo->cwnd -= chk->book_size;
|
||||
@ -715,6 +716,7 @@ start_again:
|
||||
/* we did not subtract the same things? */
|
||||
audit_tf = 1;
|
||||
}
|
||||
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
|
||||
sctp_log_fr(tsnfirst, tsnlast, num_mk, SCTP_FR_T3_TIMEOUT);
|
||||
}
|
||||
@ -789,6 +791,7 @@ start_again:
|
||||
(uint32_t)(uintptr_t)chk->whoTo,
|
||||
chk->rec.data.tsn);
|
||||
}
|
||||
|
||||
sctp_flight_size_increase(chk);
|
||||
sctp_total_flight_increase(stcb, chk);
|
||||
}
|
||||
@ -909,6 +912,7 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp,
|
||||
(net->flight_size == 0)) {
|
||||
(*stcb->asoc.cc_functions.sctp_cwnd_new_transmission_begins) (stcb, net);
|
||||
}
|
||||
|
||||
/*
|
||||
* setup the sat loss recovery that prevents satellite cwnd advance.
|
||||
*/
|
||||
@ -937,6 +941,7 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp,
|
||||
RTFREE(net->ro.ro_rt);
|
||||
net->ro.ro_rt = NULL;
|
||||
}
|
||||
|
||||
/* Was it our primary? */
|
||||
if ((stcb->asoc.primary_destination == net) && (alt != net)) {
|
||||
/*
|
||||
@ -1210,6 +1215,7 @@ sctp_asconf_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
asconf->whoTo = alt;
|
||||
atomic_add_int(&alt->ref_count, 1);
|
||||
}
|
||||
|
||||
/* See if an ECN Echo is also stranded */
|
||||
TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
|
||||
if ((chk->whoTo == net) &&
|
||||
|
@ -262,7 +262,8 @@ struct sctp_snd_all_completes {
|
||||
#define SCTP_PR_SCTP_TTL 0x0001 /* Time based PR-SCTP */
|
||||
#define SCTP_PR_SCTP_PRIO 0x0002 /* Buffer based PR-SCTP */
|
||||
#define SCTP_PR_SCTP_BUF SCTP_PR_SCTP_PRIO /* For backwards compatibility */
|
||||
#define SCTP_PR_SCTP_RTX 0x0003/* Number of retransmissions based PR-SCTP */
|
||||
#define SCTP_PR_SCTP_RTX 0x0003 /* Number of retransmissions based
|
||||
* PR-SCTP */
|
||||
#define SCTP_PR_SCTP_MAX SCTP_PR_SCTP_RTX
|
||||
#define SCTP_PR_SCTP_ALL 0x000f /* Used for aggregated stats */
|
||||
|
||||
@ -1025,7 +1026,8 @@ struct sctpstat {
|
||||
uint32_t sctps_pdrpdiwnp; /* P-drop, e-host confirms zero-rwnd */
|
||||
uint32_t sctps_pdrpdizrw; /* P-drop, midbox confirms no space */
|
||||
uint32_t sctps_pdrpbadd; /* P-drop, data did not match TSN */
|
||||
uint32_t sctps_pdrpmark;/* P-drop, TSN's marked for Fast Retran */
|
||||
uint32_t sctps_pdrpmark; /* P-drop, TSN's marked for Fast
|
||||
* Retran */
|
||||
/* timeouts */
|
||||
uint32_t sctps_timoiterator; /* Number of iterator timers that
|
||||
* fired */
|
||||
|
@ -389,6 +389,7 @@ sctp_getcred(SYSCTL_HANDLER_ARGS)
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
goto cred_can_cont;
|
||||
}
|
||||
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT);
|
||||
error = ENOENT;
|
||||
goto out;
|
||||
@ -429,6 +430,7 @@ sctp_abort(struct socket *so)
|
||||
if (inp == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
sctp_must_try_again:
|
||||
flags = inp->sctp_flags;
|
||||
#ifdef SCTP_LOG_CLOSING
|
||||
@ -1367,11 +1369,13 @@ sctp_do_connect_x(struct socket *so, struct sctp_inpcb *inp, void *optval,
|
||||
SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_USRREQ, EADDRINUSE);
|
||||
return (EADDRINUSE);
|
||||
}
|
||||
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) &&
|
||||
(sctp_is_feature_off(inp, SCTP_PCB_FLAGS_PORTREUSE))) {
|
||||
SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
stcb = LIST_FIRST(&inp->sctp_asoc_list);
|
||||
@ -1436,6 +1440,7 @@ sctp_do_connect_x(struct socket *so, struct sctp_inpcb *inp, void *optval,
|
||||
goto out_now;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIX ME: do we want to pass in a vrf on the connect call? */
|
||||
vrf_id = inp->def_vrf_id;
|
||||
|
||||
@ -1547,6 +1552,7 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
inp = (struct sctp_inpcb *)so->so_pcb;
|
||||
if (inp == NULL) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
@ -2391,6 +2397,7 @@ flags_out:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
/* Applies to the specific association */
|
||||
paddrp->spp_flags = 0;
|
||||
@ -3260,6 +3267,7 @@ flags_out:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
if (net != NULL) {
|
||||
thlds->spt_pathmaxrxt = net->failure_threshold;
|
||||
@ -3372,6 +3380,7 @@ flags_out:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
if (net) {
|
||||
encaps->sue_port = net->port;
|
||||
@ -4397,6 +4406,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
hmaclist = sctp_alloc_hmaclist((uint16_t)shmac->shmac_number_of_idents);
|
||||
if (hmaclist == NULL) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOMEM);
|
||||
@ -4589,6 +4599,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -5272,12 +5283,14 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if ((paddrp->spp_flags & SPP_PMTUD_ENABLE) && (paddrp->spp_flags & SPP_PMTUD_DISABLE)) {
|
||||
if (stcb)
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
/************************TCB SPECIFIC SET ******************/
|
||||
if (net != NULL) {
|
||||
@ -5413,6 +5426,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
net->failure_threshold = paddrp->spp_pathmaxrxt;
|
||||
}
|
||||
}
|
||||
|
||||
if (paddrp->spp_flags & SPP_HB_ENABLE) {
|
||||
if (paddrp->spp_hbinterval != 0) {
|
||||
stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval;
|
||||
@ -5523,6 +5537,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
if (paddrp->spp_pathmaxrxt != 0) {
|
||||
inp->sctp_ep.def_net_failure = paddrp->spp_pathmaxrxt;
|
||||
}
|
||||
|
||||
if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO)
|
||||
inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = 0;
|
||||
else if (paddrp->spp_hbinterval != 0) {
|
||||
@ -5530,6 +5545,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
paddrp->spp_hbinterval = SCTP_MAX_HB_INTERVAL;
|
||||
inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = MSEC_TO_TICKS(paddrp->spp_hbinterval);
|
||||
}
|
||||
|
||||
if (paddrp->spp_flags & SPP_HB_ENABLE) {
|
||||
if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) {
|
||||
inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = 0;
|
||||
@ -6482,6 +6498,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stcb != NULL) {
|
||||
if (net != NULL) {
|
||||
net->port = encaps->sue_port;
|
||||
@ -6865,6 +6882,7 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
switch (addr->sa_family) {
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
@ -6970,6 +6988,7 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
|
||||
error = EALREADY;
|
||||
goto out_now;
|
||||
}
|
||||
|
||||
vrf_id = inp->def_vrf_id;
|
||||
/* We are GOOD to go */
|
||||
stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id,
|
||||
@ -6996,6 +7015,7 @@ out_now:
|
||||
if (create_lock_on) {
|
||||
SCTP_ASOC_CREATE_UNLOCK(inp);
|
||||
}
|
||||
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
return (error);
|
||||
}
|
||||
@ -7134,6 +7154,7 @@ sctp_listen(struct socket *so, int backlog, struct thread *p)
|
||||
return (EADDRINUSE);
|
||||
}
|
||||
}
|
||||
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) &&
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED)) {
|
||||
/* We are already connected AND the TCP model */
|
||||
@ -7336,6 +7357,7 @@ sctp_ingetaddr(struct socket *so, struct sockaddr **addr)
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
goto notConn;
|
||||
}
|
||||
|
||||
vrf_id = inp->def_vrf_id;
|
||||
sctp_ifa = sctp_source_address_selection(inp,
|
||||
stcb,
|
||||
|
@ -1433,6 +1433,7 @@ select_a_new_ep:
|
||||
atomic_add_int(&it->stcb->asoc.refcnt, -1);
|
||||
iteration_count = 0;
|
||||
}
|
||||
|
||||
/* run function on this one */
|
||||
(*it->function_assoc) (it->inp, it->stcb, it->pointer, it->val);
|
||||
|
||||
@ -1786,6 +1787,7 @@ sctp_timeout_handler(void *t)
|
||||
if ((stcb == NULL) || (inp == NULL)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (sctp_cookie_timer(inp, stcb, net)) {
|
||||
/* no need to unlock on tcb its gone */
|
||||
goto out_decr;
|
||||
@ -1981,6 +1983,7 @@ out_decr:
|
||||
if (inp) {
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
}
|
||||
|
||||
out_no_decr:
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "Timer now complete (type = %d)\n", type);
|
||||
CURVNET_RESTORE();
|
||||
@ -2498,7 +2501,6 @@ sctp_calculate_rto(struct sctp_tcb *stcb,
|
||||
/* store the current RTT in us */
|
||||
net->rtt = (uint64_t)1000000 * (uint64_t)now.tv_sec +
|
||||
(uint64_t)now.tv_usec;
|
||||
|
||||
/* compute rtt in ms */
|
||||
rtt = (int32_t)(net->rtt / 1000);
|
||||
if ((asoc->cc_functions.sctp_rtt_calculated) && (rtt_from_sack == SCTP_RTT_FROM_DATA)) {
|
||||
@ -2520,6 +2522,7 @@ sctp_calculate_rto(struct sctp_tcb *stcb,
|
||||
net->lan_type = SCTP_LAN_LOCAL;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************/
|
||||
/* 2. update RTTVAR & SRTT */
|
||||
/***************************/
|
||||
@ -2958,6 +2961,7 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error,
|
||||
/* event not enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) {
|
||||
notifhdr_len = sizeof(struct sctp_send_failed_event);
|
||||
} else {
|
||||
@ -3186,6 +3190,7 @@ sctp_notify_adaptation_layer(struct sctp_tcb *stcb)
|
||||
/* event not enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_adaption_event), 0, M_NOWAIT, 1, MT_DATA);
|
||||
if (m_notify == NULL)
|
||||
/* no space left */
|
||||
@ -3242,6 +3247,7 @@ sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error,
|
||||
if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_pdapi_event), 0, M_NOWAIT, 1, MT_DATA);
|
||||
if (m_notify == NULL)
|
||||
/* no space left */
|
||||
@ -3350,6 +3356,7 @@ sctp_notify_shutdown_event(struct sctp_tcb *stcb)
|
||||
/* event not enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_event), 0, M_NOWAIT, 1, MT_DATA);
|
||||
if (m_notify == NULL)
|
||||
/* no space left */
|
||||
@ -3399,6 +3406,7 @@ sctp_notify_sender_dry_event(struct sctp_tcb *stcb,
|
||||
/* event not enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_sender_dry_event), 0, M_NOWAIT, 1, MT_DATA);
|
||||
if (m_notify == NULL) {
|
||||
/* no space left */
|
||||
@ -3555,6 +3563,7 @@ sctp_notify_stream_reset(struct sctp_tcb *stcb,
|
||||
/* event not enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
m_notify = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA);
|
||||
if (m_notify == NULL)
|
||||
/* no space left */
|
||||
@ -4969,6 +4978,7 @@ sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr,
|
||||
if (holds_lock == 0) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
}
|
||||
|
||||
LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) {
|
||||
if (laddr->ifa == NULL)
|
||||
continue;
|
||||
@ -5058,6 +5068,7 @@ sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock)
|
||||
SCTP_IPI_ADDR_RUNLOCK();
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
hash_of_addr = sctp_get_ifa_hash_val(addr);
|
||||
|
||||
hash_head = &vrf->vrf_addr_hash[(hash_of_addr & vrf->vrf_addr_hashmark)];
|
||||
@ -5182,6 +5193,7 @@ out:
|
||||
if (so && r_unlocked && hold_rlock) {
|
||||
SCTP_INP_READ_LOCK(stcb->sctp_ep);
|
||||
}
|
||||
|
||||
SCTP_INP_DECR_REF(stcb->sctp_ep);
|
||||
no_lock:
|
||||
atomic_add_int(&stcb->asoc.refcnt, -1);
|
||||
@ -5231,6 +5243,7 @@ sctp_sorecvmsg(struct socket *so,
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (msg_flags) {
|
||||
in_flags = *msg_flags;
|
||||
if (in_flags & MSG_PEEK)
|
||||
@ -5274,6 +5287,8 @@ sctp_sorecvmsg(struct socket *so,
|
||||
sctp_misc_ints(SCTP_SORECV_ENTERPL,
|
||||
rwnd_req, block_allowed, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid);
|
||||
}
|
||||
|
||||
|
||||
error = sblock(&so->so_rcv, (block_allowed ? SBL_WAIT : 0));
|
||||
if (error) {
|
||||
goto release_unlocked;
|
||||
@ -5383,6 +5398,7 @@ restart_nosblocks:
|
||||
hold_rlock = 0;
|
||||
goto restart;
|
||||
}
|
||||
|
||||
if ((control->length == 0) &&
|
||||
(control->do_not_ref_stcb)) {
|
||||
/*
|
||||
@ -5566,6 +5582,7 @@ found_one:
|
||||
control->do_not_ref_stcb == 0) {
|
||||
stcb->asoc.strmin[control->sinfo_stream].delivery_started = 1;
|
||||
}
|
||||
|
||||
/* First lets get off the sinfo and sockaddr info */
|
||||
if ((sinfo != NULL) && (filling_sinfo != 0)) {
|
||||
sinfo->sinfo_stream = control->sinfo_stream;
|
||||
@ -5727,6 +5744,7 @@ get_more_data:
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
|
||||
goto release;
|
||||
}
|
||||
|
||||
if ((control->do_not_ref_stcb == 0) && stcb &&
|
||||
stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) {
|
||||
no_rcv_needed = 1;
|
||||
@ -5939,6 +5957,7 @@ wait_some_more:
|
||||
if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
|
||||
goto release;
|
||||
}
|
||||
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)
|
||||
goto release;
|
||||
|
||||
@ -6067,6 +6086,7 @@ release:
|
||||
SOCKBUF_UNLOCK(&so->so_rcv);
|
||||
hold_sblock = 0;
|
||||
}
|
||||
|
||||
sbunlock(&so->so_rcv);
|
||||
sockbuf_lock = 0;
|
||||
|
||||
@ -6104,6 +6124,7 @@ out:
|
||||
if (sockbuf_lock) {
|
||||
sbunlock(&so->so_rcv);
|
||||
}
|
||||
|
||||
if (freecnt_applied) {
|
||||
/*
|
||||
* The lock on the socket buffer protects us so the free
|
||||
@ -6701,6 +6722,7 @@ sctp_local_addr_count(struct sctp_tcb *stcb)
|
||||
SCTP_IPI_ADDR_RUNLOCK();
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
|
||||
/*
|
||||
* bound all case: go through all ifns on the vrf
|
||||
|
@ -72,11 +72,9 @@ int32_t
|
||||
uint32_t
|
||||
sctp_get_ifa_hash_val(struct sockaddr *addr);
|
||||
|
||||
struct sctp_ifa *
|
||||
sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, int hold_lock);
|
||||
struct sctp_ifa *sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, int hold_lock);
|
||||
|
||||
struct sctp_ifa *
|
||||
sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock);
|
||||
struct sctp_ifa *sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock);
|
||||
|
||||
uint32_t sctp_select_initial_TSN(struct sctp_pcb *);
|
||||
|
||||
@ -147,11 +145,9 @@ struct sctp_paramhdr *
|
||||
sctp_get_next_param(struct mbuf *, int,
|
||||
struct sctp_paramhdr *, int);
|
||||
|
||||
struct mbuf *
|
||||
sctp_add_pad_tombuf(struct mbuf *, int);
|
||||
struct mbuf *sctp_add_pad_tombuf(struct mbuf *, int);
|
||||
|
||||
struct mbuf *
|
||||
sctp_pad_lastmbuf(struct mbuf *, int, struct mbuf *);
|
||||
struct mbuf *sctp_pad_lastmbuf(struct mbuf *, int, struct mbuf *);
|
||||
|
||||
void
|
||||
sctp_ulp_notify(uint32_t, struct sctp_tcb *, uint32_t, void *, int
|
||||
@ -224,8 +220,7 @@ int sctp_is_there_an_abort_here(struct mbuf *, int, uint32_t *);
|
||||
#ifdef INET6
|
||||
uint32_t sctp_is_same_scope(struct sockaddr_in6 *, struct sockaddr_in6 *);
|
||||
|
||||
struct sockaddr_in6 *
|
||||
sctp_recover_scope(struct sockaddr_in6 *, struct sockaddr_in6 *);
|
||||
struct sockaddr_in6 *sctp_recover_scope(struct sockaddr_in6 *, struct sockaddr_in6 *);
|
||||
|
||||
#define sctp_recover_scope_mac(addr, store) do { \
|
||||
if ((addr->sin6_family == AF_INET6) && \
|
||||
|
@ -271,6 +271,7 @@ sctp6_ctlinput(int cmd, struct sockaddr *pktdst, void *d)
|
||||
pktdst->sa_len != sizeof(struct sockaddr_in6)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((unsigned)cmd >= PRC_NCMDS) {
|
||||
return;
|
||||
}
|
||||
@ -294,6 +295,7 @@ sctp6_ctlinput(int cmd, struct sockaddr *pktdst, void *d)
|
||||
if (ip6cp->ip6c_m == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if we can safely examine the ports and the
|
||||
* verification tag of the SCTP common header.
|
||||
@ -302,6 +304,7 @@ sctp6_ctlinput(int cmd, struct sockaddr *pktdst, void *d)
|
||||
(int32_t)(ip6cp->ip6c_off + offsetof(struct sctphdr, checksum))) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Copy out the port numbers and the verification tag. */
|
||||
memset(&sh, 0, sizeof(sh));
|
||||
m_copydata(ip6cp->ip6c_m,
|
||||
@ -525,6 +528,7 @@ sctp6_attach(struct socket *so, int proto SCTP_UNUSED, struct thread *p SCTP_UNU
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
|
||||
error = SCTP_SORESERVE(so, SCTP_BASE_SYSCTL(sctp_sendspace), SCTP_BASE_SYSCTL(sctp_recvspace));
|
||||
if (error)
|
||||
@ -565,6 +569,7 @@ sctp6_bind(struct socket *so, struct sockaddr *addr, struct thread *p)
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (addr) {
|
||||
switch (addr->sa_family) {
|
||||
#ifdef INET
|
||||
@ -1101,6 +1106,7 @@ sctp6_in6getaddr(struct socket *so, struct sockaddr **nam)
|
||||
SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/* allow v6 addresses precedence */
|
||||
error = sctp6_getaddr(so, nam);
|
||||
#ifdef INET
|
||||
@ -1136,6 +1142,7 @@ sctp6_getpeeraddr(struct socket *so, struct sockaddr **nam)
|
||||
SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/* allow v6 addresses precedence */
|
||||
error = sctp6_peeraddr(so, nam);
|
||||
#ifdef INET
|
||||
|
Loading…
x
Reference in New Issue
Block a user