This patch allows route exceptions to specify an MTU above 65535 so that PMTU discovery can settle on an PMTU above 65535 (if the MTUs along the path allow for it). IP6_MAX_JUMBOGRAM_MTU is set to INT_MAX rather than UINT_MAX because MTU values and packet lengths are sometimes stored as signed integers. Signed-off-by: Mariusz Klimek --- include/linux/ipv6.h | 6 ++++++ include/net/ip6_route.h | 5 +++-- net/ipv6/route.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index a7421382a916..201c1615ac8e 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -196,6 +196,12 @@ static inline bool ipv6_l3mdev_skb(__u16 flags) #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) #define IP6CBMTU(skb) ((struct ip6_mtuinfo *)((skb)->cb)) +/* IPv6 jumbogram payload length is stored into a 32bit field, but cap the max + * MTU to INT_MAX because MTUs and packet lengths are sometimes represented as + * signed ints. + */ +#define IP6_MAX_JUMBOGRAM_MTU INT_MAX + static inline int inet6_iif(const struct sk_buff *skb) { bool l3_slave = ipv6_l3mdev_skb(IP6CB(skb)->flags); diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 09ffe0f13ce7..9c9fbf881235 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -38,8 +38,9 @@ struct route_info { #define RT6_LOOKUP_F_IGNORE_LINKSTATE 0x00000040 #define RT6_LOOKUP_F_DST_NOREF 0x00000080 -/* We do not (yet ?) support IPv6 jumbograms (RFC 2675) - * Unlike IPv4, hdr->seg_len doesn't include the IPv6 header +/* We do not (yet ?) fully support IPv6 jumbograms (RFC 2675) for all protocols. + * Where jumbograms are supported, IP6_MAX_JUMBOGRAM_MTU should be used instead. + * Unlike IPv4, hdr->seg_len doesn't include the IPv6 header. */ #define IP6_MAX_MTU (0xFFFF + sizeof(struct ipv6hdr)) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 636f0120d7e3..ac38771c49cd 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1656,7 +1656,7 @@ static unsigned int fib6_mtu(const struct fib6_result *res) rcu_read_unlock(); } - mtu = min_t(unsigned int, mtu, IP6_MAX_MTU); + mtu = min_t(unsigned int, mtu, IP6_MAX_JUMBOGRAM_MTU); return mtu - lwtunnel_headroom(nh->fib_nh_lws, mtu); } -- 2.47.3