|
@@ -269,6 +269,11 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
|
|
|
* in the chain of fragments so far. We must know where to put
|
|
|
* this fragment, right?
|
|
|
*/
|
|
|
+ prev = fq->q.fragments_tail;
|
|
|
+ if (!prev || NFCT_FRAG6_CB(prev)->offset < offset) {
|
|
|
+ next = NULL;
|
|
|
+ goto found;
|
|
|
+ }
|
|
|
prev = NULL;
|
|
|
for (next = fq->q.fragments; next != NULL; next = next->next) {
|
|
|
if (NFCT_FRAG6_CB(next)->offset >= offset)
|
|
@@ -276,6 +281,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
|
|
|
prev = next;
|
|
|
}
|
|
|
|
|
|
+found:
|
|
|
/* We found where to put this one. Check for overlap with
|
|
|
* preceding fragment, and, if needed, align things so that
|
|
|
* any overlaps are eliminated.
|
|
@@ -341,6 +347,8 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
|
|
|
|
|
|
/* Insert this fragment in the chain of fragments. */
|
|
|
skb->next = next;
|
|
|
+ if (!next)
|
|
|
+ fq->q.fragments_tail = skb;
|
|
|
if (prev)
|
|
|
prev->next = skb;
|
|
|
else
|
|
@@ -464,6 +472,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
|
|
|
head->csum);
|
|
|
|
|
|
fq->q.fragments = NULL;
|
|
|
+ fq->q.fragments_tail = NULL;
|
|
|
|
|
|
/* all original skbs are linked into the NFCT_FRAG6_CB(head).orig */
|
|
|
fp = skb_shinfo(head)->frag_list;
|