xfrm: Don't queue retransmitted packets if the original is still on the host
authorSteffen Klassert <steffen.klassert@secunet.com>
Wed, 16 Oct 2013 11:42:46 +0000 (13:42 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 21 Oct 2013 07:45:20 +0000 (09:45 +0200)
It does not make sense to queue retransmitted packets if the
original packet is still in some queue of this host. So add
a check to xdst_queue_output() and drop the packet if the
original packet is not yet sent.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Acked-by: Eric Dumazet <edumazet@google.com>
net/xfrm/xfrm_policy.c

index ed38d5d81f9e1f4890cf36447713badd48691489..e09edfcf1b796e982e06f0e96e080f7bc0893ec9 100644 (file)
@@ -1832,6 +1832,13 @@ static int xdst_queue_output(struct sk_buff *skb)
        struct dst_entry *dst = skb_dst(skb);
        struct xfrm_dst *xdst = (struct xfrm_dst *) dst;
        struct xfrm_policy_queue *pq = &xdst->pols[0]->polq;
+       const struct sk_buff *fclone = skb + 1;
+
+       if (unlikely(skb->fclone == SKB_FCLONE_ORIG &&
+                    fclone->fclone == SKB_FCLONE_CLONE)) {
+               kfree_skb(skb);
+               return 0;
+       }
 
        if (pq->hold_queue.qlen > XFRM_MAX_QUEUE_LEN) {
                kfree_skb(skb);