--- zzzz-none-000/linux-4.4.271/net/ipv4/ip_tunnel_core.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/net/ipv4/ip_tunnel_core.c 2023-04-19 10:22:30.000000000 +0000 @@ -47,6 +47,7 @@ #include #include #include +#include int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __be32 src, __be32 dst, __u8 proto, @@ -55,7 +56,12 @@ int pkt_len = skb->len - skb_inner_network_offset(skb); struct net *net = dev_net(rt->dst.dev); struct iphdr *iph; + struct net_device *in_dev = NULL; int err; + int skb_iif; + + /* Save input interface index */ + skb_iif = skb->skb_iif; skb_scrub_packet(skb, xnet); @@ -79,7 +85,16 @@ iph->ttl = ttl; __ip_select_ident(net, iph, skb_shinfo(skb)->gso_segs ?: 1); + /* Get input interface */ + if (skb_iif) + in_dev = __dev_get_by_index(&init_net, skb_iif); + + if (proto == IPPROTO_IPV6 || proto == IPPROTO_GRE || + netif_is_vxlan(in_dev)) + skb->skb_iif = skb_iif; + err = ip_local_out(net, sk, skb); + if (unlikely(net_xmit_eval(err))) pkt_len = 0; return pkt_len;