Skip to content

Commit 16b9db1

Browse files
dsaherndavem330
authored andcommitted
vrf: Check skb for XFRM_TRANSFORMED flag
To avoid a loop with qdiscs and xfrms, check if the skb has already gone through the qdisc attached to the VRF device and then to the xfrm layer. If so, no need for a second redirect. Fixes: 193125d ("net: Introduce VRF device driver") Reported-by: Trev Larock <[email protected]> Signed-off-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0c922a4 commit 16b9db1

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/net/vrf.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,8 @@ static struct sk_buff *vrf_ip6_out(struct net_device *vrf_dev,
474474
if (rt6_need_strict(&ipv6_hdr(skb)->daddr))
475475
return skb;
476476

477-
if (qdisc_tx_is_default(vrf_dev))
477+
if (qdisc_tx_is_default(vrf_dev) ||
478+
IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
478479
return vrf_ip6_out_direct(vrf_dev, sk, skb);
479480

480481
return vrf_ip6_out_redirect(vrf_dev, skb);
@@ -686,7 +687,8 @@ static struct sk_buff *vrf_ip_out(struct net_device *vrf_dev,
686687
ipv4_is_lbcast(ip_hdr(skb)->daddr))
687688
return skb;
688689

689-
if (qdisc_tx_is_default(vrf_dev))
690+
if (qdisc_tx_is_default(vrf_dev) ||
691+
IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
690692
return vrf_ip_out_direct(vrf_dev, sk, skb);
691693

692694
return vrf_ip_out_redirect(vrf_dev, skb);

0 commit comments

Comments
 (0)