Lines Matching refs:ulpq
47 static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
51 static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq);
56 struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq, in sctp_ulpq_init() argument
59 memset(ulpq, 0, sizeof(struct sctp_ulpq)); in sctp_ulpq_init()
61 ulpq->asoc = asoc; in sctp_ulpq_init()
62 skb_queue_head_init(&ulpq->reasm); in sctp_ulpq_init()
63 skb_queue_head_init(&ulpq->lobby); in sctp_ulpq_init()
64 ulpq->pd_mode = 0; in sctp_ulpq_init()
66 return ulpq; in sctp_ulpq_init()
71 void sctp_ulpq_flush(struct sctp_ulpq *ulpq) in sctp_ulpq_flush() argument
76 while ((skb = __skb_dequeue(&ulpq->lobby)) != NULL) { in sctp_ulpq_flush()
81 while ((skb = __skb_dequeue(&ulpq->reasm)) != NULL) { in sctp_ulpq_flush()
89 void sctp_ulpq_free(struct sctp_ulpq *ulpq) in sctp_ulpq_free() argument
91 sctp_ulpq_flush(ulpq); in sctp_ulpq_free()
95 int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, in sctp_ulpq_tail_data() argument
108 event = sctp_ulpq_reasm(ulpq, event); in sctp_ulpq_tail_data()
116 event = sctp_ulpq_order(ulpq, event); in sctp_ulpq_tail_data()
124 sctp_ulpq_tail_event(ulpq, event); in sctp_ulpq_tail_data()
174 static void sctp_ulpq_set_pd(struct sctp_ulpq *ulpq) in sctp_ulpq_set_pd() argument
176 struct sctp_sock *sp = sctp_sk(ulpq->asoc->base.sk); in sctp_ulpq_set_pd()
179 ulpq->pd_mode = 1; in sctp_ulpq_set_pd()
183 static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq) in sctp_ulpq_clear_pd() argument
185 ulpq->pd_mode = 0; in sctp_ulpq_clear_pd()
186 sctp_ulpq_reasm_drain(ulpq); in sctp_ulpq_clear_pd()
187 return sctp_clear_pd(ulpq->asoc->base.sk, ulpq->asoc); in sctp_ulpq_clear_pd()
193 int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) in sctp_ulpq_tail_event() argument
195 struct sock *sk = ulpq->asoc->base.sk; in sctp_ulpq_tail_event()
224 if (ulpq->pd_mode) { in sctp_ulpq_tail_event()
264 sctp_ulpq_clear_pd(ulpq); in sctp_ulpq_tail_event()
282 static void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq, in sctp_ulpq_store_reasm() argument
292 pos = skb_peek_tail(&ulpq->reasm); in sctp_ulpq_store_reasm()
294 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_ulpq_store_reasm()
302 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_ulpq_store_reasm()
307 skb_queue_walk(&ulpq->reasm, pos) { in sctp_ulpq_store_reasm()
316 __skb_queue_before(&ulpq->reasm, pos, sctp_event2skb(event)); in sctp_ulpq_store_reasm()
407 static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ulpq) in sctp_ulpq_retrieve_reassembled() argument
439 skb_queue_walk(&ulpq->reasm, pos) { in sctp_ulpq_retrieve_reassembled()
449 if (pos == ulpq->reasm.next) { in sctp_ulpq_retrieve_reassembled()
483 asoc = ulpq->asoc; in sctp_ulpq_retrieve_reassembled()
498 &ulpq->reasm, in sctp_ulpq_retrieve_reassembled()
502 sctp_ulpq_set_pd(ulpq); in sctp_ulpq_retrieve_reassembled()
508 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_ulpq_retrieve_reassembled()
509 &ulpq->reasm, first_frag, pos); in sctp_ulpq_retrieve_reassembled()
516 static struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq) in sctp_ulpq_retrieve_partial() argument
529 if (skb_queue_empty(&ulpq->reasm)) in sctp_ulpq_retrieve_partial()
537 skb_queue_walk(&ulpq->reasm, pos) { in sctp_ulpq_retrieve_partial()
574 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_ulpq_retrieve_partial()
575 &ulpq->reasm, first_frag, last_frag); in sctp_ulpq_retrieve_partial()
586 static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq, in sctp_ulpq_reasm() argument
597 sctp_ulpq_store_reasm(ulpq, event); in sctp_ulpq_reasm()
598 if (!ulpq->pd_mode) in sctp_ulpq_reasm()
599 retval = sctp_ulpq_retrieve_reassembled(ulpq); in sctp_ulpq_reasm()
607 ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map); in sctp_ulpq_reasm()
609 retval = sctp_ulpq_retrieve_partial(ulpq); in sctp_ulpq_reasm()
616 static struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq) in sctp_ulpq_retrieve_first() argument
628 if (skb_queue_empty(&ulpq->reasm)) in sctp_ulpq_retrieve_first()
635 skb_queue_walk(&ulpq->reasm, pos) { in sctp_ulpq_retrieve_first()
675 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_ulpq_retrieve_first()
676 &ulpq->reasm, first_frag, last_frag); in sctp_ulpq_retrieve_first()
694 void sctp_ulpq_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 fwd_tsn) in sctp_ulpq_reasm_flushtsn() argument
700 if (skb_queue_empty(&ulpq->reasm)) in sctp_ulpq_reasm_flushtsn()
703 skb_queue_walk_safe(&ulpq->reasm, pos, tmp) { in sctp_ulpq_reasm_flushtsn()
713 __skb_unlink(pos, &ulpq->reasm); in sctp_ulpq_reasm_flushtsn()
725 static void sctp_ulpq_reasm_drain(struct sctp_ulpq *ulpq) in sctp_ulpq_reasm_drain() argument
730 if (skb_queue_empty(&ulpq->reasm)) in sctp_ulpq_reasm_drain()
733 while ((event = sctp_ulpq_retrieve_reassembled(ulpq)) != NULL) { in sctp_ulpq_reasm_drain()
739 event = sctp_ulpq_order(ulpq, event); in sctp_ulpq_reasm_drain()
746 sctp_ulpq_tail_event(ulpq, event); in sctp_ulpq_reasm_drain()
754 static void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq, in sctp_ulpq_retrieve_ordered() argument
764 in = &ulpq->asoc->ssnmap->in; in sctp_ulpq_retrieve_ordered()
769 sctp_skb_for_each(pos, &ulpq->lobby, tmp) { in sctp_ulpq_retrieve_ordered()
788 __skb_unlink(pos, &ulpq->lobby); in sctp_ulpq_retrieve_ordered()
796 static void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq, in sctp_ulpq_store_ordered() argument
804 pos = skb_peek_tail(&ulpq->lobby); in sctp_ulpq_store_ordered()
806 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_ulpq_store_ordered()
817 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_ulpq_store_ordered()
822 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_ulpq_store_ordered()
829 skb_queue_walk(&ulpq->lobby, pos) { in sctp_ulpq_store_ordered()
842 __skb_queue_before(&ulpq->lobby, pos, sctp_event2skb(event)); in sctp_ulpq_store_ordered()
845 static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, in sctp_ulpq_order() argument
858 in = &ulpq->asoc->ssnmap->in; in sctp_ulpq_order()
865 sctp_ulpq_store_ordered(ulpq, event); in sctp_ulpq_order()
875 sctp_ulpq_retrieve_ordered(ulpq, event); in sctp_ulpq_order()
883 static void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) in sctp_ulpq_reap_ordered() argument
890 struct sk_buff_head *lobby = &ulpq->lobby; in sctp_ulpq_reap_ordered()
893 in = &ulpq->asoc->ssnmap->in; in sctp_ulpq_reap_ordered()
945 sctp_ulpq_retrieve_ordered(ulpq, event); in sctp_ulpq_reap_ordered()
946 sctp_ulpq_tail_event(ulpq, event); in sctp_ulpq_reap_ordered()
953 void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn) in sctp_ulpq_skip() argument
958 in = &ulpq->asoc->ssnmap->in; in sctp_ulpq_skip()
970 sctp_ulpq_reap_ordered(ulpq, sid); in sctp_ulpq_skip()
973 static __u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq, in sctp_ulpq_renege_list() argument
982 tsnmap = &ulpq->asoc->peer.tsn_map; in sctp_ulpq_renege_list()
1022 static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed) in sctp_ulpq_renege_order() argument
1024 return sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); in sctp_ulpq_renege_order()
1028 static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed) in sctp_ulpq_renege_frags() argument
1030 return sctp_ulpq_renege_list(ulpq, &ulpq->reasm, needed); in sctp_ulpq_renege_frags()
1034 void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, in sctp_ulpq_partial_delivery() argument
1043 asoc = ulpq->asoc; in sctp_ulpq_partial_delivery()
1049 if (ulpq->pd_mode) in sctp_ulpq_partial_delivery()
1055 skb = skb_peek(&asoc->ulpq.reasm); in sctp_ulpq_partial_delivery()
1069 event = sctp_ulpq_retrieve_first(ulpq); in sctp_ulpq_partial_delivery()
1072 sctp_ulpq_tail_event(ulpq, event); in sctp_ulpq_partial_delivery()
1073 sctp_ulpq_set_pd(ulpq); in sctp_ulpq_partial_delivery()
1080 void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, in sctp_ulpq_renege() argument
1086 asoc = ulpq->asoc; in sctp_ulpq_renege()
1097 freed = sctp_ulpq_renege_order(ulpq, needed); in sctp_ulpq_renege()
1099 freed += sctp_ulpq_renege_frags(ulpq, needed - freed); in sctp_ulpq_renege()
1105 retval = sctp_ulpq_tail_data(ulpq, chunk, gfp); in sctp_ulpq_renege()
1111 sctp_ulpq_partial_delivery(ulpq, gfp); in sctp_ulpq_renege()
1113 sctp_ulpq_reasm_drain(ulpq); in sctp_ulpq_renege()
1124 void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_ulpq_abort_pd() argument
1129 if (!ulpq->pd_mode) in sctp_ulpq_abort_pd()
1132 sk = ulpq->asoc->base.sk; in sctp_ulpq_abort_pd()
1135 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, in sctp_ulpq_abort_pd()
1142 if (sctp_ulpq_clear_pd(ulpq) || ev) in sctp_ulpq_abort_pd()