Lines Matching refs:ulpq
139 static void sctp_intl_store_reasm(struct sctp_ulpq *ulpq, in sctp_intl_store_reasm() argument
145 pos = skb_peek_tail(&ulpq->reasm); in sctp_intl_store_reasm()
147 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
158 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
165 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); in sctp_intl_store_reasm()
169 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_store_reasm()
185 __skb_queue_before(&ulpq->reasm, pos, sctp_event2skb(event)); in sctp_intl_store_reasm()
189 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_partial() argument
200 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_partial()
202 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_partial()
252 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_intl_retrieve_partial()
253 &ulpq->reasm, first_frag, in sctp_intl_retrieve_partial()
267 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_reassembled() argument
270 struct sctp_association *asoc = ulpq->asoc; in sctp_intl_retrieve_reassembled()
281 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_reassembled()
283 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_reassembled()
338 &ulpq->reasm, in sctp_intl_retrieve_reassembled()
349 &ulpq->reasm, in sctp_intl_retrieve_reassembled()
358 static struct sctp_ulpevent *sctp_intl_reasm(struct sctp_ulpq *ulpq, in sctp_intl_reasm() argument
369 sctp_intl_store_reasm(ulpq, event); in sctp_intl_reasm()
371 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_reasm()
374 retval = sctp_intl_retrieve_partial(ulpq, event); in sctp_intl_reasm()
377 retval = sctp_intl_retrieve_reassembled(ulpq, event); in sctp_intl_reasm()
382 static void sctp_intl_store_ordered(struct sctp_ulpq *ulpq, in sctp_intl_store_ordered() argument
388 pos = skb_peek_tail(&ulpq->lobby); in sctp_intl_store_ordered()
390 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
397 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
402 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); in sctp_intl_store_ordered()
406 skb_queue_walk(&ulpq->lobby, pos) { in sctp_intl_store_ordered()
417 __skb_queue_before(&ulpq->lobby, pos, sctp_event2skb(event)); in sctp_intl_store_ordered()
420 static void sctp_intl_retrieve_ordered(struct sctp_ulpq *ulpq, in sctp_intl_retrieve_ordered() argument
428 stream = &ulpq->asoc->stream; in sctp_intl_retrieve_ordered()
431 sctp_skb_for_each(pos, &ulpq->lobby, tmp) { in sctp_intl_retrieve_ordered()
445 __skb_unlink(pos, &ulpq->lobby); in sctp_intl_retrieve_ordered()
451 static struct sctp_ulpevent *sctp_intl_order(struct sctp_ulpq *ulpq, in sctp_intl_order() argument
457 stream = &ulpq->asoc->stream; in sctp_intl_order()
461 sctp_intl_store_ordered(ulpq, event); in sctp_intl_order()
467 sctp_intl_retrieve_ordered(ulpq, event); in sctp_intl_order()
472 static int sctp_enqueue_event(struct sctp_ulpq *ulpq, in sctp_enqueue_event() argument
476 struct sock *sk = ulpq->asoc->base.sk; in sctp_enqueue_event()
517 static void sctp_intl_store_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_store_reasm_uo() argument
523 pos = skb_peek_tail(&ulpq->reasm_uo); in sctp_intl_store_reasm_uo()
525 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
536 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
543 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
547 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_store_reasm_uo()
563 __skb_queue_before(&ulpq->reasm_uo, pos, sctp_event2skb(event)); in sctp_intl_store_reasm_uo()
567 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_partial_uo() argument
578 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_partial_uo()
580 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_partial_uo()
633 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_intl_retrieve_partial_uo()
634 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_partial_uo()
648 struct sctp_ulpq *ulpq, in sctp_intl_retrieve_reassembled_uo() argument
651 struct sctp_association *asoc = ulpq->asoc; in sctp_intl_retrieve_reassembled_uo()
662 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_retrieve_reassembled_uo()
664 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_reassembled_uo()
720 &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
731 &ulpq->reasm_uo, in sctp_intl_retrieve_reassembled_uo()
740 static struct sctp_ulpevent *sctp_intl_reasm_uo(struct sctp_ulpq *ulpq, in sctp_intl_reasm_uo() argument
751 sctp_intl_store_reasm_uo(ulpq, event); in sctp_intl_reasm_uo()
753 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream); in sctp_intl_reasm_uo()
756 retval = sctp_intl_retrieve_partial_uo(ulpq, event); in sctp_intl_reasm_uo()
759 retval = sctp_intl_retrieve_reassembled_uo(ulpq, event); in sctp_intl_reasm_uo()
764 static struct sctp_ulpevent *sctp_intl_retrieve_first_uo(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first_uo() argument
774 skb_queue_walk(&ulpq->reasm_uo, pos) { in sctp_intl_retrieve_first_uo()
777 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first_uo()
817 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_intl_retrieve_first_uo()
818 &ulpq->reasm_uo, first_frag, in sctp_intl_retrieve_first_uo()
828 static int sctp_ulpevent_idata(struct sctp_ulpq *ulpq, in sctp_ulpevent_idata() argument
846 event = sctp_intl_reasm(ulpq, event); in sctp_ulpevent_idata()
851 event = sctp_intl_order(ulpq, event); in sctp_ulpevent_idata()
854 event = sctp_intl_reasm_uo(ulpq, event); in sctp_ulpevent_idata()
859 sctp_enqueue_event(ulpq, event); in sctp_ulpevent_idata()
865 static struct sctp_ulpevent *sctp_intl_retrieve_first(struct sctp_ulpq *ulpq) in sctp_intl_retrieve_first() argument
875 skb_queue_walk(&ulpq->reasm, pos) { in sctp_intl_retrieve_first()
878 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream); in sctp_intl_retrieve_first()
919 retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), in sctp_intl_retrieve_first()
920 &ulpq->reasm, first_frag, in sctp_intl_retrieve_first()
930 static void sctp_intl_start_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_start_pd() argument
934 if (!skb_queue_empty(&ulpq->reasm)) { in sctp_intl_start_pd()
936 event = sctp_intl_retrieve_first(ulpq); in sctp_intl_start_pd()
938 sctp_enqueue_event(ulpq, event); 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()
946 sctp_enqueue_event(ulpq, event); in sctp_intl_start_pd()
951 static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, in sctp_renege_events() argument
954 struct sctp_association *asoc = ulpq->asoc; in sctp_renege_events()
962 freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); in sctp_renege_events()
964 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm, in sctp_renege_events()
967 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm_uo, in sctp_renege_events()
971 if (freed >= needed && sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0) in sctp_renege_events()
972 sctp_intl_start_pd(ulpq, gfp); in sctp_renege_events()
977 static void sctp_intl_stream_abort_pd(struct sctp_ulpq *ulpq, __u16 sid, in sctp_intl_stream_abort_pd() argument
980 struct sock *sk = ulpq->asoc->base.sk; in sctp_intl_stream_abort_pd()
987 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, SCTP_PARTIAL_DELIVERY_ABORTED, in sctp_intl_stream_abort_pd()
999 static void sctp_intl_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid) in sctp_intl_reap_ordered() argument
1001 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_reap_ordered()
1003 struct sk_buff_head *lobby = &ulpq->lobby; in sctp_intl_reap_ordered()
1045 sctp_intl_retrieve_ordered(ulpq, event); in sctp_intl_reap_ordered()
1046 sctp_enqueue_event(ulpq, event); in sctp_intl_reap_ordered()
1050 static void sctp_intl_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp) in sctp_intl_abort_pd() argument
1052 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_abort_pd()
1063 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, gfp); in sctp_intl_abort_pd()
1070 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0, gfp); in sctp_intl_abort_pd()
1073 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_abort_pd()
1078 sctp_ulpq_flush(ulpq); in sctp_intl_abort_pd()
1192 static void sctp_report_fwdtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_fwdtsn() argument
1195 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_fwdtsn()
1197 sctp_ulpq_reasm_flushtsn(ulpq, ftsn); in sctp_report_fwdtsn()
1199 sctp_ulpq_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_fwdtsn()
1202 static void sctp_intl_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_intl_reasm_flushtsn() argument
1206 skb_queue_walk_safe(&ulpq->reasm, pos, tmp) { in sctp_intl_reasm_flushtsn()
1211 __skb_unlink(pos, &ulpq->reasm); in sctp_intl_reasm_flushtsn()
1216 skb_queue_walk_safe(&ulpq->reasm_uo, pos, tmp) { in sctp_intl_reasm_flushtsn()
1221 __skb_unlink(pos, &ulpq->reasm_uo); in sctp_intl_reasm_flushtsn()
1227 static void sctp_report_iftsn(struct sctp_ulpq *ulpq, __u32 ftsn) in sctp_report_iftsn() argument
1230 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn); in sctp_report_iftsn()
1232 sctp_intl_reasm_flushtsn(ulpq, ftsn); in sctp_report_iftsn()
1234 if (ftsn == sctp_tsnmap_get_max_tsn_seen(&ulpq->asoc->peer.tsn_map)) in sctp_report_iftsn()
1235 sctp_intl_abort_pd(ulpq, GFP_ATOMIC); in sctp_report_iftsn()
1238 static void sctp_handle_fwdtsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_fwdtsn() argument
1244 sctp_ulpq_skip(ulpq, ntohs(skip->stream), ntohs(skip->ssn)); in sctp_handle_fwdtsn()
1247 static void sctp_intl_skip(struct sctp_ulpq *ulpq, __u16 sid, __u32 mid, in sctp_intl_skip() argument
1250 struct sctp_stream_in *sin = sctp_stream_in(&ulpq->asoc->stream, sid); in sctp_intl_skip()
1251 struct sctp_stream *stream = &ulpq->asoc->stream; in sctp_intl_skip()
1256 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, in sctp_intl_skip()
1267 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x0, GFP_ATOMIC); in sctp_intl_skip()
1272 sctp_intl_reap_ordered(ulpq, sid); in sctp_intl_skip()
1275 static void sctp_handle_iftsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk) in sctp_handle_iftsn() argument
1281 sctp_intl_skip(ulpq, ntohs(skip->stream), in sctp_handle_iftsn()