094-v4.12-0001-ip6_tunnel-Fix-missing-tunnel-encapsulation-limit-op.patch 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. From 89a23c8b528bd2c89f3981573d6cd7d23840c8a6 Mon Sep 17 00:00:00 2001
  2. From: Craig Gallek <[email protected]>
  3. Date: Wed, 26 Apr 2017 14:37:45 -0400
  4. Subject: [PATCH] ip6_tunnel: Fix missing tunnel encapsulation limit option
  5. The IPv6 tunneling code tries to insert IPV6_TLV_TNL_ENCAP_LIMIT and
  6. IPV6_TLV_PADN options when an encapsulation limit is defined (the
  7. default is a limit of 4). An MTU adjustment is done to account for
  8. these options as well. However, the options are never present in the
  9. generated packets.
  10. The issue appears to be a subtlety between IPV6_DSTOPTS and
  11. IPV6_RTHDRDSTOPTS defined in RFC 3542. When the IPIP tunnel driver was
  12. written, the encap limit options were included as IPV6_RTHDRDSTOPTS in
  13. dst0opt of struct ipv6_txoptions. Later, ipv6_push_nfrags_opts was
  14. (correctly) updated to require IPV6_RTHDR options when IPV6_RTHDRDSTOPTS
  15. are to be used. This caused the options to no longer be included in v6
  16. encapsulated packets.
  17. The fix is to use IPV6_DSTOPTS (in dst1opt of struct ipv6_txoptions)
  18. instead. IPV6_DSTOPTS do not have the additional IPV6_RTHDR requirement.
  19. Fixes: 1df64a8569c7: ("[IPV6]: Add ip6ip6 tunnel driver.")
  20. Fixes: 333fad5364d6: ("[IPV6]: Support several new sockopt / ancillary data in Advanced API (RFC3542)")
  21. Signed-off-by: Craig Gallek <[email protected]>
  22. Signed-off-by: David S. Miller <[email protected]>
  23. ---
  24. net/ipv6/ip6_tunnel.c | 4 ++--
  25. 1 file changed, 2 insertions(+), 2 deletions(-)
  26. --- a/net/ipv6/ip6_tunnel.c
  27. +++ b/net/ipv6/ip6_tunnel.c
  28. @@ -957,7 +957,7 @@ static void init_tel_txopt(struct ipv6_t
  29. opt->dst_opt[5] = IPV6_TLV_PADN;
  30. opt->dst_opt[6] = 1;
  31. - opt->ops.dst0opt = (struct ipv6_opt_hdr *) opt->dst_opt;
  32. + opt->ops.dst1opt = (struct ipv6_opt_hdr *) opt->dst_opt;
  33. opt->ops.opt_nflen = 8;
  34. }
  35. @@ -1191,7 +1191,7 @@ route_lookup:
  36. if (encap_limit >= 0) {
  37. init_tel_txopt(&opt, encap_limit);
  38. - ipv6_push_nfrag_opts(skb, &opt.ops, &proto, NULL);
  39. + ipv6_push_frag_opts(skb, &opt.ops, &proto);
  40. }
  41. /* Calculate max headroom for all the headers and adjust