Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / net / sctp / ulpqueue.c
index e36ec5d..0b42710 100644 (file)
@@ -60,6 +60,7 @@ struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq,
 
        ulpq->asoc = asoc;
        skb_queue_head_init(&ulpq->reasm);
+       skb_queue_head_init(&ulpq->reasm_uo);
        skb_queue_head_init(&ulpq->lobby);
        ulpq->pd_mode  = 0;
 
@@ -83,6 +84,10 @@ void sctp_ulpq_flush(struct sctp_ulpq *ulpq)
                sctp_ulpevent_free(event);
        }
 
+       while ((skb = __skb_dequeue(&ulpq->reasm_uo)) != NULL) {
+               event = sctp_skb2event(skb);
+               sctp_ulpevent_free(event);
+       }
 }
 
 /* Dispose of a ulpqueue.  */
@@ -104,6 +109,9 @@ int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
        if (!event)
                return -ENOMEM;
 
+       event->ssn = ntohs(chunk->subh.data_hdr->ssn);
+       event->ppid = chunk->subh.data_hdr->ppid;
+
        /* Do reassembly if needed.  */
        event = sctp_ulpq_reasm(ulpq, event);
 
@@ -328,9 +336,10 @@ static void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
  * payload was fragmented on the way and ip had to reassemble them.
  * We add the rest of skb's to the first skb's fraglist.
  */
-static struct sctp_ulpevent *sctp_make_reassembled_event(struct net *net,
-       struct sk_buff_head *queue, struct sk_buff *f_frag,
-       struct sk_buff *l_frag)
+struct sctp_ulpevent *sctp_make_reassembled_event(struct net *net,
+                                                 struct sk_buff_head *queue,
+                                                 struct sk_buff *f_frag,
+                                                 struct sk_buff *l_frag)
 {
        struct sk_buff *pos;
        struct sk_buff *new = NULL;
@@ -853,7 +862,7 @@ static struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq,
        struct sctp_stream *stream;
 
        /* Check if this message needs ordering.  */
-       if (SCTP_DATA_UNORDERED & event->msg_flags)
+       if (event->msg_flags & SCTP_DATA_UNORDERED)
                return event;
 
        /* Note: The stream ID must be verified before this routine.  */
@@ -974,8 +983,8 @@ void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn)
        sctp_ulpq_reap_ordered(ulpq, sid);
 }
 
-static __u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq,
-               struct sk_buff_head *list, __u16 needed)
+__u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq, struct sk_buff_head *list,
+                           __u16 needed)
 {
        __u16 freed = 0;
        __u32 tsn, last_tsn;
@@ -1132,7 +1141,7 @@ void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, gfp_t gfp)
                                       &sctp_sk(sk)->subscribe))
                ev = sctp_ulpevent_make_pdapi(ulpq->asoc,
                                              SCTP_PARTIAL_DELIVERY_ABORTED,
-                                             gfp);
+                                             0, 0, 0, gfp);
        if (ev)
                __skb_queue_tail(&sk->sk_receive_queue, sctp_event2skb(ev));