| From 1e0e5156dce84205919e6e1215deb7c697ac1ceb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 19 Jan 2019 13:11:25 +0800 |
| Subject: ip_tunnel: Make none-tunnel-dst tunnel port work with lwtunnel |
| |
| From: wenxu <wenxu@ucloud.cn> |
| |
| [ Upstream commit d71b57532d70c03f4671dd04e84157ac6bf021b0 ] |
| |
| ip l add dev tun type gretap key 1000 |
| ip a a dev tun 10.0.0.1/24 |
| |
| Packets with tun-id 1000 can be recived by tun dev. But packet can't |
| be sent through dev tun for non-tunnel-dst |
| |
| With this patch: tunnel-dst can be get through lwtunnel like beflow: |
| ip r a 10.0.0.7 encap ip dst 172.168.0.11 dev tun |
| |
| Signed-off-by: wenxu <wenxu@ucloud.cn> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/ipv4/ip_tunnel.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c |
| index e6ee6acac80c4..a4db2d79b9134 100644 |
| --- a/net/ipv4/ip_tunnel.c |
| +++ b/net/ipv4/ip_tunnel.c |
| @@ -653,13 +653,19 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, |
| dst = tnl_params->daddr; |
| if (dst == 0) { |
| /* NBMA tunnel */ |
| + struct ip_tunnel_info *tun_info; |
| |
| if (!skb_dst(skb)) { |
| dev->stats.tx_fifo_errors++; |
| goto tx_error; |
| } |
| |
| - if (skb->protocol == htons(ETH_P_IP)) { |
| + tun_info = skb_tunnel_info(skb); |
| + if (tun_info && (tun_info->mode & IP_TUNNEL_INFO_TX) && |
| + ip_tunnel_info_af(tun_info) == AF_INET && |
| + tun_info->key.u.ipv4.dst) |
| + dst = tun_info->key.u.ipv4.dst; |
| + else if (skb->protocol == htons(ETH_P_IP)) { |
| rt = skb_rtable(skb); |
| dst = rt_nexthop(rt, inner_iph->daddr); |
| } |
| -- |
| 2.20.1 |
| |