Lines Matching refs:ulpq
124 static void sctp_intl_store_reasm(struct sctp_ulpq *ulpq, in sctp_intl_store_reasm() argument
130 pos = skb_peek_tail(&ulpq->reasm); in sctp_intl_store_reasm()
132 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
143 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
150 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
155 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_store_reasm()
175 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
177 __skb_queue_before(&ulpq->reasm, loc, sctp_event2skb(event)); in sctp_intl_store_reasm()
181 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_partial() argument
192 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_partial()
194 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_partial()
244 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, in sctp_intl_retrieve_partial()
258 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_reassembled() argument
261 struct sctp_association *asoc = ulpq->asoc; in sctp_intl_retrieve_reassembled()
272 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_reassembled()
274 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_reassembled()
329 &ulpq->reasm, in sctp_intl_retrieve_reassembled()
339 retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm, in sctp_intl_retrieve_reassembled()
348 static struct sctp_ulpevent *sctp_intl_reasm(struct sctp_ulpq *ulpq, in sctp_intl_reasm() argument
359 sctp_intl_store_reasm(ulpq, event); in sctp_intl_reasm()
361 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_reasm()
364 retval = sctp_intl_retrieve_partial(ulpq, event); in sctp_intl_reasm()
367 retval = sctp_intl_retrieve_reassembled(ulpq, event); in sctp_intl_reasm()
372 static void sctp_intl_store_ordered(struct sctp_ulpq *ulpq, in sctp_intl_store_ordered() argument
378 pos = skb_peek_tail(&ulpq->lobby); in sctp_intl_store_ordered()
380 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
387 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
392 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
397 skb_queue_walk(&ulpq->lobby, pos) { in sctp_intl_store_ordered()
412 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
414 __skb_queue_before(&ulpq->lobby, loc, sctp_event2skb(event)); in sctp_intl_store_ordered()
417 static void sctp_intl_retrieve_ordered(struct sctp_ulpq *ulpq, in sctp_intl_retrieve_ordered() argument
425 stream = &ulpq->asoc->stream; in sctp_intl_retrieve_ordered()
428 sctp_skb_for_each(pos, &ulpq->lobby, tmp) { in sctp_intl_retrieve_ordered()
442 __skb_unlink(pos, &ulpq->lobby); in sctp_intl_retrieve_ordered()
448 static struct sctp_ulpevent *sctp_intl_order(struct sctp_ulpq *ulpq, in sctp_intl_order() argument
454 stream = &ulpq->asoc->stream; in sctp_intl_order()
458 sctp_intl_store_ordered(ulpq, event); in sctp_intl_order()
464 sctp_intl_retrieve_ordered(ulpq, event); in sctp_intl_order()
469 static int sctp_enqueue_event(struct sctp_ulpq *ulpq, in sctp_enqueue_event() argument
472 struct sock *sk = ulpq->asoc->base.sk; in sctp_enqueue_event()
490 if (!sctp_ulpevent_is_enabled(event, ulpq->asoc->subscribe)) in sctp_enqueue_event()
515 static void sctp_intl_store_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_store_reasm_uo() argument
521 pos = skb_peek_tail(&ulpq->reasm_uo); in sctp_intl_store_reasm_uo()
523 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
534 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
541 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
545 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_store_reasm_uo()
561 __skb_queue_before(&ulpq->reasm_uo, pos, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
565 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_partial_uo() argument
576 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_partial_uo()
578 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_partial_uo()
631 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_partial_uo()
632 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_partial_uo()
646 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_reassembled_uo() argument
649 struct sctp_association *asoc = ulpq->asoc; in sctp_intl_retrieve_reassembled_uo()
660 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_reassembled_uo()
662 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_reassembled_uo()
718 &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
728 retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
737 static struct sctp_ulpevent *sctp_intl_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_reasm_uo() argument
748 sctp_intl_store_reasm_uo(ulpq, event); in sctp_intl_reasm_uo()
750 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_reasm_uo()
753 retval = sctp_intl_retrieve_partial_uo(ulpq, event); in sctp_intl_reasm_uo()
756 retval = sctp_intl_retrieve_reassembled_uo(ulpq, event); in sctp_intl_reasm_uo()
761 static struct sctp_ulpevent *sctp_intl_retrieve_first_uo(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first_uo() argument
771 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_first_uo()
774 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first_uo()
814 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_first_uo()
815 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_first_uo()
825 static int sctp_ulpevent_idata(struct sctp_ulpq *ulpq, in sctp_ulpevent_idata() argument
843 event = sctp_intl_reasm(ulpq, event); in sctp_ulpevent_idata()
849 event = sctp_intl_order(ulpq, event); in sctp_ulpevent_idata()
852 event = sctp_intl_reasm_uo(ulpq, event); in sctp_ulpevent_idata()
861 sctp_enqueue_event(ulpq, &temp); in sctp_ulpevent_idata()
867 static struct sctp_ulpevent *sctp_intl_retrieve_first(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first() argument
877 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_first()
880 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first()
921 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_first()
922 &ulpq->reasm, first_frag, in sctp_intl_retrieve_first()
932 static void sctp_intl_start_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_start_pd() argument
937 if (!skb_queue_empty(&ulpq->reasm)) { in sctp_intl_start_pd()
939 event = sctp_intl_retrieve_first(ulpq); in sctp_intl_start_pd()
943 sctp_enqueue_event(ulpq, &temp); in sctp_intl_start_pd()
948 if (!skb_queue_empty(&ulpq->reasm_uo)) { in sctp_intl_start_pd()
950 event = sctp_intl_retrieve_first_uo(ulpq); in sctp_intl_start_pd()
954 sctp_enqueue_event(ulpq, &temp); in sctp_intl_start_pd()
960 static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, in sctp_renege_events() argument
963 struct sctp_association *asoc = ulpq->asoc; in sctp_renege_events()
971 freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); in sctp_renege_events()
973 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm, in sctp_renege_events()
976 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm_uo, in sctp_renege_events()
980 if (freed >= needed && sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0) in sctp_renege_events()
981 sctp_intl_start_pd(ulpq, gfp); in sctp_renege_events()
986 static void sctp_intl_stream_abort_pd(struct sctp_ulpq *ulpq, __u16 sid, in sctp_intl_stream_abort_pd() argument
989 struct sock *sk = ulpq->asoc->base.sk; in sctp_intl_stream_abort_pd()
992 if (!sctp_ulpevent_type_enabled(ulpq->asoc->subscribe, in sctp_intl_stream_abort_pd()
996 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, SCTP_PARTIAL_DELIVERY_ABORTED, in sctp_intl_stream_abort_pd()
1010 static void sctp_intl_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) in sctp_intl_reap_ordered() argument
1012 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_reap_ordered()
1014 struct sk_buff_head *lobby = &ulpq->lobby; in sctp_intl_reap_ordered()
1056 sctp_intl_retrieve_ordered(ulpq, event); in sctp_intl_reap_ordered()
1057 sctp_enqueue_event(ulpq, &temp); in sctp_intl_reap_ordered()
1061 static void sctp_intl_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_abort_pd() argument
1063 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_abort_pd()
1074 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, gfp); in sctp_intl_abort_pd()
1081 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0, gfp); in sctp_intl_abort_pd()
1084 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_abort_pd()
1089 sctp_ulpq_flush(ulpq); in sctp_intl_abort_pd()
1203 static void sctp_report_fwdtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_fwdtsn() argument
1206 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_fwdtsn()
1208 sctp_ulpq_reasm_flushtsn(ulpq, ftsn); in sctp_report_fwdtsn()
1210 sctp_ulpq_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_fwdtsn()
1213 static void sctp_intl_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_intl_reasm_flushtsn() argument
1217 skb_queue_walk_safe(&ulpq->reasm, pos, tmp) { in sctp_intl_reasm_flushtsn()
1222 __skb_unlink(pos, &ulpq->reasm); in sctp_intl_reasm_flushtsn()
1227 skb_queue_walk_safe(&ulpq->reasm_uo, pos, tmp) { in sctp_intl_reasm_flushtsn()
1232 __skb_unlink(pos, &ulpq->reasm_uo); in sctp_intl_reasm_flushtsn()
1238 static void sctp_report_iftsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_iftsn() argument
1241 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_iftsn()
1243 sctp_intl_reasm_flushtsn(ulpq, ftsn); in sctp_report_iftsn()
1245 if (ftsn == sctp_tsnmap_get_max_tsn_seen(&ulpq->asoc->peer.tsn_map)) in sctp_report_iftsn()
1246 sctp_intl_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_iftsn()
1249 static void sctp_handle_fwdtsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_fwdtsn() argument
1255 sctp_ulpq_skip(ulpq, ntohs(skip->stream), ntohs(skip->ssn)); in sctp_handle_fwdtsn()
1258 static void sctp_intl_skip(struct sctp_ulpq *ulpq, __u16 sid, __u32 mid, in sctp_intl_skip() argument
1261 struct sctp_stream_in *sin = sctp_stream_in(&ulpq->asoc->stream, sid); in sctp_intl_skip()
1262 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_skip()
1267 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, in sctp_intl_skip()
1278 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x0, GFP_ATOMIC); in sctp_intl_skip()
1283 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_skip()
1286 static void sctp_handle_iftsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_iftsn() argument
1292 sctp_intl_skip(ulpq, ntohs(skip->stream), in sctp_handle_iftsn()
1296 static int do_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) in do_ulpq_tail_event() argument
1302 return sctp_ulpq_tail_event(ulpq, &temp); in do_ulpq_tail_event()
1324 static int do_sctp_enqueue_event(struct sctp_ulpq *ulpq, in do_sctp_enqueue_event() argument
1331 return sctp_enqueue_event(ulpq, &temp); in do_sctp_enqueue_event()