vti[6]: fix packet tx through bpf_redirect() in XinY cases
commit5.4-rM2-2.2.x-imx-squashedf1ed10264e
upstream. I forgot the 4in6/6in4 cases in my previous patch. Let's fix them. Fixes:95224166a9
("vti[6]: fix packet tx through bpf_redirect()") Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
c467570443
commit
f8f90690df
|
@ -303,6 +303,7 @@ config SYN_COOKIES
|
||||||
|
|
||||||
config NET_IPVTI
|
config NET_IPVTI
|
||||||
tristate "Virtual (secure) IP: tunneling"
|
tristate "Virtual (secure) IP: tunneling"
|
||||||
|
depends on IPV6 || IPV6=n
|
||||||
select INET_TUNNEL
|
select INET_TUNNEL
|
||||||
select NET_IP_TUNNEL
|
select NET_IP_TUNNEL
|
||||||
select XFRM
|
select XFRM
|
||||||
|
|
|
@ -187,17 +187,39 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||||
int mtu;
|
int mtu;
|
||||||
|
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
struct rtable *rt;
|
switch (skb->protocol) {
|
||||||
|
case htons(ETH_P_IP): {
|
||||||
|
struct rtable *rt;
|
||||||
|
|
||||||
fl->u.ip4.flowi4_oif = dev->ifindex;
|
fl->u.ip4.flowi4_oif = dev->ifindex;
|
||||||
fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
|
fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
|
||||||
rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4);
|
rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4);
|
||||||
if (IS_ERR(rt)) {
|
if (IS_ERR(rt)) {
|
||||||
|
dev->stats.tx_carrier_errors++;
|
||||||
|
goto tx_error_icmp;
|
||||||
|
}
|
||||||
|
dst = &rt->dst;
|
||||||
|
skb_dst_set(skb, dst);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
|
case htons(ETH_P_IPV6):
|
||||||
|
fl->u.ip6.flowi6_oif = dev->ifindex;
|
||||||
|
fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
|
||||||
|
dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6);
|
||||||
|
if (dst->error) {
|
||||||
|
dst_release(dst);
|
||||||
|
dst = NULL;
|
||||||
|
dev->stats.tx_carrier_errors++;
|
||||||
|
goto tx_error_icmp;
|
||||||
|
}
|
||||||
|
skb_dst_set(skb, dst);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
dev->stats.tx_carrier_errors++;
|
dev->stats.tx_carrier_errors++;
|
||||||
goto tx_error_icmp;
|
goto tx_error_icmp;
|
||||||
}
|
}
|
||||||
dst = &rt->dst;
|
|
||||||
skb_dst_set(skb, dst);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_hold(dst);
|
dst_hold(dst);
|
||||||
|
|
|
@ -450,15 +450,33 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
|
||||||
int mtu;
|
int mtu;
|
||||||
|
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
fl->u.ip6.flowi6_oif = dev->ifindex;
|
switch (skb->protocol) {
|
||||||
fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
|
case htons(ETH_P_IP): {
|
||||||
dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6);
|
struct rtable *rt;
|
||||||
if (dst->error) {
|
|
||||||
dst_release(dst);
|
fl->u.ip4.flowi4_oif = dev->ifindex;
|
||||||
dst = NULL;
|
fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
|
||||||
|
rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4);
|
||||||
|
if (IS_ERR(rt))
|
||||||
|
goto tx_err_link_failure;
|
||||||
|
dst = &rt->dst;
|
||||||
|
skb_dst_set(skb, dst);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case htons(ETH_P_IPV6):
|
||||||
|
fl->u.ip6.flowi6_oif = dev->ifindex;
|
||||||
|
fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
|
||||||
|
dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6);
|
||||||
|
if (dst->error) {
|
||||||
|
dst_release(dst);
|
||||||
|
dst = NULL;
|
||||||
|
goto tx_err_link_failure;
|
||||||
|
}
|
||||||
|
skb_dst_set(skb, dst);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
goto tx_err_link_failure;
|
goto tx_err_link_failure;
|
||||||
}
|
}
|
||||||
skb_dst_set(skb, dst);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_hold(dst);
|
dst_hold(dst);
|
||||||
|
|
Loading…
Reference in New Issue