Skip to content

Commit f288424

Browse files
sbrivio-rhgregkh
authored andcommitted
ip6_tunnel: Fix encapsulation layout
[ Upstream commit d4d576f ] Commit 058214a ("ip6_tun: Add infrastructure for doing encapsulation") added the ip6_tnl_encap() call in ip6_tnl_xmit(), before the call to ipv6_push_frag_opts() to append the IPv6 Tunnel Encapsulation Limit option (option 4, RFC 2473, par. 5.1) to the outer IPv6 header. As long as the option didn't actually end up in generated packets, this wasn't an issue. Then commit 89a23c8 ("ip6_tunnel: Fix missing tunnel encapsulation limit option") fixed sending of this option, and the resulting layout, e.g. for FoU, is: .-------------------.------------.----------.-------------------.----- - - | Outer IPv6 Header | UDP header | Option 4 | Inner IPv6 Header | Payload '-------------------'------------'----------'-------------------'----- - - Needless to say, FoU and GUE (at least) won't work over IPv6. The option is appended by default, and I couldn't find a way to disable it with the current iproute2. Turn this into a more reasonable: .-------------------.----------.------------.-------------------.----- - - | Outer IPv6 Header | Option 4 | UDP header | Inner IPv6 Header | Payload '-------------------'----------'------------'-------------------'----- - - With this, and with 84dad55 ("udp6: fix encap return code for resubmitting"), FoU and GUE work again over IPv6. Fixes: 058214a ("ip6_tun: Add infrastructure for doing encapsulation") Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 8a86509 commit f288424

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

net/ipv6/ip6_tunnel.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,10 +1185,6 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
11851185
}
11861186
skb_dst_set(skb, dst);
11871187

1188-
if (encap_limit >= 0) {
1189-
init_tel_txopt(&opt, encap_limit);
1190-
ipv6_push_frag_opts(skb, &opt.ops, &proto);
1191-
}
11921188
hop_limit = hop_limit ? : ip6_dst_hoplimit(dst);
11931189

11941190
/* Calculate max headroom for all the headers and adjust
@@ -1203,6 +1199,11 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
12031199
if (err)
12041200
return err;
12051201

1202+
if (encap_limit >= 0) {
1203+
init_tel_txopt(&opt, encap_limit);
1204+
ipv6_push_frag_opts(skb, &opt.ops, &proto);
1205+
}
1206+
12061207
skb_push(skb, sizeof(struct ipv6hdr));
12071208
skb_reset_network_header(skb);
12081209
ipv6h = ipv6_hdr(skb);

0 commit comments

Comments
 (0)