]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ip_gre: Make none-tun-dst gre tunnel store tunnel info as metadat_dst in recv
authorwenxu <wenxu@ucloud.cn>
Wed, 20 Nov 2019 02:59:39 +0000 (10:59 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 21 Nov 2019 06:21:30 +0000 (22:21 -0800)
Currently collect_md gre tunnel will store the tunnel info(metadata_dst)
to skb_dst.
And now the non-tun-dst gre tunnel already can add tunnel header through
lwtunnel.

When received a arp_request on the non-tun-dst gre tunnel. The packet of
arp response will send through the non-tun-dst tunnel without tunnel info
which will lead the arp response packet to be dropped.

If the non-tun-dst gre tunnel also store the tunnel info as metadata_dst,
The arp response packet will set the releted tunnel info in the
iptunnel_metadata_reply.

The following is the test script:

ip netns add cl
ip l add dev vethc type veth peer name eth0 netns cl

ifconfig vethc 172.168.0.7/24 up
ip l add dev tun1000 type gretap key 1000

ip link add user1000 type vrf table 1
ip l set user1000 up
ip l set dev tun1000 master user1000
ifconfig tun1000 10.0.1.1/24 up

ip netns exec cl ifconfig eth0 172.168.0.17/24 up
ip netns exec cl ip l add dev tun type gretap local 172.168.0.17 remote 172.168.0.7 key 1000
ip netns exec cl ifconfig tun 10.0.1.7/24 up
ip r r 10.0.1.7 encap ip id 1000 dst 172.168.0.17 key dev tun1000 table 1

With this patch
ip netns exec cl ping 10.0.1.1 can success

Signed-off-by: wenxu <wenxu@ucloud.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_gre.c

index 10636fb6093e3cba09cfe6835077edb664e7244d..572b6307a2dff1a29c6686fb963aeb4a51410447 100644 (file)
@@ -340,6 +340,8 @@ static int __ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
                                  iph->saddr, iph->daddr, tpi->key);
 
        if (tunnel) {
+               const struct iphdr *tnl_params;
+
                if (__iptunnel_pull_header(skb, hdr_len, tpi->proto,
                                           raw_proto, false) < 0)
                        goto drop;
@@ -348,7 +350,9 @@ static int __ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
                        skb_pop_mac_header(skb);
                else
                        skb_reset_mac_header(skb);
-               if (tunnel->collect_md) {
+
+               tnl_params = &tunnel->parms.iph;
+               if (tunnel->collect_md || tnl_params->daddr == 0) {
                        __be16 flags;
                        __be64 tun_id;