Lines Matching refs:q
56 static void sctp_check_transmitted(struct sctp_outq *q,
63 static void sctp_mark_missing(struct sctp_outq *q,
69 static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 sack_ctsn);
71 static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout);
74 static inline void sctp_outq_head_data(struct sctp_outq *q, in sctp_outq_head_data() argument
77 list_add(&ch->list, &q->out_chunk_list); in sctp_outq_head_data()
78 q->out_qlen += ch->skb->len; in sctp_outq_head_data()
82 static inline struct sctp_chunk *sctp_outq_dequeue_data(struct sctp_outq *q) in sctp_outq_dequeue_data() argument
86 if (!list_empty(&q->out_chunk_list)) { in sctp_outq_dequeue_data()
87 struct list_head *entry = q->out_chunk_list.next; in sctp_outq_dequeue_data()
91 q->out_qlen -= ch->skb->len; in sctp_outq_dequeue_data()
96 static inline void sctp_outq_tail_data(struct sctp_outq *q, in sctp_outq_tail_data() argument
99 list_add_tail(&ch->list, &q->out_chunk_list); in sctp_outq_tail_data()
100 q->out_qlen += ch->skb->len; in sctp_outq_tail_data()
200 void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) in sctp_outq_init() argument
202 memset(q, 0, sizeof(struct sctp_outq)); in sctp_outq_init()
204 q->asoc = asoc; in sctp_outq_init()
205 INIT_LIST_HEAD(&q->out_chunk_list); in sctp_outq_init()
206 INIT_LIST_HEAD(&q->control_chunk_list); in sctp_outq_init()
207 INIT_LIST_HEAD(&q->retransmit); in sctp_outq_init()
208 INIT_LIST_HEAD(&q->sacked); in sctp_outq_init()
209 INIT_LIST_HEAD(&q->abandoned); in sctp_outq_init()
214 static void __sctp_outq_teardown(struct sctp_outq *q) in __sctp_outq_teardown() argument
221 list_for_each_entry(transport, &q->asoc->peer.transport_addr_list, in __sctp_outq_teardown()
227 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
233 list_for_each_safe(lchunk, temp, &q->sacked) { in __sctp_outq_teardown()
237 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
242 list_for_each_safe(lchunk, temp, &q->retransmit) { in __sctp_outq_teardown()
246 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
251 list_for_each_safe(lchunk, temp, &q->abandoned) { in __sctp_outq_teardown()
255 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
260 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { in __sctp_outq_teardown()
263 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
268 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) { in __sctp_outq_teardown()
274 void sctp_outq_teardown(struct sctp_outq *q) in sctp_outq_teardown() argument
276 __sctp_outq_teardown(q); in sctp_outq_teardown()
277 sctp_outq_init(q->asoc, q); in sctp_outq_teardown()
281 void sctp_outq_free(struct sctp_outq *q) in sctp_outq_free() argument
284 __sctp_outq_teardown(q); in sctp_outq_free()
288 int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk) in sctp_outq_tail() argument
290 struct net *net = sock_net(q->asoc->base.sk); in sctp_outq_tail()
293 pr_debug("%s: outq:%p, chunk:%p[%s]\n", __func__, q, chunk, in sctp_outq_tail()
311 switch (q->asoc->state) { in sctp_outq_tail()
323 __func__, q, chunk, chunk && chunk->chunk_hdr ? in sctp_outq_tail()
327 sctp_outq_tail_data(q, chunk); in sctp_outq_tail()
335 list_add_tail(&chunk->list, &q->control_chunk_list); in sctp_outq_tail()
342 if (!q->cork) in sctp_outq_tail()
343 error = sctp_outq_flush(q, 0); in sctp_outq_tail()
375 void sctp_retransmit_mark(struct sctp_outq *q, in sctp_retransmit_mark() argument
390 sctp_insert_list(&q->abandoned, lchunk); in sctp_retransmit_mark()
401 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
402 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
422 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
423 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
451 sctp_insert_list(&q->retransmit, lchunk); in sctp_retransmit_mark()
464 void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, in sctp_retransmit() argument
467 struct net *net = sock_net(q->asoc->base.sk); in sctp_retransmit()
485 q->fast_rtx = 1; in sctp_retransmit()
498 sctp_retransmit_mark(q, transport, reason); in sctp_retransmit()
505 sctp_generate_fwdtsn(q, q->asoc->ctsn_ack_point); in sctp_retransmit()
512 error = sctp_outq_flush(q, /* rtx_timeout */ 1); in sctp_retransmit()
515 q->asoc->base.sk->sk_err = -error; in sctp_retransmit()
526 static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, in sctp_outq_flush_rtx() argument
538 lqueue = &q->retransmit; in sctp_outq_flush_rtx()
539 fast_rtx = q->fast_rtx; in sctp_outq_flush_rtx()
568 sctp_insert_list(&q->abandoned, in sctp_outq_flush_rtx()
653 q->asoc->stats.rtxchunks++; in sctp_outq_flush_rtx()
681 q->fast_rtx = 0; in sctp_outq_flush_rtx()
687 int sctp_outq_uncork(struct sctp_outq *q) in sctp_outq_uncork() argument
689 if (q->cork) in sctp_outq_uncork()
690 q->cork = 0; in sctp_outq_uncork()
692 return sctp_outq_flush(q, 0); in sctp_outq_uncork()
705 static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) in sctp_outq_flush() argument
709 struct sctp_association *asoc = q->asoc; in sctp_outq_flush()
738 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) { in sctp_outq_flush()
861 list_add(&chunk->list, &q->control_chunk_list); in sctp_outq_flush()
879 if (q->asoc->src_out_of_asoc_ok) in sctp_outq_flush()
904 if (!list_empty(&q->retransmit)) { in sctp_outq_flush()
923 error = sctp_outq_flush_rtx(q, packet, in sctp_outq_flush()
938 if (!list_empty(&q->retransmit)) in sctp_outq_flush()
951 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { in sctp_outq_flush()
1006 __func__, q, chunk, chunk && chunk->chunk_hdr ? in sctp_outq_flush()
1026 sctp_outq_head_data(q, chunk); in sctp_outq_flush()
1123 int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) in sctp_outq_sack() argument
1125 struct sctp_association *asoc = q->asoc; in sctp_outq_sack()
1196 sctp_check_transmitted(q, &q->retransmit, NULL, NULL, sack, &highest_new_tsn); in sctp_outq_sack()
1204 sctp_check_transmitted(q, &transport->transmitted, in sctp_outq_sack()
1228 sctp_mark_missing(q, &transport->transmitted, transport, in sctp_outq_sack()
1238 list_for_each_safe(lchunk, temp, &q->sacked) { in sctp_outq_sack()
1254 outstanding = q->outstanding_bytes; in sctp_outq_sack()
1263 sctp_generate_fwdtsn(q, sack_ctsn); in sctp_outq_sack()
1270 return sctp_outq_is_empty(q); in sctp_outq_sack()
1277 int sctp_outq_is_empty(const struct sctp_outq *q) in sctp_outq_is_empty() argument
1279 return q->out_qlen == 0 && q->outstanding_bytes == 0 && in sctp_outq_is_empty()
1280 list_empty(&q->retransmit); in sctp_outq_is_empty()
1297 static void sctp_check_transmitted(struct sctp_outq *q, in sctp_check_transmitted() argument
1326 sctp_insert_list(&q->abandoned, lchunk); in sctp_check_transmitted()
1335 q->outstanding_bytes -= sctp_data_size(tchunk); in sctp_check_transmitted()
1414 q->asoc->peer.primary_path->cacc. in sctp_check_transmitted()
1421 &q->sacked); in sctp_check_transmitted()
1519 q->outstanding_bytes -= bytes_acked + migrate_bytes; in sctp_check_transmitted()
1535 if (!q->asoc->peer.rwnd && in sctp_check_transmitted()
1537 (sack_ctsn+2 == q->asoc->next_tsn) && in sctp_check_transmitted()
1538 q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) { in sctp_check_transmitted()
1542 q->asoc->overall_error_count = 0; in sctp_check_transmitted()
1572 static void sctp_mark_missing(struct sctp_outq *q, in sctp_mark_missing() argument
1581 struct sctp_association *asoc = q->asoc; in sctp_mark_missing()
1626 sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); in sctp_mark_missing()
1684 static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) in sctp_generate_fwdtsn() argument
1686 struct sctp_association *asoc = q->asoc; in sctp_generate_fwdtsn()
1728 list_for_each_safe(lchunk, temp, &q->abandoned) { in sctp_generate_fwdtsn()
1784 list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); in sctp_generate_fwdtsn()