IB/mthca: Optimize large messages on Sinai HCAs
[linux-2.6] / net / sctp / ulpqueue.c
1 /* SCTP kernel reference Implementation
2  * (C) Copyright IBM Corp. 2001, 2004
3  * Copyright (c) 1999-2000 Cisco, Inc.
4  * Copyright (c) 1999-2001 Motorola, Inc.
5  * Copyright (c) 2001 Intel Corp.
6  * Copyright (c) 2001 Nokia, Inc.
7  * Copyright (c) 2001 La Monte H.P. Yarroll
8  *
9  * This abstraction carries sctp events to the ULP (sockets).
10  *
11  * The SCTP reference implementation is free software;
12  * you can redistribute it and/or modify it under the terms of
13  * the GNU General Public License as published by
14  * the Free Software Foundation; either version 2, or (at your option)
15  * any later version.
16  *
17  * The SCTP reference implementation is distributed in the hope that it
18  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
19  *                 ************************
20  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21  * See the GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with GNU CC; see the file COPYING.  If not, write to
25  * the Free Software Foundation, 59 Temple Place - Suite 330,
26  * Boston, MA 02111-1307, USA.
27  *
28  * Please send any bug reports or fixes you make to the
29  * email address(es):
30  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
31  *
32  * Or submit a bug report through the following website:
33  *    http://www.sf.net/projects/lksctp
34  *
35  * Written or modified by:
36  *    Jon Grimm             <jgrimm@us.ibm.com>
37  *    La Monte H.P. Yarroll <piggy@acm.org>
38  *    Sridhar Samudrala     <sri@us.ibm.com>
39  *
40  * Any bugs reported given to us we will try to fix... any fixes shared will
41  * be incorporated into the next SCTP release.
42  */
43
44 #include <linux/types.h>
45 #include <linux/skbuff.h>
46 #include <net/sock.h>
47 #include <net/sctp/structs.h>
48 #include <net/sctp/sctp.h>
49 #include <net/sctp/sm.h>
50
51 /* Forward declarations for internal helpers.  */
52 static struct sctp_ulpevent * sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
53                                               struct sctp_ulpevent *);
54 static struct sctp_ulpevent * sctp_ulpq_order(struct sctp_ulpq *,
55                                               struct sctp_ulpevent *);
56
57 /* 1st Level Abstractions */
58
59 /* Initialize a ULP queue from a block of memory.  */
60 struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq,
61                                  struct sctp_association *asoc)
62 {
63         memset(ulpq, 0, sizeof(struct sctp_ulpq));
64
65         ulpq->asoc = asoc;
66         skb_queue_head_init(&ulpq->reasm);
67         skb_queue_head_init(&ulpq->lobby);
68         ulpq->pd_mode  = 0;
69         ulpq->malloced = 0;
70
71         return ulpq;
72 }
73
74
75 /* Flush the reassembly and ordering queues.  */
76 static void sctp_ulpq_flush(struct sctp_ulpq *ulpq)
77 {
78         struct sk_buff *skb;
79         struct sctp_ulpevent *event;
80
81         while ((skb = __skb_dequeue(&ulpq->lobby)) != NULL) {
82                 event = sctp_skb2event(skb);
83                 sctp_ulpevent_free(event);
84         }
85
86         while ((skb = __skb_dequeue(&ulpq->reasm)) != NULL) {
87                 event = sctp_skb2event(skb);
88                 sctp_ulpevent_free(event);
89         }
90
91 }
92
93 /* Dispose of a ulpqueue.  */
94 void sctp_ulpq_free(struct sctp_ulpq *ulpq)
95 {
96         sctp_ulpq_flush(ulpq);
97         if (ulpq->malloced)
98                 kfree(ulpq);
99 }
100
101 /* Process an incoming DATA chunk.  */
102 int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
103                         gfp_t gfp)
104 {
105         struct sk_buff_head temp;
106         sctp_data_chunk_t *hdr;
107         struct sctp_ulpevent *event;
108
109         hdr = (sctp_data_chunk_t *) chunk->chunk_hdr;
110
111         /* Create an event from the incoming chunk. */
112         event = sctp_ulpevent_make_rcvmsg(chunk->asoc, chunk, gfp);
113         if (!event)
114                 return -ENOMEM;
115
116         /* Do reassembly if needed.  */
117         event = sctp_ulpq_reasm(ulpq, event);
118
119         /* Do ordering if needed.  */
120         if ((event) && (event->msg_flags & MSG_EOR)){
121                 /* Create a temporary list to collect chunks on.  */
122                 skb_queue_head_init(&temp);
123                 __skb_queue_tail(&temp, sctp_event2skb(event));
124
125                 event = sctp_ulpq_order(ulpq, event);
126         }
127
128         /* Send event to the ULP.  'event' is the sctp_ulpevent for
129          * very first SKB on the 'temp' list.
130          */
131         if (event)
132                 sctp_ulpq_tail_event(ulpq, event);
133
134         return 0;
135 }
136
137 /* Add a new event for propagation to the ULP.  */
138 /* Clear the partial delivery mode for this socket.   Note: This
139  * assumes that no association is currently in partial delivery mode.
140  */
141 int sctp_clear_pd(struct sock *sk)
142 {
143         struct sctp_sock *sp = sctp_sk(sk);
144
145         sp->pd_mode = 0;
146         if (!skb_queue_empty(&sp->pd_lobby)) {
147                 struct list_head *list;
148                 sctp_skb_list_tail(&sp->pd_lobby, &sk->sk_receive_queue);
149                 list = (struct list_head *)&sctp_sk(sk)->pd_lobby;
150                 INIT_LIST_HEAD(list);
151                 return 1;
152         }
153         return 0;
154 }
155
156 /* Clear the pd_mode and restart any pending messages waiting for delivery. */
157 static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq)
158 {
159         ulpq->pd_mode = 0;
160         return sctp_clear_pd(ulpq->asoc->base.sk);
161 }
162
163 /* If the SKB of 'event' is on a list, it is the first such member
164  * of that list.
165  */
166 int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event)
167 {
168         struct sock *sk = ulpq->asoc->base.sk;
169         struct sk_buff_head *queue, *skb_list;
170         struct sk_buff *skb = sctp_event2skb(event);
171         int clear_pd = 0;
172
173         skb_list = (struct sk_buff_head *) skb->prev;
174
175         /* If the socket is just going to throw this away, do not
176          * even try to deliver it.
177          */
178         if (sock_flag(sk, SOCK_DEAD) || (sk->sk_shutdown & RCV_SHUTDOWN))
179                 goto out_free;
180
181         /* Check if the user wishes to receive this event.  */
182         if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe))
183                 goto out_free;
184
185         /* If we are in partial delivery mode, post to the lobby until
186          * partial delivery is cleared, unless, of course _this_ is
187          * the association the cause of the partial delivery.
188          */
189
190         if (!sctp_sk(sk)->pd_mode) {
191                 queue = &sk->sk_receive_queue;
192         } else if (ulpq->pd_mode) {
193                 if (event->msg_flags & MSG_NOTIFICATION)
194                         queue = &sctp_sk(sk)->pd_lobby;
195                 else {
196                         clear_pd = event->msg_flags & MSG_EOR;
197                         queue = &sk->sk_receive_queue;
198                 }
199         } else
200                 queue = &sctp_sk(sk)->pd_lobby;
201
202
203         /* If we are harvesting multiple skbs they will be
204          * collected on a list.
205          */
206         if (skb_list)
207                 sctp_skb_list_tail(skb_list, queue);
208         else
209                 __skb_queue_tail(queue, skb);
210
211         /* Did we just complete partial delivery and need to get
212          * rolling again?  Move pending data to the receive
213          * queue.
214          */
215         if (clear_pd)
216                 sctp_ulpq_clear_pd(ulpq);
217
218         if (queue == &sk->sk_receive_queue)
219                 sk->sk_data_ready(sk, 0);
220         return 1;
221
222 out_free:
223         if (skb_list)
224                 sctp_queue_purge_ulpevents(skb_list);
225         else
226                 sctp_ulpevent_free(event);
227
228         return 0;
229 }
230
231 /* 2nd Level Abstractions */
232
233 /* Helper function to store chunks that need to be reassembled.  */
234 static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
235                                          struct sctp_ulpevent *event)
236 {
237         struct sk_buff *pos;
238         struct sctp_ulpevent *cevent;
239         __u32 tsn, ctsn;
240
241         tsn = event->tsn;
242
243         /* See if it belongs at the end. */
244         pos = skb_peek_tail(&ulpq->reasm);
245         if (!pos) {
246                 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
247                 return;
248         }
249
250         /* Short circuit just dropping it at the end. */
251         cevent = sctp_skb2event(pos);
252         ctsn = cevent->tsn;
253         if (TSN_lt(ctsn, tsn)) {
254                 __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
255                 return;
256         }
257
258         /* Find the right place in this list. We store them by TSN.  */
259         skb_queue_walk(&ulpq->reasm, pos) {
260                 cevent = sctp_skb2event(pos);
261                 ctsn = cevent->tsn;
262
263                 if (TSN_lt(tsn, ctsn))
264                         break;
265         }
266
267         /* Insert before pos. */
268         __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->reasm);
269
270 }
271
272 /* Helper function to return an event corresponding to the reassembled
273  * datagram.
274  * This routine creates a re-assembled skb given the first and last skb's
275  * as stored in the reassembly queue. The skb's may be non-linear if the sctp
276  * payload was fragmented on the way and ip had to reassemble them.
277  * We add the rest of skb's to the first skb's fraglist.
278  */
279 static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *queue, struct sk_buff *f_frag, struct sk_buff *l_frag)
280 {
281         struct sk_buff *pos;
282         struct sctp_ulpevent *event;
283         struct sk_buff *pnext, *last;
284         struct sk_buff *list = skb_shinfo(f_frag)->frag_list;
285
286         /* Store the pointer to the 2nd skb */
287         if (f_frag == l_frag)
288                 pos = NULL;
289         else
290                 pos = f_frag->next;
291
292         /* Get the last skb in the f_frag's frag_list if present. */
293         for (last = list; list; last = list, list = list->next);
294
295         /* Add the list of remaining fragments to the first fragments
296          * frag_list.
297          */
298         if (last)
299                 last->next = pos;
300         else
301                 skb_shinfo(f_frag)->frag_list = pos;
302
303         /* Remove the first fragment from the reassembly queue.  */
304         __skb_unlink(f_frag, queue);
305         while (pos) {
306
307                 pnext = pos->next;
308
309                 /* Update the len and data_len fields of the first fragment. */
310                 f_frag->len += pos->len;
311                 f_frag->data_len += pos->len;
312
313                 /* Remove the fragment from the reassembly queue.  */
314                 __skb_unlink(pos, queue);
315         
316                 /* Break if we have reached the last fragment.  */
317                 if (pos == l_frag)
318                         break;
319                 pos->next = pnext;
320                 pos = pnext;
321         };
322
323         event = sctp_skb2event(f_frag);
324         SCTP_INC_STATS(SCTP_MIB_REASMUSRMSGS);
325
326         return event;
327 }
328
329
330 /* Helper function to check if an incoming chunk has filled up the last
331  * missing fragment in a SCTP datagram and return the corresponding event.
332  */
333 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ulpq)
334 {
335         struct sk_buff *pos;
336         struct sctp_ulpevent *cevent;
337         struct sk_buff *first_frag = NULL;
338         __u32 ctsn, next_tsn;
339         struct sctp_ulpevent *retval = NULL;
340
341         /* Initialized to 0 just to avoid compiler warning message.  Will
342          * never be used with this value. It is referenced only after it
343          * is set when we find the first fragment of a message.
344          */
345         next_tsn = 0;
346
347         /* The chunks are held in the reasm queue sorted by TSN.
348          * Walk through the queue sequentially and look for a sequence of
349          * fragmented chunks that complete a datagram.
350          * 'first_frag' and next_tsn are reset when we find a chunk which
351          * is the first fragment of a datagram. Once these 2 fields are set
352          * we expect to find the remaining middle fragments and the last
353          * fragment in order. If not, first_frag is reset to NULL and we
354          * start the next pass when we find another first fragment.
355          */
356         skb_queue_walk(&ulpq->reasm, pos) {
357                 cevent = sctp_skb2event(pos);
358                 ctsn = cevent->tsn;
359
360                 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
361                 case SCTP_DATA_FIRST_FRAG:
362                         first_frag = pos;
363                         next_tsn = ctsn + 1;
364                         break;
365
366                 case SCTP_DATA_MIDDLE_FRAG:
367                         if ((first_frag) && (ctsn == next_tsn))
368                                 next_tsn++;
369                         else
370                                 first_frag = NULL;
371                         break;
372
373                 case SCTP_DATA_LAST_FRAG:
374                         if (first_frag && (ctsn == next_tsn))
375                                 goto found;
376                         else
377                                 first_frag = NULL;
378                         break;
379                 };
380
381         }
382 done:
383         return retval;
384 found:
385         retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, pos);
386         if (retval)
387                 retval->msg_flags |= MSG_EOR;
388         goto done;
389 }
390
391 /* Retrieve the next set of fragments of a partial message. */
392 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq)
393 {
394         struct sk_buff *pos, *last_frag, *first_frag;
395         struct sctp_ulpevent *cevent;
396         __u32 ctsn, next_tsn;
397         int is_last;
398         struct sctp_ulpevent *retval;
399
400         /* The chunks are held in the reasm queue sorted by TSN.
401          * Walk through the queue sequentially and look for the first
402          * sequence of fragmented chunks.
403          */
404
405         if (skb_queue_empty(&ulpq->reasm))
406                 return NULL;
407
408         last_frag = first_frag = NULL;
409         retval = NULL;
410         next_tsn = 0;
411         is_last = 0;
412
413         skb_queue_walk(&ulpq->reasm, pos) {
414                 cevent = sctp_skb2event(pos);
415                 ctsn = cevent->tsn;
416
417                 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
418                 case SCTP_DATA_MIDDLE_FRAG:
419                         if (!first_frag) {
420                                 first_frag = pos;
421                                 next_tsn = ctsn + 1;
422                                 last_frag = pos;
423                         } else if (next_tsn == ctsn)
424                                 next_tsn++;
425                         else
426                                 goto done;
427                         break;
428                 case SCTP_DATA_LAST_FRAG:
429                         if (!first_frag)
430                                 first_frag = pos;
431                         else if (ctsn != next_tsn)
432                                 goto done;
433                         last_frag = pos;
434                         is_last = 1;
435                         goto done;
436                 default:
437                         return NULL;
438                 };
439         }
440
441         /* We have the reassembled event. There is no need to look
442          * further.
443          */
444 done:
445         retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
446         if (retval && is_last)
447                 retval->msg_flags |= MSG_EOR;
448
449         return retval;
450 }
451
452
453 /* Helper function to reassemble chunks.  Hold chunks on the reasm queue that
454  * need reassembling.
455  */
456 static struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
457                                                 struct sctp_ulpevent *event)
458 {
459         struct sctp_ulpevent *retval = NULL;
460
461         /* Check if this is part of a fragmented message.  */
462         if (SCTP_DATA_NOT_FRAG == (event->msg_flags & SCTP_DATA_FRAG_MASK)) {
463                 event->msg_flags |= MSG_EOR;
464                 return event;
465         }
466
467         sctp_ulpq_store_reasm(ulpq, event);
468         if (!ulpq->pd_mode)
469                 retval = sctp_ulpq_retrieve_reassembled(ulpq);
470         else {
471                 __u32 ctsn, ctsnap;
472
473                 /* Do not even bother unless this is the next tsn to
474                  * be delivered.
475                  */
476                 ctsn = event->tsn;
477                 ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map);
478                 if (TSN_lte(ctsn, ctsnap))
479                         retval = sctp_ulpq_retrieve_partial(ulpq);
480         }
481
482         return retval;
483 }
484
485 /* Retrieve the first part (sequential fragments) for partial delivery.  */
486 static inline struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq)
487 {
488         struct sk_buff *pos, *last_frag, *first_frag;
489         struct sctp_ulpevent *cevent;
490         __u32 ctsn, next_tsn;
491         struct sctp_ulpevent *retval;
492
493         /* The chunks are held in the reasm queue sorted by TSN.
494          * Walk through the queue sequentially and look for a sequence of
495          * fragmented chunks that start a datagram.
496          */
497
498         if (skb_queue_empty(&ulpq->reasm))
499                 return NULL;
500
501         last_frag = first_frag = NULL;
502         retval = NULL;
503         next_tsn = 0;
504
505         skb_queue_walk(&ulpq->reasm, pos) {
506                 cevent = sctp_skb2event(pos);
507                 ctsn = cevent->tsn;
508
509                 switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
510                 case SCTP_DATA_FIRST_FRAG:
511                         if (!first_frag) {
512                                 first_frag = pos;
513                                 next_tsn = ctsn + 1;
514                                 last_frag = pos;
515                         } else
516                                 goto done;
517                         break;
518
519                 case SCTP_DATA_MIDDLE_FRAG:
520                         if (!first_frag)
521                                 return NULL;
522                         if (ctsn == next_tsn) {
523                                 next_tsn++;
524                                 last_frag = pos;
525                         } else
526                                 goto done;
527                         break;
528                 default:
529                         return NULL;
530                 };
531         }
532
533         /* We have the reassembled event. There is no need to look
534          * further.
535          */
536 done:
537         retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
538         return retval;
539 }
540
541 /* Helper function to gather skbs that have possibly become
542  * ordered by an an incoming chunk.
543  */
544 static inline void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq,
545                                               struct sctp_ulpevent *event)
546 {
547         struct sk_buff_head *event_list;
548         struct sk_buff *pos, *tmp;
549         struct sctp_ulpevent *cevent;
550         struct sctp_stream *in;
551         __u16 sid, csid;
552         __u16 ssn, cssn;
553
554         sid = event->stream;
555         ssn = event->ssn;
556         in  = &ulpq->asoc->ssnmap->in;
557
558         event_list = (struct sk_buff_head *) sctp_event2skb(event)->prev;
559
560         /* We are holding the chunks by stream, by SSN.  */
561         sctp_skb_for_each(pos, &ulpq->lobby, tmp) {
562                 cevent = (struct sctp_ulpevent *) pos->cb;
563                 csid = cevent->stream;
564                 cssn = cevent->ssn;
565
566                 /* Have we gone too far?  */
567                 if (csid > sid)
568                         break;
569
570                 /* Have we not gone far enough?  */
571                 if (csid < sid)
572                         continue;
573
574                 if (cssn != sctp_ssn_peek(in, sid))
575                         break;
576
577                 /* Found it, so mark in the ssnmap. */
578                 sctp_ssn_next(in, sid);
579
580                 __skb_unlink(pos, &ulpq->lobby);
581
582                 /* Attach all gathered skbs to the event.  */
583                 __skb_queue_tail(event_list, pos);
584         }
585 }
586
587 /* Helper function to store chunks needing ordering.  */
588 static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq,
589                                            struct sctp_ulpevent *event)
590 {
591         struct sk_buff *pos;
592         struct sctp_ulpevent *cevent;
593         __u16 sid, csid;
594         __u16 ssn, cssn;
595
596         pos = skb_peek_tail(&ulpq->lobby);
597         if (!pos) {
598                 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
599                 return;
600         }
601
602         sid = event->stream;
603         ssn = event->ssn;
604         
605         cevent = (struct sctp_ulpevent *) pos->cb;
606         csid = cevent->stream;
607         cssn = cevent->ssn;
608         if (sid > csid) {
609                 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
610                 return;
611         }
612
613         if ((sid == csid) && SSN_lt(cssn, ssn)) {
614                 __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
615                 return;
616         }
617
618         /* Find the right place in this list.  We store them by
619          * stream ID and then by SSN.
620          */
621         skb_queue_walk(&ulpq->lobby, pos) {
622                 cevent = (struct sctp_ulpevent *) pos->cb;
623                 csid = cevent->stream;
624                 cssn = cevent->ssn;
625
626                 if (csid > sid)
627                         break;
628                 if (csid == sid && SSN_lt(ssn, cssn))
629                         break;
630         }
631
632
633         /* Insert before pos. */
634         __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->lobby);
635
636 }
637
638 static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq,
639                                              struct sctp_ulpevent *event)
640 {
641         __u16 sid, ssn;
642         struct sctp_stream *in;
643
644         /* Check if this message needs ordering.  */
645         if (SCTP_DATA_UNORDERED & event->msg_flags)
646                 return event;
647
648         /* Note: The stream ID must be verified before this routine.  */
649         sid = event->stream;
650         ssn = event->ssn;
651         in  = &ulpq->asoc->ssnmap->in;
652
653         /* Is this the expected SSN for this stream ID?  */
654         if (ssn != sctp_ssn_peek(in, sid)) {
655                 /* We've received something out of order, so find where it
656                  * needs to be placed.  We order by stream and then by SSN.
657                  */
658                 sctp_ulpq_store_ordered(ulpq, event);
659                 return NULL;
660         }
661
662         /* Mark that the next chunk has been found.  */
663         sctp_ssn_next(in, sid);
664
665         /* Go find any other chunks that were waiting for
666          * ordering.
667          */
668         sctp_ulpq_retrieve_ordered(ulpq, event);
669
670         return event;
671 }
672
673 /* Helper function to gather skbs that have possibly become
674  * ordered by forward tsn skipping their dependencies.
675  */
676 static inline void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq)
677 {
678         struct sk_buff *pos, *tmp;
679         struct sctp_ulpevent *cevent;
680         struct sctp_ulpevent *event;
681         struct sctp_stream *in;
682         struct sk_buff_head temp;
683         __u16 csid, cssn;
684
685         in  = &ulpq->asoc->ssnmap->in;
686
687         /* We are holding the chunks by stream, by SSN.  */
688         skb_queue_head_init(&temp);
689         event = NULL;
690         sctp_skb_for_each(pos, &ulpq->lobby, tmp) {
691                 cevent = (struct sctp_ulpevent *) pos->cb;
692                 csid = cevent->stream;
693                 cssn = cevent->ssn;
694
695                 if (cssn != sctp_ssn_peek(in, csid))
696                         break;
697
698                 /* Found it, so mark in the ssnmap. */         
699                 sctp_ssn_next(in, csid);
700
701                 __skb_unlink(pos, &ulpq->lobby);
702                 if (!event) {                                           
703                         /* Create a temporary list to collect chunks on.  */
704                         event = sctp_skb2event(pos);
705                         __skb_queue_tail(&temp, sctp_event2skb(event));
706                 } else {
707                         /* Attach all gathered skbs to the event.  */
708                         __skb_queue_tail(&temp, pos);
709                 }
710         }
711
712         /* Send event to the ULP.  'event' is the sctp_ulpevent for
713          * very first SKB on the 'temp' list.
714          */
715         if (event)
716                 sctp_ulpq_tail_event(ulpq, event);
717 }
718
719 /* Skip over an SSN. */
720 void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn)
721 {
722         struct sctp_stream *in;
723
724         /* Note: The stream ID must be verified before this routine.  */
725         in  = &ulpq->asoc->ssnmap->in;
726
727         /* Is this an old SSN?  If so ignore. */
728         if (SSN_lt(ssn, sctp_ssn_peek(in, sid)))
729                 return;
730
731         /* Mark that we are no longer expecting this SSN or lower. */
732         sctp_ssn_skip(in, sid, ssn);
733
734         /* Go find any other chunks that were waiting for
735          * ordering and deliver them if needed. 
736          */
737         sctp_ulpq_reap_ordered(ulpq);
738         return;
739 }
740
741 /* Renege 'needed' bytes from the ordering queue. */
742 static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed)
743 {
744         __u16 freed = 0;
745         __u32 tsn;
746         struct sk_buff *skb;
747         struct sctp_ulpevent *event;
748         struct sctp_tsnmap *tsnmap;
749
750         tsnmap = &ulpq->asoc->peer.tsn_map;
751
752         while ((skb = __skb_dequeue_tail(&ulpq->lobby)) != NULL) {
753                 freed += skb_headlen(skb);
754                 event = sctp_skb2event(skb);
755                 tsn = event->tsn;
756
757                 sctp_ulpevent_free(event);
758                 sctp_tsnmap_renege(tsnmap, tsn);
759                 if (freed >= needed)
760                         return freed;
761         }
762
763         return freed;
764 }
765
766 /* Renege 'needed' bytes from the reassembly queue. */
767 static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed)
768 {
769         __u16 freed = 0;
770         __u32 tsn;
771         struct sk_buff *skb;
772         struct sctp_ulpevent *event;
773         struct sctp_tsnmap *tsnmap;
774
775         tsnmap = &ulpq->asoc->peer.tsn_map;
776
777         /* Walk backwards through the list, reneges the newest tsns. */
778         while ((skb = __skb_dequeue_tail(&ulpq->reasm)) != NULL) {
779                 freed += skb_headlen(skb);
780                 event = sctp_skb2event(skb);
781                 tsn = event->tsn;
782
783                 sctp_ulpevent_free(event);
784                 sctp_tsnmap_renege(tsnmap, tsn);
785                 if (freed >= needed)
786                         return freed;
787         }
788
789         return freed;
790 }
791
792 /* Partial deliver the first message as there is pressure on rwnd. */
793 void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq,
794                                 struct sctp_chunk *chunk,
795                                 gfp_t gfp)
796 {
797         struct sctp_ulpevent *event;
798         struct sctp_association *asoc;
799
800         asoc = ulpq->asoc;
801
802         /* Are we already in partial delivery mode?  */
803         if (!sctp_sk(asoc->base.sk)->pd_mode) {
804
805                 /* Is partial delivery possible?  */
806                 event = sctp_ulpq_retrieve_first(ulpq);
807                 /* Send event to the ULP.   */
808                 if (event) {
809                         sctp_ulpq_tail_event(ulpq, event);
810                         sctp_sk(asoc->base.sk)->pd_mode = 1;
811                         ulpq->pd_mode = 1;
812                         return;
813                 }
814         }
815 }
816
817 /* Renege some packets to make room for an incoming chunk.  */
818 void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
819                       gfp_t gfp)
820 {
821         struct sctp_association *asoc;
822         __u16 needed, freed;
823
824         asoc = ulpq->asoc;
825
826         if (chunk) {
827                 needed = ntohs(chunk->chunk_hdr->length);
828                 needed -= sizeof(sctp_data_chunk_t);
829         } else 
830                 needed = SCTP_DEFAULT_MAXWINDOW;
831
832         freed = 0;
833
834         if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) {
835                 freed = sctp_ulpq_renege_order(ulpq, needed);
836                 if (freed < needed) {
837                         freed += sctp_ulpq_renege_frags(ulpq, needed - freed);
838                 }
839         }
840         /* If able to free enough room, accept this chunk. */
841         if (chunk && (freed >= needed)) {
842                 __u32 tsn;
843                 tsn = ntohl(chunk->subh.data_hdr->tsn);
844                 sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn);
845                 sctp_ulpq_tail_data(ulpq, chunk, gfp);
846                 
847                 sctp_ulpq_partial_delivery(ulpq, chunk, gfp);
848         }
849
850         return;
851 }
852
853
854
855 /* Notify the application if an association is aborted and in
856  * partial delivery mode.  Send up any pending received messages.
857  */
858 void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
859 {
860         struct sctp_ulpevent *ev = NULL;
861         struct sock *sk;
862
863         if (!ulpq->pd_mode)
864                 return;
865
866         sk = ulpq->asoc->base.sk;
867         if (sctp_ulpevent_type_enabled(SCTP_PARTIAL_DELIVERY_EVENT,
868                                        &sctp_sk(sk)->subscribe))
869                 ev = sctp_ulpevent_make_pdapi(ulpq->asoc,
870                                               SCTP_PARTIAL_DELIVERY_ABORTED,
871                                               gfp);
872         if (ev)
873                 __skb_queue_tail(&sk->sk_receive_queue, sctp_event2skb(ev));
874
875         /* If there is data waiting, send it up the socket now. */
876         if (sctp_ulpq_clear_pd(ulpq) || ev)
877                 sk->sk_data_ready(sk, 0);
878 }