summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet/sctp_output.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-09 14:19:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-10 09:53:34 +0100
commit75b706fde4cbf82bcd41a1cec319778aa0f8eb2d (patch)
treeea39a351a1f6337b5a5dd6036314693adef5ffe6 /freebsd/sys/netinet/sctp_output.c
parentVMSTAT(8): Port to RTEMS (diff)
downloadrtems-libbsd-75b706fde4cbf82bcd41a1cec319778aa0f8eb2d.tar.bz2
Update to FreeBSD head 2016-12-10
Git mirror commit 80c55f08a05ab3b26a73b226ccb56adc3122a55c.
Diffstat (limited to 'freebsd/sys/netinet/sctp_output.c')
-rw-r--r--freebsd/sys/netinet/sctp_output.c386
1 files changed, 145 insertions, 241 deletions
diff --git a/freebsd/sys/netinet/sctp_output.c b/freebsd/sys/netinet/sctp_output.c
index 9e12e775..94f9d866 100644
--- a/freebsd/sys/netinet/sctp_output.c
+++ b/freebsd/sys/netinet/sctp_output.c
@@ -1945,7 +1945,6 @@ sctp_add_addr_to_mbuf(struct mbuf *m, struct sctp_ifa *ifa, uint16_t * len)
struct sctp_paramhdr *parmh;
struct mbuf *mret;
uint16_t plen;
-
#endif
switch (ifa->address.sa.sa_family) {
@@ -2141,10 +2140,8 @@ skip_count:
cnt++;
total_count++;
if (cnt >= 2) {
- /*
- * two from each
- * address
- */
+ /* two from each
+ * address */
break;
}
if (total_count > SCTP_ADDRESS_LIMIT) {
@@ -2786,7 +2783,6 @@ sctp_select_nth_preferred_addr_from_ifn_boundall(struct sctp_ifn *ifn,
{
struct sctp_ifa *ifa, *sifa;
int num_eligible_addr = 0;
-
#ifdef INET6
struct sockaddr_in6 sin6, lsa6;
@@ -2831,10 +2827,8 @@ sctp_select_nth_preferred_addr_from_ifn_boundall(struct sctp_ifn *ifn,
if (fam == AF_INET6 &&
IN6_IS_ADDR_LINKLOCAL(&sifa->address.sin6.sin6_addr) &&
IN6_IS_ADDR_LINKLOCAL(&sin6.sin6_addr)) {
- /*
- * link-local <-> link-local must belong to the same
- * scope.
- */
+ /* link-local <-> link-local must belong to the same
+ * scope. */
memcpy(&lsa6, &sifa->address.sin6, sizeof(struct sockaddr_in6));
(void)sa6_recoverscope(&lsa6);
if (sin6.sin6_scope_id != lsa6.sin6_scope_id) {
@@ -2968,10 +2962,8 @@ sctp_choose_boundall(struct sctp_inpcb *inp,
struct sctp_ifa *sctp_ifa, *sifa;
uint32_t ifn_index;
struct sctp_vrf *vrf;
-
#ifdef INET
int retried = 0;
-
#endif
/*-
@@ -3317,14 +3309,11 @@ sctp_source_address_selection(struct sctp_inpcb *inp,
struct sctp_ifa *answer;
uint8_t dest_is_priv, dest_is_loop;
sa_family_t fam;
-
#ifdef INET
struct sockaddr_in *to = (struct sockaddr_in *)&ro->ro_dst;
-
#endif
#ifdef INET6
struct sockaddr_in6 *to6 = (struct sockaddr_in6 *)&ro->ro_dst;
-
#endif
/**
@@ -3572,14 +3561,11 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er
struct cmsghdr cmh;
int tlen, at;
struct sctp_initmsg initmsg;
-
#ifdef INET
struct sockaddr_in sin;
-
#endif
#ifdef INET6
struct sockaddr_in6 sin6;
-
#endif
tlen = SCTP_BUF_LEN(control);
@@ -3620,10 +3606,8 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er
if (stcb->asoc.streamoutcnt < stcb->asoc.pre_open_streams) {
struct sctp_stream_out *tmp_str;
unsigned int i;
-
#if defined(SCTP_DETAILED_STR_STATS)
int j;
-
#endif
/* Default is NOT correct */
@@ -3656,7 +3640,7 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er
stcb->asoc.strmout[i].abandoned_sent[0] = 0;
stcb->asoc.strmout[i].abandoned_unsent[0] = 0;
#endif
- stcb->asoc.strmout[i].stream_no = i;
+ stcb->asoc.strmout[i].sid = i;
stcb->asoc.strmout[i].last_msg_incomplete = 0;
stcb->asoc.strmout[i].state = SCTP_STREAM_OPENING;
stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL);
@@ -3746,14 +3730,11 @@ sctp_findassociation_cmsgs(struct sctp_inpcb **inp_p,
int tlen, at;
struct sctp_tcb *stcb;
struct sockaddr *addr;
-
#ifdef INET
struct sockaddr_in sin;
-
#endif
#ifdef INET6
struct sockaddr_in6 sin6;
-
#endif
tlen = SCTP_BUF_LEN(control);
@@ -3972,7 +3953,6 @@ sctp_handle_no_route(struct sctp_tcb *stcb,
}
}
}
-
#endif
static int
@@ -4018,22 +3998,17 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
struct sctphdr *sctphdr;
int packet_length;
int ret;
-
#if defined(INET) || defined(INET6)
uint32_t vrf_id;
-
#endif
#if defined(INET) || defined(INET6)
struct mbuf *o_pak;
sctp_route_t *ro = NULL;
struct udphdr *udp = NULL;
-
#endif
uint8_t tos_value;
-
#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
struct socket *so = NULL;
-
#endif
if ((net) && (net->dest_state & SCTP_ADDR_OUT_OF_SCOPE)) {
@@ -4291,10 +4266,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
/* free tempy routes */
RO_RTFREE(ro);
} else {
- /*
- * PMTU check versus smallest asoc MTU goes
- * here
- */
+ /* PMTU check versus smallest asoc MTU goes
+ * here */
if ((ro->ro_rt != NULL) &&
(net->ro._s_addr)) {
uint32_t mtu;
@@ -4569,10 +4542,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT3, (struct sockaddr *)sin6);
if (net) {
sin6 = (struct sockaddr_in6 *)&net->ro._l_addr;
- /*
- * preserve the port and scope for link
- * local send
- */
+ /* preserve the port and scope for link
+ * local send */
prev_scope = sin6->sin6_scope_id;
prev_port = sin6->sin6_port;
}
@@ -4638,10 +4609,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
/* Now if we had a temp route free it */
RO_RTFREE(ro);
} else {
- /*
- * PMTU check versus smallest asoc MTU goes
- * here
- */
+ /* PMTU check versus smallest asoc MTU goes
+ * here */
if (ro->ro_rt == NULL) {
/* Route was freed */
if (net->ro._s_addr &&
@@ -4971,11 +4940,11 @@ sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt,
* being equal to the beginning of the params i.e. (iphlen +
* sizeof(struct sctp_init_msg) parse through the parameters to the
* end of the mbuf verifying that all parameters are known.
- *
+ *
* For unknown parameters build and return a mbuf with
* UNRECOGNIZED_PARAMETER errors. If the flags indicate to stop
* processing this chunk stop, and set *abort_processing to 1.
- *
+ *
* By having param_offset be pre-set to where parameters begin it is
* hoped that this routine may be reused in the future by new
* features.
@@ -5262,7 +5231,6 @@ invalid_size:
*abort_processing = 1;
if ((op_err == NULL) && phdr) {
int l_len;
-
#ifdef INET6
l_len = SCTP_MIN_OVERHEAD;
#else
@@ -5320,14 +5288,11 @@ sctp_are_there_new_addresses(struct sctp_association *asoc,
uint8_t fnd;
struct sctp_nets *net;
int check_src;
-
#ifdef INET
struct sockaddr_in sin4, *sa4;
-
#endif
#ifdef INET6
struct sockaddr_in6 sin6, *sa6;
-
#endif
#ifdef INET
@@ -5511,18 +5476,15 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
struct sctp_paramhdr *ph;
union sctp_sockstore *over_addr;
struct sctp_scoping scp;
-
#ifdef INET
struct sockaddr_in *dst4 = (struct sockaddr_in *)dst;
struct sockaddr_in *src4 = (struct sockaddr_in *)src;
struct sockaddr_in *sin;
-
#endif
#ifdef INET6
struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)dst;
struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)src;
struct sockaddr_in6 *sin6;
-
#endif
struct sockaddr *to;
struct sctp_state_cookie stc;
@@ -5546,10 +5508,10 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
/*
* new addresses, out of here in non-cookie-wait
* states
- *
- * Send an ABORT, without the new address error cause.
- * This looks no different than if no listener was
- * present.
+ *
+ * Send an ABORT, without the new address error
+ * cause. This looks no different than if no
+ * listener was present.
*/
op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code),
"Address added");
@@ -5562,9 +5524,9 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
/*
* change of remote encapsulation port, out of here
* in non-cookie-wait states
- *
- * Send an ABORT, without an specific error cause. This
- * looks no different than if no listener was
+ *
+ * Send an ABORT, without an specific error cause.
+ * This looks no different than if no listener was
* present.
*/
op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code),
@@ -5718,10 +5680,8 @@ do_a_abort:
* show up in our scoped count.
*/
cnt_inits_to = 1;
- /*
- * pull out the scope_id from
- * incoming pkt
- */
+ /* pull out the scope_id from
+ * incoming pkt */
} else if (IN6_IS_ADDR_SITELOCAL(&src6->sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&dst6->sin6_addr)) {
/*
@@ -5746,7 +5706,6 @@ do_a_abort:
#ifdef INET6
struct sctp_nets *lnet;
-
#endif
stc.loopback_scope = asoc->scope.loopback_scope;
@@ -6208,9 +6167,9 @@ sctp_prune_prsctp(struct sctp_tcb *stcb,
if (freed_spc >= dataout) {
return;
}
- } /* if chunk was present */
- } /* if of sufficient priority */
- } /* if chunk has enabled */
+ } /* if chunk was present */
+ } /* if of sufficient priority */
+ } /* if chunk has enabled */
} /* tailqforeach */
TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) {
@@ -6231,11 +6190,11 @@ sctp_prune_prsctp(struct sctp_tcb *stcb,
if (freed_spc >= dataout) {
return;
}
- } /* end if chk->data */
- } /* end if right class */
- } /* end if chk pr-sctp */
+ } /* end if chk->data */
+ } /* end if right class */
+ } /* end if chk pr-sctp */
} /* tailqforeachsafe (chk) */
- } /* if enabled in asoc */
+ } /* if enabled in asoc */
}
int
@@ -6391,7 +6350,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
sp->net = NULL;
}
(void)SCTP_GETTIME_TIMEVAL(&sp->ts);
- sp->stream = srcv->sinfo_stream;
+ sp->sid = srcv->sinfo_stream;
sp->msg_is_complete = 1;
sp->sender_all_done = 1;
sp->some_taken = 0;
@@ -6478,10 +6437,8 @@ error_out:
/* get the prepend space */
SCTP_BUF_RESV_UF(outchain, (SCTP_FIRST_MBUF_RESV + 4));
} else {
- /*
- * We really should not get a NULL
- * in endofchain
- */
+ /* We really should not get a NULL
+ * in endofchain */
/* find end */
m = outchain;
while (m) {
@@ -6493,10 +6450,8 @@ error_out:
}
/* sanity */
if (*endofchain == NULL) {
- /*
- * huh, TSNH XXX maybe we
- * should panic
- */
+ /* huh, TSNH XXX maybe we
+ * should panic */
sctp_m_freem(outchain);
goto new_mbuf;
}
@@ -6695,17 +6650,13 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr,
if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc)) {
goto abort_anyway;
}
- /*
- * there is nothing queued to send, so I'm
- * done...
- */
+ /* there is nothing queued to send, so I'm
+ * done... */
if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) &&
(SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) &&
(SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) {
- /*
- * only send SHUTDOWN the first time
- * through
- */
+ /* only send SHUTDOWN the first time
+ * through */
if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) {
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
}
@@ -6982,14 +6933,14 @@ sctp_clean_up_datalist(struct sctp_tcb *stcb,
/* record time */
data_list[i]->sent_rcv_time = net->last_sent_time;
data_list[i]->rec.data.cwnd_at_send = net->cwnd;
- data_list[i]->rec.data.fast_retran_tsn = data_list[i]->rec.data.TSN_seq;
+ data_list[i]->rec.data.fast_retran_tsn = data_list[i]->rec.data.tsn;
if (data_list[i]->whoTo == NULL) {
data_list[i]->whoTo = net;
atomic_add_int(&net->ref_count, 1);
}
/* on to the sent queue */
tp1 = TAILQ_LAST(&asoc->sent_queue, sctpchunk_listhead);
- if ((tp1) && SCTP_TSN_GT(tp1->rec.data.TSN_seq, data_list[i]->rec.data.TSN_seq)) {
+ if ((tp1) && SCTP_TSN_GT(tp1->rec.data.tsn, data_list[i]->rec.data.tsn)) {
struct sctp_tmit_chunk *tpp;
/* need to move back */
@@ -7000,7 +6951,7 @@ sctp_clean_up_datalist(struct sctp_tcb *stcb,
goto all_done;
}
tp1 = tpp;
- if (SCTP_TSN_GT(tp1->rec.data.TSN_seq, data_list[i]->rec.data.TSN_seq)) {
+ if (SCTP_TSN_GT(tp1->rec.data.tsn, data_list[i]->rec.data.tsn)) {
goto back_up_more;
}
TAILQ_INSERT_AFTER(&asoc->sent_queue, tp1, data_list[i], sctp_next);
@@ -7029,7 +6980,7 @@ all_done:
data_list[i]->whoTo->flight_size,
data_list[i]->book_size,
(uint32_t) (uintptr_t) data_list[i]->whoTo,
- data_list[i]->rec.data.TSN_seq);
+ data_list[i]->rec.data.tsn);
}
sctp_flight_size_increase(data_list[i]);
sctp_total_flight_increase(stcb, data_list[i]);
@@ -7197,7 +7148,7 @@ one_more_time:
(stcb->asoc.idata_supported == 0) &&
(strq->last_msg_incomplete)) {
SCTP_PRINTF("Huh? Stream:%d lm_in_c=%d but queue is NULL\n",
- strq->stream_no,
+ strq->sid,
strq->last_msg_incomplete);
strq->last_msg_incomplete = 0;
}
@@ -7336,10 +7287,8 @@ re_look:
SCTP_TCB_SEND_LOCK(stcb);
send_lock_up = 1;
if (sp->msg_is_complete) {
- /*
- * the sender finished the
- * msg
- */
+ /* the sender finished the
+ * msg */
goto re_look;
}
}
@@ -7546,28 +7495,28 @@ dont_do_it:
if (stcb->asoc.idata_supported == 0) {
if (rcv_flags & SCTP_DATA_UNORDERED) {
/* Just use 0. The receiver ignores the values. */
- chk->rec.data.stream_seq = 0;
+ chk->rec.data.mid = 0;
} else {
- chk->rec.data.stream_seq = strq->next_mid_ordered;
+ chk->rec.data.mid = strq->next_mid_ordered;
if (rcv_flags & SCTP_DATA_LAST_FRAG) {
strq->next_mid_ordered++;
}
}
} else {
if (rcv_flags & SCTP_DATA_UNORDERED) {
- chk->rec.data.stream_seq = strq->next_mid_unordered;
+ chk->rec.data.mid = strq->next_mid_unordered;
if (rcv_flags & SCTP_DATA_LAST_FRAG) {
strq->next_mid_unordered++;
}
} else {
- chk->rec.data.stream_seq = strq->next_mid_ordered;
+ chk->rec.data.mid = strq->next_mid_ordered;
if (rcv_flags & SCTP_DATA_LAST_FRAG) {
strq->next_mid_ordered++;
}
}
}
- chk->rec.data.stream_number = sp->stream;
- chk->rec.data.payloadtype = sp->ppid;
+ chk->rec.data.sid = sp->sid;
+ chk->rec.data.ppid = sp->ppid;
chk->rec.data.context = sp->context;
chk->rec.data.doing_fast_retransmit = 0;
@@ -7585,12 +7534,12 @@ dont_do_it:
sctp_auth_key_acquire(stcb, chk->auth_keyid);
chk->holds_key_ref = 1;
}
- chk->rec.data.TSN_seq = atomic_fetchadd_int(&asoc->sending_seq, 1);
+ chk->rec.data.tsn = atomic_fetchadd_int(&asoc->sending_seq, 1);
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_AT_SEND_2_OUTQ) {
sctp_misc_ints(SCTP_STRMOUT_LOG_SEND,
(uint32_t) (uintptr_t) stcb, sp->length,
- (uint32_t) ((chk->rec.data.stream_number << 16) | chk->rec.data.stream_seq),
- chk->rec.data.TSN_seq);
+ (uint32_t) ((chk->rec.data.sid << 16) | (0x0000ffff & chk->rec.data.mid)),
+ chk->rec.data.tsn);
}
if (stcb->asoc.idata_supported == 0) {
dchkh = mtod(chk->data, struct sctp_data_chunk *);
@@ -7608,9 +7557,9 @@ dont_do_it:
asoc->tsn_out_at = 0;
asoc->tsn_out_wrapped = 1;
}
- asoc->out_tsnlog[asoc->tsn_out_at].tsn = chk->rec.data.TSN_seq;
- asoc->out_tsnlog[asoc->tsn_out_at].strm = chk->rec.data.stream_number;
- asoc->out_tsnlog[asoc->tsn_out_at].seq = chk->rec.data.stream_seq;
+ asoc->out_tsnlog[asoc->tsn_out_at].tsn = chk->rec.data.tsn;
+ asoc->out_tsnlog[asoc->tsn_out_at].strm = chk->rec.data.sid;
+ asoc->out_tsnlog[asoc->tsn_out_at].seq = chk->rec.data.mid;
asoc->out_tsnlog[asoc->tsn_out_at].sz = chk->send_size;
asoc->out_tsnlog[asoc->tsn_out_at].flgs = chk->rec.data.rcv_flags;
asoc->out_tsnlog[asoc->tsn_out_at].stcb = (void *)stcb;
@@ -7621,20 +7570,20 @@ dont_do_it:
if (stcb->asoc.idata_supported == 0) {
dchkh->ch.chunk_type = SCTP_DATA;
dchkh->ch.chunk_flags = chk->rec.data.rcv_flags;
- dchkh->dp.tsn = htonl(chk->rec.data.TSN_seq);
- dchkh->dp.stream_id = htons((strq->stream_no & 0x0000ffff));
- dchkh->dp.stream_sequence = htons((uint16_t) chk->rec.data.stream_seq);
- dchkh->dp.protocol_id = chk->rec.data.payloadtype;
+ dchkh->dp.tsn = htonl(chk->rec.data.tsn);
+ dchkh->dp.sid = htons(strq->sid);
+ dchkh->dp.ssn = htons((uint16_t) chk->rec.data.mid);
+ dchkh->dp.ppid = chk->rec.data.ppid;
dchkh->ch.chunk_length = htons(chk->send_size);
} else {
ndchkh->ch.chunk_type = SCTP_IDATA;
ndchkh->ch.chunk_flags = chk->rec.data.rcv_flags;
- ndchkh->dp.tsn = htonl(chk->rec.data.TSN_seq);
- ndchkh->dp.stream_id = htons(strq->stream_no);
+ ndchkh->dp.tsn = htonl(chk->rec.data.tsn);
+ ndchkh->dp.sid = htons(strq->sid);
ndchkh->dp.reserved = htons(0);
- ndchkh->dp.msg_id = htonl(chk->rec.data.stream_seq);
+ ndchkh->dp.mid = htonl(chk->rec.data.mid);
if (sp->fsn == 0)
- ndchkh->dp.ppid_fsn.protocol_id = chk->rec.data.payloadtype;
+ ndchkh->dp.ppid_fsn.ppid = chk->rec.data.ppid;
else
ndchkh->dp.ppid_fsn.fsn = htonl(sp->fsn);
sp->fsn++;
@@ -7957,9 +7906,9 @@ nothing_to_send:
* (when CMT is off) then it calls
* sctp_fill_outqueue for the net. This gets data on
* the send queue for that network.
- *
- * In sctp_fill_outqueue TSN's are assigned and data is
- * copied out of the stream buffers. Note mostly
+ *
+ * In sctp_fill_outqueue TSN's are assigned and data
+ * is copied out of the stream buffers. Note mostly
* copy by reference (we hope).
*/
net->window_probe = 0;
@@ -8228,10 +8177,8 @@ again_one_more_time:
net->port, NULL,
0, 0,
so_locked))) {
- /*
- * error, we could not
- * output
- */
+ /* error, we could not
+ * output */
SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error);
if (from_where == 0) {
SCTP_STAT_INCR(sctps_lowlevelerrusr);
@@ -8304,16 +8251,12 @@ again_one_more_time:
* to where the sack is going..
*/
if (chk->whoTo == net) {
- /*
- * Don't transmit it to where its
- * going (current net)
- */
+ /* Don't transmit it to where its
+ * going (current net) */
continue;
} else if (sack_goes_to == net) {
- /*
- * But do transmit it to this
- * address
- */
+ /* But do transmit it to this
+ * address */
goto skip_net_check;
}
}
@@ -8506,10 +8449,8 @@ again_one_more_time:
net->port, NULL,
0, 0,
so_locked))) {
- /*
- * error, we could not
- * output
- */
+ /* error, we could not
+ * output */
SCTPDBG(SCTP_DEBUG_OUTPUT3, "Gak send error %d\n", error);
if (from_where == 0) {
SCTP_STAT_INCR(sctps_lowlevelerrusr);
@@ -8706,17 +8647,13 @@ again_one_more_time:
override_ok = 0;
SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks);
} else if (override_ok) {
- /*
- * use this data's
- * keyid
- */
+ /* use this data's
+ * keyid */
auth_keyid = chk->auth_keyid;
override_ok = 0;
} else if (auth_keyid != chk->auth_keyid) {
- /*
- * different keyid,
- * so done bundling
- */
+ /* different keyid,
+ * so done bundling */
break;
}
}
@@ -8795,8 +8732,7 @@ again_one_more_time:
break;
}
} /* for (chunk gather loop for this net) */
- } /* if asoc.state OPEN */
-no_data_fill:
+} /* if asoc.state OPEN */ no_data_fill:
/* Is there something to send for this destination? */
if (outchain) {
/* We may need to start a control timer or two */
@@ -8883,7 +8819,7 @@ no_data_fill:
}
if (bundle_at) {
/* setup for a RTO measurement */
- tsns_sent = data_list[0]->rec.data.TSN_seq;
+ tsns_sent = data_list[0]->rec.data.tsn;
/* fill time if not already filled */
if (*now_filled == 0) {
(void)SCTP_GETTIME_TIMEVAL(&asoc->time_last_sent);
@@ -9564,7 +9500,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp,
}
if (chk->data == NULL) {
SCTP_PRINTF("TSN:%x chk->snd_count:%d chk->sent:%d can't retran - no data\n",
- chk->rec.data.TSN_seq, chk->snd_count, chk->sent);
+ chk->rec.data.tsn, chk->snd_count, chk->sent);
continue;
}
if ((SCTP_BASE_SYSCTL(sctp_max_retran_chunk)) &&
@@ -9573,7 +9509,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp,
char msg[SCTP_DIAG_INFO_LEN];
snprintf(msg, sizeof(msg), "TSN %8.8x retransmitted %d times, giving up",
- chk->rec.data.TSN_seq, chk->snd_count);
+ chk->rec.data.tsn, chk->snd_count);
op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code),
msg);
atomic_add_int(&stcb->asoc.refcnt, 1);
@@ -9607,7 +9543,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp,
uint32_t tsn;
tsn = asoc->last_acked_seq + 1;
- if (tsn == chk->rec.data.TSN_seq) {
+ if (tsn == chk->rec.data.tsn) {
/*
* we make a special exception for this
* case. The peer has no rwnd but is missing
@@ -9736,10 +9672,8 @@ one_chunk_around:
auth_keyid = fwd->auth_keyid;
override_ok = 0;
} else if (fwd->auth_keyid != auth_keyid) {
- /*
- * different keyid,
- * so done bundling
- */
+ /* different keyid,
+ * so done bundling */
break;
}
}
@@ -9819,7 +9753,7 @@ one_chunk_around:
sctp_audit_log(0xC4, bundle_at);
#endif
if (bundle_at) {
- tsns_sent = data_list[0]->rec.data.TSN_seq;
+ tsns_sent = data_list[0]->rec.data.tsn;
}
for (i = 0; i < bundle_at; i++) {
SCTP_STAT_INCR(sctps_sendretransdata);
@@ -9869,7 +9803,7 @@ one_chunk_around:
data_list[i]->whoTo->flight_size,
data_list[i]->book_size,
(uint32_t) (uintptr_t) data_list[i]->whoTo,
- data_list[i]->rec.data.TSN_seq);
+ data_list[i]->rec.data.tsn);
}
sctp_flight_size_increase(data_list[i]);
sctp_total_flight_increase(stcb, data_list[i]);
@@ -10115,11 +10049,9 @@ do_it_again:
if (asoc->max_burst > 0) {
if (SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst)) {
if ((net->flight_size + (asoc->max_burst * net->mtu)) < net->cwnd) {
- /*
- * JRS - Use the congestion
+ /* JRS - Use the congestion
* control given in the
- * congestion control module
- */
+ * congestion control module */
asoc->cc_functions.sctp_cwnd_update_after_output(stcb, net, asoc->max_burst);
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) {
sctp_log_maxburst(stcb, net, 0, asoc->max_burst, SCTP_MAX_BURST_APPLIED);
@@ -10129,10 +10061,8 @@ do_it_again:
net->fast_retran_ip = 0;
} else {
if (net->flight_size == 0) {
- /*
- * Should be decaying the
- * cwnd here
- */
+ /* Should be decaying the
+ * cwnd here */
;
}
}
@@ -10268,13 +10198,7 @@ send_forward_tsn(struct sctp_tcb *stcb,
unsigned int cnt_of_space, i, ovh;
unsigned int space_needed;
unsigned int cnt_of_skipped = 0;
- int old;
- if (asoc->idata_supported) {
- old = 0;
- } else {
- old = 1;
- }
SCTP_TCB_LOCK_ASSERT(stcb);
TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) {
if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) {
@@ -10328,18 +10252,18 @@ sctp_fill_in_rest:
/* no more to look at */
break;
}
- if (old && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) {
+ if (!asoc->idata_supported && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) {
/* We don't report these */
continue;
}
cnt_of_skipped++;
}
- if (old) {
+ if (asoc->idata_supported) {
space_needed = (sizeof(struct sctp_forward_tsn_chunk) +
- (cnt_of_skipped * sizeof(struct sctp_strseq)));
+ (cnt_of_skipped * sizeof(struct sctp_strseq_mid)));
} else {
space_needed = (sizeof(struct sctp_forward_tsn_chunk) +
- (cnt_of_skipped * sizeof(struct sctp_strseq_mid)));
+ (cnt_of_skipped * sizeof(struct sctp_strseq)));
}
cnt_of_space = (unsigned int)M_TRAILINGSPACE(chk->data);
@@ -10368,12 +10292,11 @@ sctp_fill_in_rest:
0xff, 0xff, cnt_of_space,
space_needed);
}
- if (old) {
- cnt_of_skipped = cnt_of_space - sizeof(struct sctp_forward_tsn_chunk);
- cnt_of_skipped /= sizeof(struct sctp_strseq);
- } else {
- cnt_of_skipped = cnt_of_space - sizeof(struct sctp_forward_tsn_chunk);
+ cnt_of_skipped = cnt_of_space - sizeof(struct sctp_forward_tsn_chunk);
+ if (asoc->idata_supported) {
cnt_of_skipped /= sizeof(struct sctp_strseq_mid);
+ } else {
+ cnt_of_skipped /= sizeof(struct sctp_strseq);
}
/*-
* Go through and find the TSN that will be the one
@@ -10391,7 +10314,7 @@ sctp_fill_in_rest:
}
if (at && SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) {
sctp_misc_ints(SCTP_FWD_TSN_CHECK,
- 0xff, cnt_of_skipped, at->rec.data.TSN_seq,
+ 0xff, cnt_of_skipped, at->rec.data.tsn,
asoc->advanced_peer_ack_point);
}
last = at;
@@ -10400,14 +10323,14 @@ sctp_fill_in_rest:
* peer ack point
*/
if (last) {
- advance_peer_ack_point = last->rec.data.TSN_seq;
+ advance_peer_ack_point = last->rec.data.tsn;
}
- if (old) {
+ if (asoc->idata_supported) {
space_needed = sizeof(struct sctp_forward_tsn_chunk) +
- cnt_of_skipped * sizeof(struct sctp_strseq);
+ cnt_of_skipped * sizeof(struct sctp_strseq_mid);
} else {
space_needed = sizeof(struct sctp_forward_tsn_chunk) +
- cnt_of_skipped * sizeof(struct sctp_strseq_mid);
+ cnt_of_skipped * sizeof(struct sctp_strseq);
}
}
chk->send_size = space_needed;
@@ -10415,10 +10338,10 @@ sctp_fill_in_rest:
fwdtsn = mtod(chk->data, struct sctp_forward_tsn_chunk *);
fwdtsn->ch.chunk_length = htons(chk->send_size);
fwdtsn->ch.chunk_flags = 0;
- if (old) {
- fwdtsn->ch.chunk_type = SCTP_FORWARD_CUM_TSN;
- } else {
+ if (asoc->idata_supported) {
fwdtsn->ch.chunk_type = SCTP_IFORWARD_CUM_TSN;
+ } else {
+ fwdtsn->ch.chunk_type = SCTP_FORWARD_CUM_TSN;
}
fwdtsn->new_cumulative_tsn = htonl(advance_peer_ack_point);
SCTP_BUF_LEN(chk->data) = chk->send_size;
@@ -10427,10 +10350,12 @@ sctp_fill_in_rest:
* Move pointer to after the fwdtsn and transfer to the
* strseq pointer.
*/
- if (old) {
- strseq = (struct sctp_strseq *)fwdtsn;
- } else {
+ if (asoc->idata_supported) {
strseq_m = (struct sctp_strseq_mid *)fwdtsn;
+ strseq = NULL;
+ } else {
+ strseq = (struct sctp_strseq *)fwdtsn;
+ strseq_m = NULL;
}
/*-
* Now populate the strseq list. This is done blindly
@@ -10449,26 +10374,26 @@ sctp_fill_in_rest:
if (i >= cnt_of_skipped) {
break;
}
- if (old && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) {
+ if (!asoc->idata_supported && (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED)) {
/* We don't report these */
continue;
}
- if (at->rec.data.TSN_seq == advance_peer_ack_point) {
+ if (at->rec.data.tsn == advance_peer_ack_point) {
at->rec.data.fwd_tsn_cnt = 0;
}
- if (old) {
- strseq->stream = htons(at->rec.data.stream_number);
- strseq->sequence = htons((uint16_t) at->rec.data.stream_seq);
- strseq++;
- } else {
- strseq_m->stream = htons(at->rec.data.stream_number);
+ if (asoc->idata_supported) {
+ strseq_m->sid = htons(at->rec.data.sid);
if (at->rec.data.rcv_flags & SCTP_DATA_UNORDERED) {
strseq_m->flags = htons(PR_SCTP_UNORDERED_FLAG);
} else {
strseq_m->flags = 0;
}
- strseq_m->msg_id = htonl(at->rec.data.stream_seq);
+ strseq_m->mid = htonl(at->rec.data.mid);
strseq_m++;
+ } else {
+ strseq->sid = htons(at->rec.data.sid);
+ strseq->ssn = htons((uint16_t) at->rec.data.mid);
+ strseq++;
}
i++;
}
@@ -11019,23 +10944,18 @@ sctp_send_resp_msg(struct sockaddr *src, struct sockaddr *dst,
struct mbuf *mout;
struct sctphdr *shout;
struct sctp_chunkhdr *ch;
-
#if defined(INET) || defined(INET6)
struct udphdr *udp;
int ret;
-
#endif
int len, cause_len, padding_len;
-
#ifdef INET
struct sockaddr_in *src_sin, *dst_sin;
struct ip *ip;
-
#endif
#ifdef INET6
struct sockaddr_in6 *src_sin6, *dst_sin6;
struct ip6_hdr *ip6;
-
#endif
/* Compute the length of the cause and add final padding. */
@@ -11624,10 +11544,8 @@ sctp_send_cwr(struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t high_tsn, u
asoc = &stcb->asoc;
TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) {
if ((chk->rec.chunk_id.id == SCTP_ECN_CWR) && (net == chk->whoTo)) {
- /*
- * found a previous CWR queued to same destination
- * update it if needed
- */
+ /* found a previous CWR queued to same destination
+ * update it if needed */
uint32_t ctsn;
cwr = mtod(chk->data, struct sctp_cwr_chunk *);
@@ -12171,10 +12089,8 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb,
struct sctp_stream_out *oldstream;
struct sctp_stream_queue_pending *sp, *nsp;
int i;
-
#if defined(SCTP_DETAILED_STR_STATS)
int j;
-
#endif
oldstream = stcb->asoc.strmout;
@@ -12203,13 +12119,11 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb,
stcb->asoc.strmout[i].next_mid_ordered = oldstream[i].next_mid_ordered;
stcb->asoc.strmout[i].next_mid_unordered = oldstream[i].next_mid_unordered;
stcb->asoc.strmout[i].last_msg_incomplete = oldstream[i].last_msg_incomplete;
- stcb->asoc.strmout[i].stream_no = i;
+ stcb->asoc.strmout[i].sid = i;
stcb->asoc.strmout[i].state = oldstream[i].state;
/* FIX ME FIX ME */
- /*
- * This should be a SS_COPY operation FIX ME STREAM
- * SCHEDULER EXPERT
- */
+ /* This should be a SS_COPY operation FIX ME STREAM
+ * SCHEDULER EXPERT */
stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], &oldstream[i]);
/* now anything on those queues? */
TAILQ_FOREACH_SAFE(sp, &oldstream[i].outqueue, next, nsp) {
@@ -12234,7 +12148,7 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb,
#endif
stcb->asoc.strmout[i].next_mid_ordered = 0;
stcb->asoc.strmout[i].next_mid_unordered = 0;
- stcb->asoc.strmout[i].stream_no = i;
+ stcb->asoc.strmout[i].sid = i;
stcb->asoc.strmout[i].last_msg_incomplete = 0;
stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL);
stcb->asoc.strmout[i].state = SCTP_STREAM_CLOSED;
@@ -12393,7 +12307,7 @@ sctp_copy_it_in(struct sctp_tcb *stcb,
sp->fsn = 0;
(void)SCTP_GETTIME_TIMEVAL(&sp->ts);
- sp->stream = srcv->sinfo_stream;
+ sp->sid = srcv->sinfo_stream;
sp->length = (uint32_t) min(uio->uio_resid, max_send_len);
if ((sp->length == (uint32_t) uio->uio_resid) &&
((user_marks_eor == 0) ||
@@ -12453,10 +12367,8 @@ sctp_sosend(struct socket *so,
int error, use_sndinfo = 0;
struct sctp_sndrcvinfo sndrcvninfo;
struct sockaddr *addr_to_use;
-
#if defined(INET) && defined(INET6)
struct sockaddr_in sin;
-
#endif
if (control) {
@@ -12741,10 +12653,8 @@ sctp_lower_sosend(struct socket *so,
}
if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) {
stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED;
- /*
- * Set the connected flag so we can queue
- * data
- */
+ /* Set the connected flag so we can queue
+ * data */
soisconnecting(so);
}
hold_tcblock = 1;
@@ -12754,10 +12664,8 @@ sctp_lower_sosend(struct socket *so,
} else {
SCTP_PRINTF("Huh-3? create lock should have been on??\n");
}
- /*
- * Turn on queue only flag to prevent data from
- * being sent
- */
+ /* Turn on queue only flag to prevent data from
+ * being sent */
queue_only = 1;
asoc = &stcb->asoc;
SCTP_SET_STATE(asoc, SCTP_STATE_COOKIE_WAIT);
@@ -13252,10 +13160,8 @@ skip_preblock:
}
/* PR-SCTP? */
if ((asoc->prsctp_supported) && (asoc->sent_queue_cnt_removeable > 0)) {
- /*
- * This is ugly but we must assure locking
- * order
- */
+ /* This is ugly but we must assure locking
+ * order */
if (hold_tcblock == 0) {
SCTP_TCB_LOCK(stcb);
hold_tcblock = 1;
@@ -13532,10 +13438,8 @@ dataless_eof:
msg);
sctp_abort_an_association(stcb->sctp_ep, stcb,
op_err, SCTP_SO_LOCKED);
- /*
- * now relock the stcb so everything
- * is sane
- */
+ /* now relock the stcb so everything
+ * is sane */
hold_tcblock = 0;
stcb = NULL;
goto out;
@@ -13609,10 +13513,8 @@ skip_out_eof:
if ((queue_only == 0) && (nagle_applies == 0) && (stcb->asoc.peers_rwnd && un_sent)) {
/* we can attempt to send too. */
if (hold_tcblock == 0) {
- /*
- * If there is activity recv'ing sacks no need to
- * send
- */
+ /* If there is activity recv'ing sacks no need to
+ * send */
if (SCTP_TCB_TRYLOCK(stcb)) {
sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED);
hold_tcblock = 1;
@@ -13751,6 +13653,7 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t * ro)
return (0);
/* get prefix entry of address */
+ ND6_RLOCK();
LIST_FOREACH(pfx, &MODULE_GLOBAL(nd_prefix), ndpr_entry) {
if (pfx->ndpr_stateflags & NDPRF_DETACHED)
continue;
@@ -13760,6 +13663,7 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t * ro)
}
/* no prefix entry in the prefix list */
if (pfx == NULL) {
+ ND6_RUNLOCK();
SCTPDBG(SCTP_DEBUG_OUTPUT2, "No prefix entry for ");
SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)src6);
return (0);
@@ -13778,16 +13682,16 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t * ro)
SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)&gw6);
SCTPDBG(SCTP_DEBUG_OUTPUT2, "installed router is ");
SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, ro->ro_rt->rt_gateway);
- if (sctp_cmpaddr((struct sockaddr *)&gw6,
- ro->ro_rt->rt_gateway)) {
+ if (sctp_cmpaddr((struct sockaddr *)&gw6, ro->ro_rt->rt_gateway)) {
+ ND6_RUNLOCK();
SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is installed\n");
return (1);
}
}
+ ND6_RUNLOCK();
SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is not installed\n");
return (0);
}
-
#endif
int