Lines Matching defs:ulpq

124 static void sctp_intl_store_reasm(struct sctp_ulpq *ulpq,
130 pos = skb_peek_tail(&ulpq->reasm);
132 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
143 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
150 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
155 skb_queue_walk(&ulpq->reasm, pos) {
175 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
177 __skb_queue_before(&ulpq->reasm, loc, sctp_event2skb(event));
181 struct sctp_ulpq *ulpq,
192 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
194 skb_queue_walk(&ulpq->reasm, pos) {
244 retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm,
258 struct sctp_ulpq *ulpq,
261 struct sctp_association *asoc = ulpq->asoc;
272 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
274 skb_queue_walk(&ulpq->reasm, pos) {
329 &ulpq->reasm,
339 retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm,
348 static struct sctp_ulpevent *sctp_intl_reasm(struct sctp_ulpq *ulpq,
359 sctp_intl_store_reasm(ulpq, event);
361 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
364 retval = sctp_intl_retrieve_partial(ulpq, event);
367 retval = sctp_intl_retrieve_reassembled(ulpq, event);
372 static void sctp_intl_store_ordered(struct sctp_ulpq *ulpq,
378 pos = skb_peek_tail(&ulpq->lobby);
380 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
387 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
392 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
397 skb_queue_walk(&ulpq->lobby, pos) {
412 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
414 __skb_queue_before(&ulpq->lobby, loc, sctp_event2skb(event));
417 static void sctp_intl_retrieve_ordered(struct sctp_ulpq *ulpq,
425 stream = &ulpq->asoc->stream;
428 sctp_skb_for_each(pos, &ulpq->lobby, tmp) {
442 __skb_unlink(pos, &ulpq->lobby);
448 static struct sctp_ulpevent *sctp_intl_order(struct sctp_ulpq *ulpq,
454 stream = &ulpq->asoc->stream;
458 sctp_intl_store_ordered(ulpq, event);
464 sctp_intl_retrieve_ordered(ulpq, event);
469 static int sctp_enqueue_event(struct sctp_ulpq *ulpq,
472 struct sock *sk = ulpq->asoc->base.sk;
490 if (!sctp_ulpevent_is_enabled(event, ulpq->asoc->subscribe))
509 static void sctp_intl_store_reasm_uo(struct sctp_ulpq *ulpq,
515 pos = skb_peek_tail(&ulpq->reasm_uo);
517 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event));
528 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event));
535 __skb_queue_tail(&ulpq->reasm_uo, sctp_event2skb(event));
539 skb_queue_walk(&ulpq->reasm_uo, pos) {
555 __skb_queue_before(&ulpq->reasm_uo, pos, sctp_event2skb(event));
559 struct sctp_ulpq *ulpq,
570 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
572 skb_queue_walk(&ulpq->reasm_uo, pos) {
625 retval = sctp_make_reassembled_event(ulpq->asoc->base.net,
626 &ulpq->reasm_uo, first_frag,
640 struct sctp_ulpq *ulpq,
643 struct sctp_association *asoc = ulpq->asoc;
654 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
656 skb_queue_walk(&ulpq->reasm_uo, pos) {
712 &ulpq->reasm_uo,
722 retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm_uo,
731 static struct sctp_ulpevent *sctp_intl_reasm_uo(struct sctp_ulpq *ulpq,
742 sctp_intl_store_reasm_uo(ulpq, event);
744 sin = sctp_stream_in(&ulpq->asoc->stream, event->stream);
747 retval = sctp_intl_retrieve_partial_uo(ulpq, event);
750 retval = sctp_intl_retrieve_reassembled_uo(ulpq, event);
755 static struct sctp_ulpevent *sctp_intl_retrieve_first_uo(struct sctp_ulpq *ulpq)
765 skb_queue_walk(&ulpq->reasm_uo, pos) {
768 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream);
808 retval = sctp_make_reassembled_event(ulpq->asoc->base.net,
809 &ulpq->reasm_uo, first_frag,
819 static int sctp_ulpevent_idata(struct sctp_ulpq *ulpq,
837 event = sctp_intl_reasm(ulpq, event);
843 event = sctp_intl_order(ulpq, event);
846 event = sctp_intl_reasm_uo(ulpq, event);
855 sctp_enqueue_event(ulpq, &temp);
861 static struct sctp_ulpevent *sctp_intl_retrieve_first(struct sctp_ulpq *ulpq)
871 skb_queue_walk(&ulpq->reasm, pos) {
874 csin = sctp_stream_in(&ulpq->asoc->stream, cevent->stream);
915 retval = sctp_make_reassembled_event(ulpq->asoc->base.net,
916 &ulpq->reasm, first_frag,
926 static void sctp_intl_start_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
931 if (!skb_queue_empty(&ulpq->reasm)) {
933 event = sctp_intl_retrieve_first(ulpq);
937 sctp_enqueue_event(ulpq, &temp);
942 if (!skb_queue_empty(&ulpq->reasm_uo)) {
944 event = sctp_intl_retrieve_first_uo(ulpq);
948 sctp_enqueue_event(ulpq, &temp);
954 static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
957 struct sctp_association *asoc = ulpq->asoc;
965 freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed);
967 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm,
970 freed += sctp_ulpq_renege_list(ulpq, &ulpq->reasm_uo,
974 if (freed >= needed && sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0)
975 sctp_intl_start_pd(ulpq, gfp);
978 static void sctp_intl_stream_abort_pd(struct sctp_ulpq *ulpq, __u16 sid,
981 struct sock *sk = ulpq->asoc->base.sk;
984 if (!sctp_ulpevent_type_enabled(ulpq->asoc->subscribe,
988 ev = sctp_ulpevent_make_pdapi(ulpq->asoc, SCTP_PARTIAL_DELIVERY_ABORTED,
1002 static void sctp_intl_reap_ordered(struct sctp_ulpq *ulpq, __u16 sid)
1004 struct sctp_stream *stream = &ulpq->asoc->stream;
1006 struct sk_buff_head *lobby = &ulpq->lobby;
1048 sctp_intl_retrieve_ordered(ulpq, event);
1049 sctp_enqueue_event(ulpq, &temp);
1053 static void sctp_intl_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
1055 struct sctp_stream *stream = &ulpq->asoc->stream;
1066 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1, gfp);
1073 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0, gfp);
1076 sctp_intl_reap_ordered(ulpq, sid);
1081 sctp_ulpq_flush(ulpq);
1196 static void sctp_report_fwdtsn(struct sctp_ulpq *ulpq, __u32 ftsn)
1199 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn);
1201 sctp_ulpq_reasm_flushtsn(ulpq, ftsn);
1203 sctp_ulpq_abort_pd(ulpq, GFP_ATOMIC);
1206 static void sctp_intl_reasm_flushtsn(struct sctp_ulpq *ulpq, __u32 ftsn)
1210 skb_queue_walk_safe(&ulpq->reasm, pos, tmp) {
1215 __skb_unlink(pos, &ulpq->reasm);
1220 skb_queue_walk_safe(&ulpq->reasm_uo, pos, tmp) {
1225 __skb_unlink(pos, &ulpq->reasm_uo);
1231 static void sctp_report_iftsn(struct sctp_ulpq *ulpq, __u32 ftsn)
1234 sctp_tsnmap_skip(&ulpq->asoc->peer.tsn_map, ftsn);
1236 sctp_intl_reasm_flushtsn(ulpq, ftsn);
1238 if (ftsn == sctp_tsnmap_get_max_tsn_seen(&ulpq->asoc->peer.tsn_map))
1239 sctp_intl_abort_pd(ulpq, GFP_ATOMIC);
1242 static void sctp_handle_fwdtsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk)
1248 sctp_ulpq_skip(ulpq, ntohs(skip->stream), ntohs(skip->ssn));
1251 static void sctp_intl_skip(struct sctp_ulpq *ulpq, __u16 sid, __u32 mid,
1254 struct sctp_stream_in *sin = sctp_stream_in(&ulpq->asoc->stream, sid);
1255 struct sctp_stream *stream = &ulpq->asoc->stream;
1260 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x1,
1271 sctp_intl_stream_abort_pd(ulpq, sid, mid, 0x0, GFP_ATOMIC);
1276 sctp_intl_reap_ordered(ulpq, sid);
1279 static void sctp_handle_iftsn(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk)
1285 sctp_intl_skip(ulpq, ntohs(skip->stream),
1289 static int do_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event)
1295 return sctp_ulpq_tail_event(ulpq, &temp);
1317 static int do_sctp_enqueue_event(struct sctp_ulpq *ulpq,
1324 return sctp_enqueue_event(ulpq, &temp);