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()
509 static void sctp_intl_store_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_store_reasm_uo() argument
515 pos = skb_peek_tail(&ulpq->reasm_uo); in sctp_intl_store_reasm_uo()
517 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
528 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
535 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
539 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_store_reasm_uo()
555 __skb_queue_before(&ulpq->reasm_uo, pos, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
559 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_partial_uo() argument
570 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_partial_uo()
572 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_partial_uo()
625 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_partial_uo()
626 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_partial_uo()
640 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_reassembled_uo() argument
643 struct sctp_association *asoc = ulpq->asoc; in sctp_intl_retrieve_reassembled_uo()
654 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_reassembled_uo()
656 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_reassembled_uo()
712 &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
722 retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
731 static struct sctp_ulpevent *sctp_intl_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_reasm_uo() argument
742 sctp_intl_store_reasm_uo(ulpq, event); in sctp_intl_reasm_uo()
744 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_reasm_uo()
747 retval = sctp_intl_retrieve_partial_uo(ulpq, event); in sctp_intl_reasm_uo()
750 retval = sctp_intl_retrieve_reassembled_uo(ulpq, event); in sctp_intl_reasm_uo()
755 static struct sctp_ulpevent *sctp_intl_retrieve_first_uo(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first_uo() argument
765 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_first_uo()
768 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first_uo()
808 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_first_uo()
809 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_first_uo()
819 static int sctp_ulpevent_idata(struct sctp_ulpq *ulpq, in sctp_ulpevent_idata() argument
837 event = sctp_intl_reasm(ulpq, event); in sctp_ulpevent_idata()
843 event = sctp_intl_order(ulpq, event); in sctp_ulpevent_idata()
846 event = sctp_intl_reasm_uo(ulpq, event); in sctp_ulpevent_idata()
855 sctp_enqueue_event(ulpq, &temp); in sctp_ulpevent_idata()
861 static struct sctp_ulpevent *sctp_intl_retrieve_first(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first() argument
871 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_first()
874 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first()
915 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, in sctp_intl_retrieve_first()
916 &ulpq->reasm, first_frag, in sctp_intl_retrieve_first()
926 static void sctp_intl_start_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_start_pd() argument
931 if (!skb_queue_empty(&ulpq->reasm)) { in sctp_intl_start_pd()
933 event = sctp_intl_retrieve_first(ulpq); in sctp_intl_start_pd()
937 sctp_enqueue_event(ulpq, &temp); in sctp_intl_start_pd()
942 if (!skb_queue_empty(&ulpq->reasm_uo)) { in sctp_intl_start_pd()
944 event = sctp_intl_retrieve_first_uo(ulpq); in sctp_intl_start_pd()
948 sctp_enqueue_event(ulpq, &temp); in sctp_intl_start_pd()
954 static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, in sctp_renege_events() argument
957 struct sctp_association *asoc = ulpq->asoc; in sctp_renege_events()
965 freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); in sctp_renege_events()
967 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm, in sctp_renege_events()
970 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm_uo, in sctp_renege_events()
974 if (freed >= needed && sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0) in sctp_renege_events()
975 sctp_intl_start_pd(ulpq, gfp); in sctp_renege_events()
978 static void sctp_intl_stream_abort_pd(struct sctp_ulpq *ulpq, __u16 sid, in sctp_intl_stream_abort_pd() argument
981 struct sock *sk = ulpq->asoc->base.sk; in sctp_intl_stream_abort_pd()
984 if (!sctp_ulpevent_type_enabled(ulpq->asoc->subscribe, in sctp_intl_stream_abort_pd()
988 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, SCTP_PARTIAL_DELIVERY_ABORTED, in sctp_intl_stream_abort_pd()
1002 static void sctp_intl_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) in sctp_intl_reap_ordered() argument
1004 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_reap_ordered()
1006 struct sk_buff_head *lobby = &ulpq->lobby; in sctp_intl_reap_ordered()
1048 sctp_intl_retrieve_ordered(ulpq, event); in sctp_intl_reap_ordered()
1049 sctp_enqueue_event(ulpq, &temp); in sctp_intl_reap_ordered()
1053 static void sctp_intl_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_abort_pd() argument
1055 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_abort_pd()
1066 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, gfp); in sctp_intl_abort_pd()
1073 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0, gfp); in sctp_intl_abort_pd()
1076 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_abort_pd()
1081 sctp_ulpq_flush(ulpq); in sctp_intl_abort_pd()
1195 static void sctp_report_fwdtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_fwdtsn() argument
1198 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_fwdtsn()
1200 sctp_ulpq_reasm_flushtsn(ulpq, ftsn); in sctp_report_fwdtsn()
1202 sctp_ulpq_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_fwdtsn()
1205 static void sctp_intl_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_intl_reasm_flushtsn() argument
1209 skb_queue_walk_safe(&ulpq->reasm, pos, tmp) { in sctp_intl_reasm_flushtsn()
1214 __skb_unlink(pos, &ulpq->reasm); in sctp_intl_reasm_flushtsn()
1219 skb_queue_walk_safe(&ulpq->reasm_uo, pos, tmp) { in sctp_intl_reasm_flushtsn()
1224 __skb_unlink(pos, &ulpq->reasm_uo); in sctp_intl_reasm_flushtsn()
1230 static void sctp_report_iftsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_iftsn() argument
1233 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_iftsn()
1235 sctp_intl_reasm_flushtsn(ulpq, ftsn); in sctp_report_iftsn()
1237 if (ftsn == sctp_tsnmap_get_max_tsn_seen(&ulpq->asoc->peer.tsn_map)) in sctp_report_iftsn()
1238 sctp_intl_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_iftsn()
1241 static void sctp_handle_fwdtsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_fwdtsn() argument
1247 sctp_ulpq_skip(ulpq, ntohs(skip->stream), ntohs(skip->ssn)); in sctp_handle_fwdtsn()
1250 static void sctp_intl_skip(struct sctp_ulpq *ulpq, __u16 sid, __u32 mid, in sctp_intl_skip() argument
1253 struct sctp_stream_in *sin = sctp_stream_in(&ulpq->asoc->stream, sid); in sctp_intl_skip()
1254 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_skip()
1259 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, in sctp_intl_skip()
1270 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x0, GFP_ATOMIC); in sctp_intl_skip()
1275 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_skip()
1278 static void sctp_handle_iftsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_iftsn() argument
1284 sctp_intl_skip(ulpq, ntohs(skip->stream), in sctp_handle_iftsn()
1288 static int do_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) in do_ulpq_tail_event() argument
1294 return sctp_ulpq_tail_event(ulpq, &temp); in do_ulpq_tail_event()
1316 static int do_sctp_enqueue_event(struct sctp_ulpq *ulpq, in do_sctp_enqueue_event() argument
1323 return sctp_enqueue_event(ulpq, &temp); in do_sctp_enqueue_event()