mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-18 10:35:55 +00:00
Cleanup the names of SSN, SID, TSN, FSN, PPID and MID.
This made a couple of bugs visible in handling SSN wrap-arounds when using DATA chunks. Now bulk transfer seems to work fine... This fixes the issue reported in https://github.com/sctplab/usrsctp/issues/111 MFC after: 1 week
This commit is contained in:
parent
7dc45d65e3
commit
49656eefc8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=309682
@ -205,7 +205,7 @@ sctp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
asoc->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -218,7 +218,7 @@ sctp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
net->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
net->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
net->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_SEND,
|
||||
@ -1698,7 +1698,7 @@ sctp_hs_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
asoc->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1711,7 +1711,7 @@ sctp_hs_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
net->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
net->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
net->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_SEND,
|
||||
@ -2228,7 +2228,7 @@ sctp_htcp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
asoc->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
asoc->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2241,7 +2241,7 @@ sctp_htcp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
/* Mark end of the window */
|
||||
net->fast_recovery_tsn = asoc->sending_seq - 1;
|
||||
} else {
|
||||
net->fast_recovery_tsn = lchk->rec.data.TSN_seq - 1;
|
||||
net->fast_recovery_tsn = lchk->rec.data.tsn - 1;
|
||||
}
|
||||
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_SEND,
|
||||
|
@ -898,8 +898,9 @@ __FBSDID("$FreeBSD$");
|
||||
#define SCTP_SSN_GE(a, b) SCTP_UINT16_GE(a, b)
|
||||
#define SCTP_TSN_GT(a, b) SCTP_UINT32_GT(a, b)
|
||||
#define SCTP_TSN_GE(a, b) SCTP_UINT32_GE(a, b)
|
||||
#define SCTP_MSGID_GT(o, a, b) ((o == 1) ? SCTP_UINT16_GT((uint16_t)a, (uint16_t)b) : SCTP_UINT32_GT(a, b))
|
||||
#define SCTP_MSGID_GE(o, a, b) ((o == 1) ? SCTP_UINT16_GE((uint16_t)a, (uint16_t)b) : SCTP_UINT32_GE(a, b))
|
||||
#define SCTP_MID_GT(i, a, b) (((i) == 1) ? SCTP_UINT32_GT(a, b) : SCTP_UINT16_GT((uint16_t)a, (uint16_t)b))
|
||||
#define SCTP_MID_GE(i, a, b) (((i) == 1) ? SCTP_UINT32_GE(a, b) : SCTP_UINT16_GE((uint16_t)a, (uint16_t)b))
|
||||
#define SCTP_MID_EQ(i, a, b) (((i) == 1) ? a == b : (uint16_t)a == (uint16_t)b)
|
||||
|
||||
/* Mapping array manipulation routines */
|
||||
#define SCTP_IS_TSN_PRESENT(arry, gap) ((arry[(gap >> 3)] >> (gap & 0x07)) & 0x01)
|
||||
|
@ -141,9 +141,9 @@ struct sctp_supported_chunk_types_param {
|
||||
*/
|
||||
struct sctp_data {
|
||||
uint32_t tsn;
|
||||
uint16_t stream_id;
|
||||
uint16_t stream_sequence;
|
||||
uint32_t protocol_id;
|
||||
uint16_t sid;
|
||||
uint16_t ssn;
|
||||
uint32_t ppid;
|
||||
/* user data follows */
|
||||
} SCTP_PACKED;
|
||||
|
||||
@ -154,11 +154,11 @@ struct sctp_data_chunk {
|
||||
|
||||
struct sctp_idata {
|
||||
uint32_t tsn;
|
||||
uint16_t stream_id;
|
||||
uint16_t sid;
|
||||
uint16_t reserved; /* Where does the SSN go? */
|
||||
uint32_t msg_id;
|
||||
uint32_t mid;
|
||||
union {
|
||||
uint32_t protocol_id;
|
||||
uint32_t ppid;
|
||||
uint32_t fsn; /* Fragment Sequence Number */
|
||||
} ppid_fsn;
|
||||
/* user data follows */
|
||||
@ -390,14 +390,14 @@ struct sctp_forward_tsn_chunk {
|
||||
} SCTP_PACKED;
|
||||
|
||||
struct sctp_strseq {
|
||||
uint16_t stream;
|
||||
uint16_t sequence;
|
||||
uint16_t sid;
|
||||
uint16_t ssn;
|
||||
} SCTP_PACKED;
|
||||
|
||||
struct sctp_strseq_mid {
|
||||
uint16_t stream;
|
||||
uint16_t sid;
|
||||
uint16_t flags;
|
||||
uint32_t msg_id;
|
||||
uint32_t mid;
|
||||
};
|
||||
|
||||
struct sctp_forward_tsn_msg {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -42,20 +42,19 @@ struct sctp_queued_to_read *
|
||||
sctp_build_readq_entry(struct sctp_tcb *stcb,
|
||||
struct sctp_nets *net,
|
||||
uint32_t tsn, uint32_t ppid,
|
||||
uint32_t context, uint16_t stream_no,
|
||||
uint32_t stream_seq, uint8_t flags,
|
||||
uint32_t context, uint16_t sid,
|
||||
uint32_t mid, uint8_t flags,
|
||||
struct mbuf *dm);
|
||||
|
||||
|
||||
#define sctp_build_readq_entry_mac(_ctl, in_it, context, net, tsn, ppid, stream_no, stream_seq, flags, dm, tfsn, msgid) do { \
|
||||
#define sctp_build_readq_entry_mac(_ctl, in_it, context, net, tsn, ppid, sid, flags, dm, tfsn, mid) do { \
|
||||
if (_ctl) { \
|
||||
atomic_add_int(&((net)->ref_count), 1); \
|
||||
memset(_ctl, 0, sizeof(struct sctp_queued_to_read)); \
|
||||
(_ctl)->sinfo_stream = stream_no; \
|
||||
(_ctl)->sinfo_ssn = stream_seq; \
|
||||
(_ctl)->sinfo_stream = sid; \
|
||||
TAILQ_INIT(&_ctl->reasm); \
|
||||
(_ctl)->top_fsn = tfsn; \
|
||||
(_ctl)->msg_id = msgid; \
|
||||
(_ctl)->mid = mid; \
|
||||
(_ctl)->sinfo_flags = (flags << 8); \
|
||||
(_ctl)->sinfo_ppid = ppid; \
|
||||
(_ctl)->sinfo_context = context; \
|
||||
|
@ -318,14 +318,14 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb)
|
||||
/* abandon the upper streams */
|
||||
newcnt = ntohs(init->num_inbound_streams);
|
||||
TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) {
|
||||
if (chk->rec.data.stream_number >= newcnt) {
|
||||
if (chk->rec.data.sid >= newcnt) {
|
||||
TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next);
|
||||
asoc->send_queue_cnt--;
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
#ifdef INVARIANTS
|
||||
} else {
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.stream_number);
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
|
||||
#endif
|
||||
}
|
||||
if (chk->data != NULL) {
|
||||
@ -410,8 +410,8 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb)
|
||||
return (-1);
|
||||
}
|
||||
for (i = 0; i < asoc->streamincnt; i++) {
|
||||
asoc->strmin[i].stream_no = i;
|
||||
asoc->strmin[i].last_sequence_delivered = 0xffffffff;
|
||||
asoc->strmin[i].sid = i;
|
||||
asoc->strmin[i].last_mid_delivered = 0xffffffff;
|
||||
TAILQ_INIT(&asoc->strmin[i].inqueue);
|
||||
TAILQ_INIT(&asoc->strmin[i].uno_inqueue);
|
||||
asoc->strmin[i].pd_api_started = 0;
|
||||
@ -1955,7 +1955,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset,
|
||||
asoc->strmout[i].abandoned_sent[0] = 0;
|
||||
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].next_mid_ordered = 0;
|
||||
stcb->asoc.strmout[i].next_mid_unordered = 0;
|
||||
stcb->asoc.strmout[i].last_msg_incomplete = 0;
|
||||
@ -3027,18 +3027,18 @@ sctp_handle_ecn_echo(struct sctp_ecne_chunk *cp,
|
||||
if (lchk == NULL) {
|
||||
window_data_tsn = stcb->asoc.sending_seq - 1;
|
||||
} else {
|
||||
window_data_tsn = lchk->rec.data.TSN_seq;
|
||||
window_data_tsn = lchk->rec.data.tsn;
|
||||
}
|
||||
|
||||
/* Find where it was sent to if possible. */
|
||||
net = NULL;
|
||||
TAILQ_FOREACH(lchk, &stcb->asoc.sent_queue, sctp_next) {
|
||||
if (lchk->rec.data.TSN_seq == tsn) {
|
||||
if (lchk->rec.data.tsn == tsn) {
|
||||
net = lchk->whoTo;
|
||||
net->ecn_prev_cwnd = lchk->rec.data.cwnd_at_send;
|
||||
break;
|
||||
}
|
||||
if (SCTP_TSN_GT(lchk->rec.data.TSN_seq, tsn)) {
|
||||
if (SCTP_TSN_GT(lchk->rec.data.tsn, tsn)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -3228,11 +3228,11 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc,
|
||||
|
||||
tsn = ntohl(desc->tsn_ifany);
|
||||
TAILQ_FOREACH(tp1, &stcb->asoc.sent_queue, sctp_next) {
|
||||
if (tp1->rec.data.TSN_seq == tsn) {
|
||||
if (tp1->rec.data.tsn == tsn) {
|
||||
/* found it */
|
||||
break;
|
||||
}
|
||||
if (SCTP_TSN_GT(tp1->rec.data.TSN_seq, tsn)) {
|
||||
if (SCTP_TSN_GT(tp1->rec.data.tsn, tsn)) {
|
||||
/* not found */
|
||||
tp1 = NULL;
|
||||
break;
|
||||
@ -3245,7 +3245,7 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc,
|
||||
*/
|
||||
SCTP_STAT_INCR(sctps_pdrpdnfnd);
|
||||
TAILQ_FOREACH(tp1, &stcb->asoc.sent_queue, sctp_next) {
|
||||
if (tp1->rec.data.TSN_seq == tsn) {
|
||||
if (tp1->rec.data.tsn == tsn) {
|
||||
/* found it */
|
||||
break;
|
||||
}
|
||||
@ -3311,7 +3311,7 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc,
|
||||
if (TAILQ_EMPTY(&stcb->asoc.send_queue)) {
|
||||
tp1->rec.data.fast_retran_tsn = stcb->asoc.sending_seq;
|
||||
} else {
|
||||
tp1->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.TSN_seq;
|
||||
tp1->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.tsn;
|
||||
}
|
||||
|
||||
/* restart the timer */
|
||||
@ -3327,7 +3327,7 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc,
|
||||
tp1->whoTo->flight_size,
|
||||
tp1->book_size,
|
||||
(uint32_t) (uintptr_t) stcb,
|
||||
tp1->rec.data.TSN_seq);
|
||||
tp1->rec.data.tsn);
|
||||
}
|
||||
if (tp1->sent < SCTP_DATAGRAM_RESEND) {
|
||||
sctp_flight_size_decrease(tp1);
|
||||
@ -3471,12 +3471,12 @@ sctp_reset_in_stream(struct sctp_tcb *stcb, uint32_t number_entries, uint16_t *
|
||||
if (temp >= stcb->asoc.streamincnt) {
|
||||
continue;
|
||||
}
|
||||
stcb->asoc.strmin[temp].last_sequence_delivered = 0xffffffff;
|
||||
stcb->asoc.strmin[temp].last_mid_delivered = 0xffffffff;
|
||||
}
|
||||
} else {
|
||||
list = NULL;
|
||||
for (i = 0; i < stcb->asoc.streamincnt; i++) {
|
||||
stcb->asoc.strmin[i].last_sequence_delivered = 0xffffffff;
|
||||
stcb->asoc.strmin[i].last_mid_delivered = 0xffffffff;
|
||||
}
|
||||
}
|
||||
sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_RECV, stcb, number_entries, (void *)list, SCTP_SO_NOT_LOCKED);
|
||||
@ -4018,8 +4018,8 @@ sctp_handle_str_reset_add_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk *ch
|
||||
for (i = 0; i < stcb->asoc.streamincnt; i++) {
|
||||
TAILQ_INIT(&stcb->asoc.strmin[i].inqueue);
|
||||
TAILQ_INIT(&stcb->asoc.strmin[i].uno_inqueue);
|
||||
stcb->asoc.strmin[i].stream_no = i;
|
||||
stcb->asoc.strmin[i].last_sequence_delivered = oldstrm[i].last_sequence_delivered;
|
||||
stcb->asoc.strmin[i].sid = i;
|
||||
stcb->asoc.strmin[i].last_mid_delivered = oldstrm[i].last_mid_delivered;
|
||||
stcb->asoc.strmin[i].delivery_started = oldstrm[i].delivery_started;
|
||||
stcb->asoc.strmin[i].pd_api_started = oldstrm[i].pd_api_started;
|
||||
/* now anything on those queues? */
|
||||
@ -4036,8 +4036,8 @@ sctp_handle_str_reset_add_strm(struct sctp_tcb *stcb, struct sctp_tmit_chunk *ch
|
||||
for (i = stcb->asoc.streamincnt; i < num_stream; i++) {
|
||||
TAILQ_INIT(&stcb->asoc.strmin[i].inqueue);
|
||||
TAILQ_INIT(&stcb->asoc.strmin[i].uno_inqueue);
|
||||
stcb->asoc.strmin[i].stream_no = i;
|
||||
stcb->asoc.strmin[i].last_sequence_delivered = 0xffffffff;
|
||||
stcb->asoc.strmin[i].sid = i;
|
||||
stcb->asoc.strmin[i].last_mid_delivered = 0xffffffff;
|
||||
stcb->asoc.strmin[i].pd_api_started = 0;
|
||||
stcb->asoc.strmin[i].delivery_started = 0;
|
||||
}
|
||||
|
@ -3638,7 +3638,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);
|
||||
@ -6348,7 +6348,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;
|
||||
@ -6931,14 +6931,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 */
|
||||
@ -6949,7 +6949,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);
|
||||
@ -6978,7 +6978,7 @@ sctp_clean_up_datalist(struct sctp_tcb *stcb,
|
||||
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]);
|
||||
@ -7146,7 +7146,7 @@ sctp_move_to_outqueue(struct sctp_tcb *stcb,
|
||||
(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;
|
||||
}
|
||||
@ -7493,28 +7493,28 @@ sctp_move_to_outqueue(struct sctp_tcb *stcb,
|
||||
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;
|
||||
|
||||
@ -7532,12 +7532,12 @@ sctp_move_to_outqueue(struct sctp_tcb *stcb,
|
||||
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 *);
|
||||
@ -7555,9 +7555,9 @@ sctp_move_to_outqueue(struct sctp_tcb *stcb,
|
||||
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;
|
||||
@ -7568,20 +7568,20 @@ sctp_move_to_outqueue(struct sctp_tcb *stcb,
|
||||
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++;
|
||||
@ -8817,7 +8817,7 @@ sctp_med_chunk_output(struct sctp_inpcb *inp,
|
||||
}
|
||||
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);
|
||||
@ -9498,7 +9498,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)) &&
|
||||
@ -9507,7 +9507,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);
|
||||
@ -9541,7 +9541,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
|
||||
@ -9751,7 +9751,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp,
|
||||
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);
|
||||
@ -9801,7 +9801,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp,
|
||||
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]);
|
||||
@ -10196,13 +10196,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) {
|
||||
@ -10256,18 +10250,18 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
/* 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) {
|
||||
space_needed = (sizeof(struct sctp_forward_tsn_chunk) +
|
||||
(cnt_of_skipped * sizeof(struct sctp_strseq)));
|
||||
} else {
|
||||
if (asoc->idata_supported) {
|
||||
space_needed = (sizeof(struct sctp_forward_tsn_chunk) +
|
||||
(cnt_of_skipped * sizeof(struct sctp_strseq_mid)));
|
||||
} else {
|
||||
space_needed = (sizeof(struct sctp_forward_tsn_chunk) +
|
||||
(cnt_of_skipped * sizeof(struct sctp_strseq)));
|
||||
}
|
||||
cnt_of_space = (unsigned int)M_TRAILINGSPACE(chk->data);
|
||||
|
||||
@ -10296,12 +10290,11 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
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
|
||||
@ -10319,7 +10312,7 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
}
|
||||
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;
|
||||
@ -10328,14 +10321,14 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
* peer ack point
|
||||
*/
|
||||
if (last) {
|
||||
advance_peer_ack_point = last->rec.data.TSN_seq;
|
||||
advance_peer_ack_point = last->rec.data.tsn;
|
||||
}
|
||||
if (old) {
|
||||
space_needed = sizeof(struct sctp_forward_tsn_chunk) +
|
||||
cnt_of_skipped * sizeof(struct sctp_strseq);
|
||||
} else {
|
||||
if (asoc->idata_supported) {
|
||||
space_needed = sizeof(struct sctp_forward_tsn_chunk) +
|
||||
cnt_of_skipped * sizeof(struct sctp_strseq_mid);
|
||||
} else {
|
||||
space_needed = sizeof(struct sctp_forward_tsn_chunk) +
|
||||
cnt_of_skipped * sizeof(struct sctp_strseq);
|
||||
}
|
||||
}
|
||||
chk->send_size = space_needed;
|
||||
@ -10343,10 +10336,10 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
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;
|
||||
@ -10355,10 +10348,10 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
* 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;
|
||||
} else {
|
||||
strseq = (struct sctp_strseq *)fwdtsn;
|
||||
}
|
||||
/*-
|
||||
* Now populate the strseq list. This is done blindly
|
||||
@ -10377,26 +10370,26 @@ send_forward_tsn(struct sctp_tcb *stcb,
|
||||
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++;
|
||||
}
|
||||
@ -12122,7 +12115,7 @@ 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
|
||||
@ -12151,7 +12144,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;
|
||||
@ -12310,7 +12303,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) ||
|
||||
|
@ -4778,7 +4778,7 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
|
||||
uint32_t strseq;
|
||||
|
||||
stcb->asoc.control_pdapi = sq;
|
||||
strseq = (sq->sinfo_stream << 16) | sq->sinfo_ssn;
|
||||
strseq = (sq->sinfo_stream << 16) | (sq->mid & 0x0000ffff);
|
||||
sctp_ulp_notify(SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION,
|
||||
stcb,
|
||||
SCTP_PARTIAL_DELIVERY_ABORTED,
|
||||
@ -4999,11 +4999,11 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
|
||||
}
|
||||
/* pending send queue SHOULD be empty */
|
||||
TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) {
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
#ifdef INVARIANTS
|
||||
} else {
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.stream_number);
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
|
||||
#endif
|
||||
}
|
||||
TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next);
|
||||
@ -5031,11 +5031,11 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre
|
||||
/* sent queue SHOULD be empty */
|
||||
TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) {
|
||||
if (chk->sent != SCTP_DATAGRAM_NR_ACKED) {
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
#ifdef INVARIANTS
|
||||
} else {
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.stream_number);
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -6841,7 +6841,7 @@ sctp_drain_mbufs(struct sctp_tcb *stcb)
|
||||
/* Now its reasm? */
|
||||
TAILQ_FOREACH_SAFE(chk, &ctl->reasm, sctp_next, nchk) {
|
||||
cnt++;
|
||||
SCTP_CALC_TSN_TO_GAP(gap, chk->rec.data.TSN_seq, asoc->mapping_array_base_tsn);
|
||||
SCTP_CALC_TSN_TO_GAP(gap, chk->rec.data.tsn, asoc->mapping_array_base_tsn);
|
||||
asoc->size_on_reasm_queue = sctp_sbspace_sub(asoc->size_on_reasm_queue, chk->send_size);
|
||||
sctp_ucount_decr(asoc->cnt_on_reasm_queue);
|
||||
SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap);
|
||||
@ -6883,7 +6883,7 @@ sctp_drain_mbufs(struct sctp_tcb *stcb)
|
||||
/* Now its reasm? */
|
||||
TAILQ_FOREACH_SAFE(chk, &ctl->reasm, sctp_next, nchk) {
|
||||
cnt++;
|
||||
SCTP_CALC_TSN_TO_GAP(gap, chk->rec.data.TSN_seq, asoc->mapping_array_base_tsn);
|
||||
SCTP_CALC_TSN_TO_GAP(gap, chk->rec.data.tsn, asoc->mapping_array_base_tsn);
|
||||
asoc->size_on_reasm_queue = sctp_sbspace_sub(asoc->size_on_reasm_queue, chk->send_size);
|
||||
sctp_ucount_decr(asoc->cnt_on_reasm_queue);
|
||||
SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap);
|
||||
|
@ -292,7 +292,7 @@ sctp_ss_rr_add(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
TAILQ_INSERT_HEAD(&asoc->ss_data.out.wheel, strq, ss_params.rr.next_spoke);
|
||||
} else {
|
||||
strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel);
|
||||
while (strqt != NULL && (strqt->stream_no < strq->stream_no)) {
|
||||
while (strqt != NULL && (strqt->sid < strq->sid)) {
|
||||
strqt = TAILQ_NEXT(strqt, ss_params.rr.next_spoke);
|
||||
}
|
||||
if (strqt != NULL) {
|
||||
@ -857,7 +857,7 @@ sctp_ss_fcfs_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net,
|
||||
sp = TAILQ_FIRST(&asoc->ss_data.out.list);
|
||||
default_again:
|
||||
if (sp != NULL) {
|
||||
strq = &asoc->strmout[sp->stream];
|
||||
strq = &asoc->strmout[sp->sid];
|
||||
} else {
|
||||
strq = NULL;
|
||||
}
|
||||
|
@ -388,10 +388,10 @@ struct sctp_nets {
|
||||
|
||||
|
||||
struct sctp_data_chunkrec {
|
||||
uint32_t TSN_seq; /* the TSN of this transmit */
|
||||
uint32_t stream_seq; /* the stream sequence number of this transmit */
|
||||
uint16_t stream_number; /* the stream number of this guy */
|
||||
uint32_t payloadtype;
|
||||
uint32_t tsn; /* the TSN of this transmit */
|
||||
uint32_t mid; /* the message identifier of this transmit */
|
||||
uint16_t sid; /* the stream number of this guy */
|
||||
uint32_t ppid;
|
||||
uint32_t context; /* from send */
|
||||
uint32_t cwnd_at_send;
|
||||
/*
|
||||
@ -400,7 +400,7 @@ struct sctp_data_chunkrec {
|
||||
*/
|
||||
uint32_t fast_retran_tsn; /* sending_seq at the time of FR */
|
||||
struct timeval timetodrop; /* time we drop it from queue */
|
||||
uint32_t fsn_num; /* Fragment Sequence Number */
|
||||
uint32_t fsn; /* Fragment Sequence Number */
|
||||
uint8_t doing_fast_retransmit;
|
||||
uint8_t rcv_flags; /* flags pulled from data chunk on inbound for
|
||||
* outbound holds sending flags for PR-SCTP. */
|
||||
@ -454,7 +454,6 @@ struct sctp_tmit_chunk {
|
||||
|
||||
struct sctp_queued_to_read { /* sinfo structure Pluse more */
|
||||
uint16_t sinfo_stream; /* off the wire */
|
||||
uint32_t sinfo_ssn; /* off the wire */
|
||||
uint16_t sinfo_flags; /* SCTP_UNORDERED from wire use SCTP_EOF for
|
||||
* EOR */
|
||||
uint32_t sinfo_ppid; /* off the wire */
|
||||
@ -464,7 +463,7 @@ struct sctp_queued_to_read { /* sinfo structure Pluse more */
|
||||
uint32_t sinfo_cumtsn; /* Use this in reassembly as last TSN */
|
||||
sctp_assoc_t sinfo_assoc_id; /* our assoc id */
|
||||
/* Non sinfo stuff */
|
||||
uint32_t msg_id; /* Fragment Index */
|
||||
uint32_t mid; /* Fragment Index */
|
||||
uint32_t length; /* length of data */
|
||||
uint32_t held_length; /* length held in sb */
|
||||
uint32_t top_fsn; /* Highest FSN in queue */
|
||||
@ -526,7 +525,7 @@ struct sctp_stream_queue_pending {
|
||||
uint32_t ppid;
|
||||
uint32_t context;
|
||||
uint16_t sinfo_flags;
|
||||
uint16_t stream;
|
||||
uint16_t sid;
|
||||
uint16_t act_flags;
|
||||
uint16_t auth_keyid;
|
||||
uint8_t holds_key_ref;
|
||||
@ -545,8 +544,8 @@ TAILQ_HEAD(sctpwheelunrel_listhead, sctp_stream_in);
|
||||
struct sctp_stream_in {
|
||||
struct sctp_readhead inqueue;
|
||||
struct sctp_readhead uno_inqueue;
|
||||
uint32_t last_sequence_delivered; /* used for re-order */
|
||||
uint16_t stream_no;
|
||||
uint32_t last_mid_delivered; /* used for re-order */
|
||||
uint16_t sid;
|
||||
uint8_t delivery_started;
|
||||
uint8_t pd_api_started;
|
||||
};
|
||||
@ -629,7 +628,7 @@ struct sctp_stream_out {
|
||||
*/
|
||||
uint32_t next_mid_ordered;
|
||||
uint32_t next_mid_unordered;
|
||||
uint16_t stream_no;
|
||||
uint16_t sid;
|
||||
uint8_t last_msg_incomplete;
|
||||
uint8_t state;
|
||||
};
|
||||
|
@ -429,17 +429,17 @@ sctp_recover_sent_list(struct sctp_tcb *stcb)
|
||||
|
||||
asoc = &stcb->asoc;
|
||||
TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) {
|
||||
if (SCTP_TSN_GE(asoc->last_acked_seq, chk->rec.data.TSN_seq)) {
|
||||
if (SCTP_TSN_GE(asoc->last_acked_seq, chk->rec.data.tsn)) {
|
||||
SCTP_PRINTF("Found chk:%p tsn:%x <= last_acked_seq:%x\n",
|
||||
(void *)chk, chk->rec.data.TSN_seq, asoc->last_acked_seq);
|
||||
(void *)chk, chk->rec.data.tsn, asoc->last_acked_seq);
|
||||
if (chk->sent != SCTP_DATAGRAM_NR_ACKED) {
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
}
|
||||
}
|
||||
if ((asoc->strmout[chk->rec.data.stream_number].chunks_on_queues == 0) &&
|
||||
(asoc->strmout[chk->rec.data.stream_number].state == SCTP_STREAM_RESET_PENDING) &&
|
||||
TAILQ_EMPTY(&asoc->strmout[chk->rec.data.stream_number].outqueue)) {
|
||||
if ((asoc->strmout[chk->rec.data.sid].chunks_on_queues == 0) &&
|
||||
(asoc->strmout[chk->rec.data.sid].state == SCTP_STREAM_RESET_PENDING) &&
|
||||
TAILQ_EMPTY(&asoc->strmout[chk->rec.data.sid].outqueue)) {
|
||||
asoc->trigger_reset = 1;
|
||||
}
|
||||
TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next);
|
||||
@ -462,7 +462,7 @@ sctp_recover_sent_list(struct sctp_tcb *stcb)
|
||||
}
|
||||
SCTP_PRINTF("after recover order is as follows\n");
|
||||
TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) {
|
||||
SCTP_PRINTF("chk:%p TSN:%x\n", (void *)chk, chk->rec.data.TSN_seq);
|
||||
SCTP_PRINTF("chk:%p TSN:%x\n", (void *)chk, chk->rec.data.tsn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -546,10 +546,10 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
start_again:
|
||||
#endif
|
||||
TAILQ_FOREACH_SAFE(chk, &stcb->asoc.sent_queue, sctp_next, nchk) {
|
||||
if (SCTP_TSN_GE(stcb->asoc.last_acked_seq, chk->rec.data.TSN_seq)) {
|
||||
if (SCTP_TSN_GE(stcb->asoc.last_acked_seq, chk->rec.data.tsn)) {
|
||||
/* Strange case our list got out of order? */
|
||||
SCTP_PRINTF("Our list is out of order? last_acked:%x chk:%x\n",
|
||||
(unsigned int)stcb->asoc.last_acked_seq, (unsigned int)chk->rec.data.TSN_seq);
|
||||
(unsigned int)stcb->asoc.last_acked_seq, (unsigned int)chk->rec.data.tsn);
|
||||
recovery_cnt++;
|
||||
#ifdef INVARIANTS
|
||||
panic("last acked >= chk on sent-Q");
|
||||
@ -574,7 +574,7 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
|
||||
/* validate its been outstanding long enough */
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
|
||||
sctp_log_fr(chk->rec.data.TSN_seq,
|
||||
sctp_log_fr(chk->rec.data.tsn,
|
||||
chk->sent_rcv_time.tv_sec,
|
||||
chk->sent_rcv_time.tv_usec,
|
||||
SCTP_FR_T3_MARK_TIME);
|
||||
@ -638,11 +638,11 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
num_mk++;
|
||||
if (fir == 0) {
|
||||
fir = 1;
|
||||
tsnfirst = chk->rec.data.TSN_seq;
|
||||
tsnfirst = chk->rec.data.tsn;
|
||||
}
|
||||
tsnlast = chk->rec.data.TSN_seq;
|
||||
tsnlast = chk->rec.data.tsn;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
|
||||
sctp_log_fr(chk->rec.data.TSN_seq, chk->snd_count,
|
||||
sctp_log_fr(chk->rec.data.tsn, chk->snd_count,
|
||||
0, SCTP_FR_T3_MARKED);
|
||||
}
|
||||
if (chk->rec.data.chunk_was_revoked) {
|
||||
@ -657,7 +657,7 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
chk->whoTo->flight_size,
|
||||
chk->book_size,
|
||||
(uint32_t) (uintptr_t) chk->whoTo,
|
||||
chk->rec.data.TSN_seq);
|
||||
chk->rec.data.tsn);
|
||||
}
|
||||
sctp_flight_size_decrease(chk);
|
||||
sctp_total_flight_decrease(stcb, chk);
|
||||
@ -687,7 +687,7 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
if (TAILQ_EMPTY(&stcb->asoc.send_queue)) {
|
||||
chk->rec.data.fast_retran_tsn = stcb->asoc.sending_seq;
|
||||
} else {
|
||||
chk->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.TSN_seq;
|
||||
chk->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.tsn;
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -785,7 +785,7 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
chk->whoTo->flight_size,
|
||||
chk->book_size,
|
||||
(uint32_t) (uintptr_t) chk->whoTo,
|
||||
chk->rec.data.TSN_seq);
|
||||
chk->rec.data.tsn);
|
||||
}
|
||||
sctp_flight_size_increase(chk);
|
||||
sctp_total_flight_increase(stcb, chk);
|
||||
|
@ -135,7 +135,7 @@ sctp_pathmtu_adjustment(struct sctp_tcb *stcb, uint16_t nxtsz)
|
||||
chk->whoTo->flight_size,
|
||||
chk->book_size,
|
||||
(uint32_t) (uintptr_t) chk->whoTo,
|
||||
chk->rec.data.TSN_seq);
|
||||
chk->rec.data.tsn);
|
||||
}
|
||||
/* Clear any time so NO RTT is being done */
|
||||
chk->do_rtt = 0;
|
||||
|
@ -267,7 +267,7 @@ extern struct pr_usrreqs sctp_usrreqs;
|
||||
if (stcb->asoc.fs_index > SCTP_FS_SPEC_LOG_SIZE) \
|
||||
stcb->asoc.fs_index = 0;\
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].total_flight = stcb->asoc.total_flight; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].tsn = tp1->rec.data.TSN_seq; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].tsn = tp1->rec.data.tsn; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].book = tp1->book_size; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].sent = tp1->sent; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].incr = 0; \
|
||||
@ -288,7 +288,7 @@ extern struct pr_usrreqs sctp_usrreqs;
|
||||
if (stcb->asoc.fs_index > SCTP_FS_SPEC_LOG_SIZE) \
|
||||
stcb->asoc.fs_index = 0;\
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].total_flight = stcb->asoc.total_flight; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].tsn = tp1->rec.data.TSN_seq; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].tsn = tp1->rec.data.tsn; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].book = tp1->book_size; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].sent = tp1->sent; \
|
||||
stcb->asoc.fslog[stcb->asoc.fs_index].incr = 1; \
|
||||
|
@ -268,11 +268,11 @@ sctp_log_strm_del(struct sctp_queued_to_read *control, struct sctp_queued_to_rea
|
||||
}
|
||||
sctp_clog.x.strlog.stcb = control->stcb;
|
||||
sctp_clog.x.strlog.n_tsn = control->sinfo_tsn;
|
||||
sctp_clog.x.strlog.n_sseq = control->sinfo_ssn;
|
||||
sctp_clog.x.strlog.n_sseq = (uint16_t) control->mid;
|
||||
sctp_clog.x.strlog.strm = control->sinfo_stream;
|
||||
if (poschk != NULL) {
|
||||
sctp_clog.x.strlog.e_tsn = poschk->sinfo_tsn;
|
||||
sctp_clog.x.strlog.e_sseq = poschk->sinfo_ssn;
|
||||
sctp_clog.x.strlog.e_sseq = (uint16_t) poschk->mid;
|
||||
} else {
|
||||
sctp_clog.x.strlog.e_tsn = 0;
|
||||
sctp_clog.x.strlog.e_sseq = 0;
|
||||
@ -1131,7 +1131,7 @@ sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
asoc->strmout[i].abandoned_sent[0] = 0;
|
||||
asoc->strmout[i].abandoned_unsent[0] = 0;
|
||||
#endif
|
||||
asoc->strmout[i].stream_no = i;
|
||||
asoc->strmout[i].sid = i;
|
||||
asoc->strmout[i].last_msg_incomplete = 0;
|
||||
asoc->strmout[i].state = SCTP_STREAM_OPENING;
|
||||
asoc->ss_functions.sctp_ss_init_stream(stcb, &asoc->strmout[i], NULL);
|
||||
@ -2975,9 +2975,9 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error,
|
||||
ssfe->ssfe_length = (uint32_t) (notifhdr_len + payload_len);
|
||||
ssfe->ssfe_error = error;
|
||||
/* not exactly what the user sent in, but should be close :) */
|
||||
ssfe->ssfe_info.snd_sid = chk->rec.data.stream_number;
|
||||
ssfe->ssfe_info.snd_sid = chk->rec.data.sid;
|
||||
ssfe->ssfe_info.snd_flags = chk->rec.data.rcv_flags;
|
||||
ssfe->ssfe_info.snd_ppid = chk->rec.data.payloadtype;
|
||||
ssfe->ssfe_info.snd_ppid = chk->rec.data.ppid;
|
||||
ssfe->ssfe_info.snd_context = chk->rec.data.context;
|
||||
ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb);
|
||||
ssfe->ssfe_assoc_id = sctp_get_associd(stcb);
|
||||
@ -2993,10 +2993,10 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error,
|
||||
ssf->ssf_length = (uint32_t) (notifhdr_len + payload_len);
|
||||
ssf->ssf_error = error;
|
||||
/* not exactly what the user sent in, but should be close :) */
|
||||
ssf->ssf_info.sinfo_stream = chk->rec.data.stream_number;
|
||||
ssf->ssf_info.sinfo_ssn = (uint16_t) chk->rec.data.stream_seq;
|
||||
ssf->ssf_info.sinfo_stream = chk->rec.data.sid;
|
||||
ssf->ssf_info.sinfo_ssn = (uint16_t) chk->rec.data.mid;
|
||||
ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags;
|
||||
ssf->ssf_info.sinfo_ppid = chk->rec.data.payloadtype;
|
||||
ssf->ssf_info.sinfo_ppid = chk->rec.data.ppid;
|
||||
ssf->ssf_info.sinfo_context = chk->rec.data.context;
|
||||
ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb);
|
||||
ssf->ssf_assoc_id = sctp_get_associd(stcb);
|
||||
@ -3079,7 +3079,7 @@ sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error,
|
||||
ssfe->ssfe_length = (uint32_t) (notifhdr_len + sp->length);
|
||||
ssfe->ssfe_error = error;
|
||||
/* not exactly what the user sent in, but should be close :) */
|
||||
ssfe->ssfe_info.snd_sid = sp->stream;
|
||||
ssfe->ssfe_info.snd_sid = sp->sid;
|
||||
if (sp->some_taken) {
|
||||
ssfe->ssfe_info.snd_flags = SCTP_DATA_LAST_FRAG;
|
||||
} else {
|
||||
@ -3097,7 +3097,7 @@ sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error,
|
||||
ssf->ssf_length = (uint32_t) (notifhdr_len + sp->length);
|
||||
ssf->ssf_error = error;
|
||||
/* not exactly what the user sent in, but should be close :) */
|
||||
ssf->ssf_info.sinfo_stream = sp->stream;
|
||||
ssf->ssf_info.sinfo_stream = sp->sid;
|
||||
ssf->ssf_info.sinfo_ssn = 0;
|
||||
if (sp->some_taken) {
|
||||
ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG;
|
||||
@ -3847,11 +3847,11 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock,
|
||||
TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next);
|
||||
asoc->sent_queue_cnt--;
|
||||
if (chk->sent != SCTP_DATAGRAM_NR_ACKED) {
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
#ifdef INVARIANTS
|
||||
} else {
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.stream_number);
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -3871,11 +3871,11 @@ sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock,
|
||||
TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) {
|
||||
TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next);
|
||||
asoc->send_queue_cnt--;
|
||||
if (asoc->strmout[chk->rec.data.stream_number].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.stream_number].chunks_on_queues--;
|
||||
if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
|
||||
asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
|
||||
#ifdef INVARIANTS
|
||||
} else {
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.stream_number);
|
||||
panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
|
||||
#endif
|
||||
}
|
||||
if (chk->data != NULL) {
|
||||
@ -4690,25 +4690,26 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
|
||||
struct sctp_stream_out *strq;
|
||||
struct sctp_tmit_chunk *chk = NULL, *tp2;
|
||||
struct sctp_stream_queue_pending *sp;
|
||||
uint16_t stream = 0, seq = 0;
|
||||
uint32_t mid;
|
||||
uint16_t sid;
|
||||
uint8_t foundeom = 0;
|
||||
int ret_sz = 0;
|
||||
int notdone;
|
||||
int do_wakeup_routine = 0;
|
||||
|
||||
stream = tp1->rec.data.stream_number;
|
||||
seq = tp1->rec.data.stream_seq;
|
||||
sid = tp1->rec.data.sid;
|
||||
mid = tp1->rec.data.mid;
|
||||
if (sent || !(tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG)) {
|
||||
stcb->asoc.abandoned_sent[0]++;
|
||||
stcb->asoc.abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++;
|
||||
stcb->asoc.strmout[stream].abandoned_sent[0]++;
|
||||
stcb->asoc.strmout[sid].abandoned_sent[0]++;
|
||||
#if defined(SCTP_DETAILED_STR_STATS)
|
||||
stcb->asoc.strmout[stream].abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++;
|
||||
#endif
|
||||
} else {
|
||||
stcb->asoc.abandoned_unsent[0]++;
|
||||
stcb->asoc.abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++;
|
||||
stcb->asoc.strmout[stream].abandoned_unsent[0]++;
|
||||
stcb->asoc.strmout[sid].abandoned_unsent[0]++;
|
||||
#if defined(SCTP_DETAILED_STR_STATS)
|
||||
stcb->asoc.strmout[stream].abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++;
|
||||
#endif
|
||||
@ -4762,8 +4763,8 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
|
||||
* sent queue.
|
||||
*/
|
||||
TAILQ_FOREACH_SAFE(tp1, &stcb->asoc.send_queue, sctp_next, tp2) {
|
||||
if ((tp1->rec.data.stream_number != stream) ||
|
||||
(tp1->rec.data.stream_seq != seq)) {
|
||||
if ((tp1->rec.data.sid != sid) ||
|
||||
(!SCTP_MID_EQ(stcb->asoc.idata_supported, tp1->rec.data.mid, mid))) {
|
||||
break;
|
||||
}
|
||||
/*
|
||||
@ -4805,7 +4806,7 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
|
||||
* stream out queue.. yuck.
|
||||
*/
|
||||
SCTP_TCB_SEND_LOCK(stcb);
|
||||
strq = &stcb->asoc.strmout[stream];
|
||||
strq = &stcb->asoc.strmout[sid];
|
||||
sp = TAILQ_FIRST(&strq->outqueue);
|
||||
if (sp != NULL) {
|
||||
sp->discard_rest = 1;
|
||||
@ -4832,23 +4833,23 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
|
||||
chk->asoc = &stcb->asoc;
|
||||
if (stcb->asoc.idata_supported == 0) {
|
||||
if (sp->sinfo_flags & SCTP_UNORDERED) {
|
||||
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;
|
||||
}
|
||||
} else {
|
||||
if (sp->sinfo_flags & SCTP_UNORDERED) {
|
||||
chk->rec.data.stream_seq = strq->next_mid_unordered;
|
||||
chk->rec.data.mid = strq->next_mid_unordered;
|
||||
} else {
|
||||
chk->rec.data.stream_seq = strq->next_mid_ordered;
|
||||
chk->rec.data.mid = 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->flags = sp->act_flags;
|
||||
chk->whoTo = NULL;
|
||||
chk->rec.data.TSN_seq = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1);
|
||||
chk->rec.data.tsn = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1);
|
||||
strq->chunks_on_queues++;
|
||||
TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, chk, sctp_next);
|
||||
stcb->asoc.sent_queue_cnt++;
|
||||
@ -5527,7 +5528,7 @@ sctp_sorecvmsg(struct socket *so,
|
||||
/* First lets get off the sinfo and sockaddr info */
|
||||
if ((sinfo != NULL) && (filling_sinfo != 0)) {
|
||||
sinfo->sinfo_stream = control->sinfo_stream;
|
||||
sinfo->sinfo_ssn = (uint16_t) control->sinfo_ssn;
|
||||
sinfo->sinfo_ssn = (uint16_t) control->mid;
|
||||
sinfo->sinfo_flags = control->sinfo_flags;
|
||||
sinfo->sinfo_ppid = control->sinfo_ppid;
|
||||
sinfo->sinfo_context = control->sinfo_context;
|
||||
@ -5603,7 +5604,7 @@ sctp_sorecvmsg(struct socket *so,
|
||||
entry = &inp->readlog[index];
|
||||
entry->vtag = control->sinfo_assoc_id;
|
||||
entry->strm = control->sinfo_stream;
|
||||
entry->seq = control->sinfo_ssn;
|
||||
entry->seq = (uint16_t) control->mid;
|
||||
entry->sz = control->length;
|
||||
entry->flgs = control->sinfo_flags;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user