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()
328 sctp_outq_tail_data(q, chunk); in sctp_outq_tail()
336 list_add_tail(&chunk->list, &q->control_chunk_list); in sctp_outq_tail()
343 if (!q->cork) in sctp_outq_tail()
344 error = sctp_outq_flush(q, 0); in sctp_outq_tail()
376 void sctp_retransmit_mark(struct sctp_outq *q, in sctp_retransmit_mark() argument
391 sctp_insert_list(&q->abandoned, lchunk); in sctp_retransmit_mark()
402 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
403 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
423 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
424 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
452 sctp_insert_list(&q->retransmit, lchunk); in sctp_retransmit_mark()
465 void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, in sctp_retransmit() argument
468 struct net *net = sock_net(q->asoc->base.sk); in sctp_retransmit()
486 q->fast_rtx = 1; in sctp_retransmit()
499 sctp_retransmit_mark(q, transport, reason); in sctp_retransmit()
506 sctp_generate_fwdtsn(q, q->asoc->ctsn_ack_point); in sctp_retransmit()
513 error = sctp_outq_flush(q, /* rtx_timeout */ 1); in sctp_retransmit()
516 q->asoc->base.sk->sk_err = -error; in sctp_retransmit()
527 static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, in sctp_outq_flush_rtx() argument
539 lqueue = &q->retransmit; in sctp_outq_flush_rtx()
540 fast_rtx = q->fast_rtx; in sctp_outq_flush_rtx()
569 sctp_insert_list(&q->abandoned, in sctp_outq_flush_rtx()
654 q->asoc->stats.rtxchunks++; in sctp_outq_flush_rtx()
682 q->fast_rtx = 0; in sctp_outq_flush_rtx()
688 int sctp_outq_uncork(struct sctp_outq *q) in sctp_outq_uncork() argument
690 if (q->cork) in sctp_outq_uncork()
691 q->cork = 0; in sctp_outq_uncork()
693 return sctp_outq_flush(q, 0); in sctp_outq_uncork()
706 static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) in sctp_outq_flush() argument
710 struct sctp_association *asoc = q->asoc; in sctp_outq_flush()
739 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) { in sctp_outq_flush()
862 list_add(&chunk->list, &q->control_chunk_list); in sctp_outq_flush()
880 if (q->asoc->src_out_of_asoc_ok) in sctp_outq_flush()
905 if (!list_empty(&q->retransmit)) { in sctp_outq_flush()
924 error = sctp_outq_flush_rtx(q, packet, in sctp_outq_flush()
939 if (!list_empty(&q->retransmit)) in sctp_outq_flush()
952 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { in sctp_outq_flush()
1007 __func__, q, chunk, chunk && chunk->chunk_hdr ? in sctp_outq_flush()
1027 sctp_outq_head_data(q, chunk); in sctp_outq_flush()
1124 int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) in sctp_outq_sack() argument
1126 struct sctp_association *asoc = q->asoc; in sctp_outq_sack()
1197 sctp_check_transmitted(q, &q->retransmit, NULL, NULL, sack, &highest_new_tsn); in sctp_outq_sack()
1205 sctp_check_transmitted(q, &transport->transmitted, in sctp_outq_sack()
1229 sctp_mark_missing(q, &transport->transmitted, transport, in sctp_outq_sack()
1239 list_for_each_safe(lchunk, temp, &q->sacked) { in sctp_outq_sack()
1256 outstanding = q->outstanding_bytes; in sctp_outq_sack()
1265 sctp_generate_fwdtsn(q, sack_ctsn); in sctp_outq_sack()
1272 return sctp_outq_is_empty(q); in sctp_outq_sack()
1279 int sctp_outq_is_empty(const struct sctp_outq *q) in sctp_outq_is_empty() argument
1281 return q->out_qlen == 0 && q->outstanding_bytes == 0 && in sctp_outq_is_empty()
1282 list_empty(&q->retransmit); in sctp_outq_is_empty()
1299 static void sctp_check_transmitted(struct sctp_outq *q, in sctp_check_transmitted() argument
1328 sctp_insert_list(&q->abandoned, lchunk); in sctp_check_transmitted()
1337 q->outstanding_bytes -= sctp_data_size(tchunk); in sctp_check_transmitted()
1416 q->asoc->peer.primary_path->cacc. in sctp_check_transmitted()
1423 &q->sacked); in sctp_check_transmitted()
1521 q->outstanding_bytes -= bytes_acked + migrate_bytes; in sctp_check_transmitted()
1537 if (!q->asoc->peer.rwnd && in sctp_check_transmitted()
1539 (sack_ctsn+2 == q->asoc->next_tsn) && in sctp_check_transmitted()
1540 q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) { in sctp_check_transmitted()
1544 q->asoc->overall_error_count = 0; in sctp_check_transmitted()
1574 static void sctp_mark_missing(struct sctp_outq *q, in sctp_mark_missing() argument
1583 struct sctp_association *asoc = q->asoc; in sctp_mark_missing()
1628 sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); in sctp_mark_missing()
1686 static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) in sctp_generate_fwdtsn() argument
1688 struct sctp_association *asoc = q->asoc; in sctp_generate_fwdtsn()
1730 list_for_each_safe(lchunk, temp, &q->abandoned) { in sctp_generate_fwdtsn()
1786 list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); in sctp_generate_fwdtsn()