Lines Matching refs:q

43 static void sctp_check_transmitted(struct sctp_outq *q,
50 static void sctp_mark_missing(struct sctp_outq *q,
56 static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp);
59 static inline void sctp_outq_head_data(struct sctp_outq *q, in sctp_outq_head_data() argument
65 list_add(&ch->list, &q->out_chunk_list); in sctp_outq_head_data()
66 q->out_qlen += ch->skb->len; in sctp_outq_head_data()
69 oute = SCTP_SO(&q->asoc->stream, stream)->ext; in sctp_outq_head_data()
74 static inline struct sctp_chunk *sctp_outq_dequeue_data(struct sctp_outq *q) in sctp_outq_dequeue_data() argument
76 return q->sched->dequeue(q); in sctp_outq_dequeue_data()
80 static inline void sctp_outq_tail_data(struct sctp_outq *q, in sctp_outq_tail_data() argument
86 list_add_tail(&ch->list, &q->out_chunk_list); in sctp_outq_tail_data()
87 q->out_qlen += ch->skb->len; in sctp_outq_tail_data()
90 oute = SCTP_SO(&q->asoc->stream, stream)->ext; in sctp_outq_tail_data()
191 void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) in sctp_outq_init() argument
193 memset(q, 0, sizeof(struct sctp_outq)); in sctp_outq_init()
195 q->asoc = asoc; in sctp_outq_init()
196 INIT_LIST_HEAD(&q->out_chunk_list); in sctp_outq_init()
197 INIT_LIST_HEAD(&q->control_chunk_list); in sctp_outq_init()
198 INIT_LIST_HEAD(&q->retransmit); in sctp_outq_init()
199 INIT_LIST_HEAD(&q->sacked); in sctp_outq_init()
200 INIT_LIST_HEAD(&q->abandoned); in sctp_outq_init()
206 static void __sctp_outq_teardown(struct sctp_outq *q) in __sctp_outq_teardown() argument
213 list_for_each_entry(transport, &q->asoc->peer.transport_addr_list, in __sctp_outq_teardown()
219 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
225 list_for_each_safe(lchunk, temp, &q->sacked) { in __sctp_outq_teardown()
229 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
234 list_for_each_safe(lchunk, temp, &q->retransmit) { in __sctp_outq_teardown()
238 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
243 list_for_each_safe(lchunk, temp, &q->abandoned) { in __sctp_outq_teardown()
247 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
252 while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { in __sctp_outq_teardown()
253 sctp_sched_dequeue_done(q, chunk); in __sctp_outq_teardown()
256 sctp_chunk_fail(chunk, q->error); in __sctp_outq_teardown()
261 list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) { in __sctp_outq_teardown()
267 void sctp_outq_teardown(struct sctp_outq *q) in sctp_outq_teardown() argument
269 __sctp_outq_teardown(q); in sctp_outq_teardown()
270 sctp_outq_init(q->asoc, q); in sctp_outq_teardown()
274 void sctp_outq_free(struct sctp_outq *q) in sctp_outq_free() argument
277 __sctp_outq_teardown(q); in sctp_outq_free()
281 void sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk, gfp_t gfp) in sctp_outq_tail() argument
283 struct net *net = q->asoc->base.net; in sctp_outq_tail()
285 pr_debug("%s: outq:%p, chunk:%p[%s]\n", __func__, q, chunk, in sctp_outq_tail()
295 __func__, q, chunk, chunk && chunk->chunk_hdr ? in sctp_outq_tail()
299 sctp_outq_tail_data(q, chunk); in sctp_outq_tail()
308 list_add_tail(&chunk->list, &q->control_chunk_list); in sctp_outq_tail()
312 if (!q->cork) in sctp_outq_tail()
313 sctp_outq_flush(q, 0, gfp); in sctp_outq_tail()
385 struct sctp_outq *q = &asoc->outqueue; in sctp_prsctp_prune_unsent() local
389 q->sched->unsched_all(&asoc->stream); in sctp_prsctp_prune_unsent()
391 list_for_each_entry_safe(chk, temp, &q->out_chunk_list, list) { in sctp_prsctp_prune_unsent()
399 sctp_sched_dequeue_common(q, chk); in sctp_prsctp_prune_unsent()
417 q->sched->sched_all(&asoc->stream); in sctp_prsctp_prune_unsent()
450 void sctp_retransmit_mark(struct sctp_outq *q, in sctp_retransmit_mark() argument
465 sctp_insert_list(&q->abandoned, lchunk); in sctp_retransmit_mark()
476 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
477 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
497 q->asoc->peer.rwnd += sctp_data_size(chunk); in sctp_retransmit_mark()
498 q->outstanding_bytes -= sctp_data_size(chunk); in sctp_retransmit_mark()
524 sctp_insert_list(&q->retransmit, lchunk); in sctp_retransmit_mark()
537 void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, in sctp_retransmit() argument
540 struct net *net = q->asoc->base.net; in sctp_retransmit()
560 q->fast_rtx = 1; in sctp_retransmit()
573 sctp_retransmit_mark(q, transport, reason); in sctp_retransmit()
580 q->asoc->stream.si->generate_ftsn(q, q->asoc->ctsn_ack_point); in sctp_retransmit()
587 sctp_outq_flush(q, /* rtx_timeout */ 1, GFP_ATOMIC); in sctp_retransmit()
598 static int __sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, in __sctp_outq_flush_rtx() argument
610 lqueue = &q->retransmit; in __sctp_outq_flush_rtx()
611 fast_rtx = q->fast_rtx; in __sctp_outq_flush_rtx()
640 sctp_insert_list(&q->abandoned, in __sctp_outq_flush_rtx()
725 q->asoc->stats.rtxchunks++; in __sctp_outq_flush_rtx()
753 q->fast_rtx = 0; in __sctp_outq_flush_rtx()
759 void sctp_outq_uncork(struct sctp_outq *q, gfp_t gfp) in sctp_outq_uncork() argument
761 if (q->cork) in sctp_outq_uncork()
762 q->cork = 0; in sctp_outq_uncork()
764 sctp_outq_flush(q, 0, gfp); in sctp_outq_uncork()
788 struct sctp_outq *q; member
885 list_for_each_entry_safe(chunk, tmp, &ctx->q->control_chunk_list, list) { in sctp_outq_flush_ctrl()
963 list_add(&chunk->list, &ctx->q->control_chunk_list); in sctp_outq_flush_ctrl()
1012 error = __sctp_outq_flush_rtx(ctx->q, ctx->packet, rtx_timeout, in sctp_outq_flush_rtx()
1031 if (!list_empty(&ctx->q->retransmit)) in sctp_outq_flush_rtx()
1071 if (!list_empty(&ctx->q->retransmit) && in sctp_outq_flush_data()
1084 while ((chunk = sctp_outq_dequeue_data(ctx->q)) != NULL) { in sctp_outq_flush_data()
1090 sctp_sched_dequeue_done(ctx->q, chunk); in sctp_outq_flush_data()
1097 sctp_outq_head_data(ctx->q, chunk); in sctp_outq_flush_data()
1104 __func__, ctx->q, chunk, chunk && chunk->chunk_hdr ? in sctp_outq_flush_data()
1121 sctp_outq_head_data(ctx->q, chunk); in sctp_outq_flush_data()
1139 sctp_sched_dequeue_done(ctx->q, chunk); in sctp_outq_flush_data()
1175 ctx->q->asoc->base.sk->sk_err = -error; in sctp_outq_flush_transports()
1192 static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp) in sctp_outq_flush() argument
1195 .q = q, in sctp_outq_flush()
1198 .asoc = q->asoc, in sctp_outq_flush()
1214 if (q->asoc->src_out_of_asoc_ok) in sctp_outq_flush()
1248 int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) in sctp_outq_sack() argument
1250 struct sctp_association *asoc = q->asoc; in sctp_outq_sack()
1330 sctp_check_transmitted(q, &q->retransmit, NULL, NULL, sack, &highest_new_tsn); in sctp_outq_sack()
1338 sctp_check_transmitted(q, &transport->transmitted, in sctp_outq_sack()
1362 sctp_mark_missing(q, &transport->transmitted, transport, in sctp_outq_sack()
1372 list_for_each_safe(lchunk, temp, &q->sacked) { in sctp_outq_sack()
1392 outstanding = q->outstanding_bytes; in sctp_outq_sack()
1401 asoc->stream.si->generate_ftsn(q, sack_ctsn); in sctp_outq_sack()
1408 return sctp_outq_is_empty(q); in sctp_outq_sack()
1415 int sctp_outq_is_empty(const struct sctp_outq *q) in sctp_outq_is_empty() argument
1417 return q->out_qlen == 0 && q->outstanding_bytes == 0 && in sctp_outq_is_empty()
1418 list_empty(&q->retransmit); in sctp_outq_is_empty()
1435 static void sctp_check_transmitted(struct sctp_outq *q, in sctp_check_transmitted() argument
1464 sctp_insert_list(&q->abandoned, lchunk); in sctp_check_transmitted()
1469 if (transmitted_queue != &q->retransmit && in sctp_check_transmitted()
1474 q->outstanding_bytes -= sctp_data_size(tchunk); in sctp_check_transmitted()
1521 q->asoc->peer.primary_path->cacc. in sctp_check_transmitted()
1558 &q->sacked); in sctp_check_transmitted()
1656 q->outstanding_bytes -= bytes_acked + migrate_bytes; in sctp_check_transmitted()
1672 if (!q->asoc->peer.rwnd && in sctp_check_transmitted()
1674 (sack_ctsn+2 == q->asoc->next_tsn) && in sctp_check_transmitted()
1675 q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) { in sctp_check_transmitted()
1679 q->asoc->overall_error_count = 0; in sctp_check_transmitted()
1709 static void sctp_mark_missing(struct sctp_outq *q, in sctp_mark_missing() argument
1718 struct sctp_association *asoc = q->asoc; in sctp_mark_missing()
1763 sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); in sctp_mark_missing()
1822 void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn) in sctp_generate_fwdtsn() argument
1824 struct sctp_association *asoc = q->asoc; in sctp_generate_fwdtsn()
1866 list_for_each_safe(lchunk, temp, &q->abandoned) { in sctp_generate_fwdtsn()
1922 list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); in sctp_generate_fwdtsn()