!lwtunnel_cmp_encap(nha->fib_nh_lws, nhb->fib_nh_lws);
 }
 
-static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
+static inline unsigned int ip6_dst_mtu_maybe_forward(const struct dst_entry *dst,
+                                                    bool forwarding)
 {
        struct inet6_dev *idev;
        unsigned int mtu;
 
-       if (dst_metric_locked(dst, RTAX_MTU)) {
+       if (!forwarding || dst_metric_locked(dst, RTAX_MTU)) {
                mtu = dst_metric_raw(dst, RTAX_MTU);
                if (mtu)
                        goto out;
 
                }
        }
 
-       mtu = ip6_dst_mtu_forward(dst);
+       mtu = ip6_dst_mtu_maybe_forward(dst, true);
        if (mtu < IPV6_MIN_MTU)
                mtu = IPV6_MIN_MTU;
 
 
 
 INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst)
 {
-       struct inet6_dev *idev;
-       unsigned int mtu;
-
-       mtu = dst_metric_raw(dst, RTAX_MTU);
-       if (mtu)
-               goto out;
-
-       mtu = IPV6_MIN_MTU;
-
-       rcu_read_lock();
-       idev = __in6_dev_get(dst->dev);
-       if (idev)
-               mtu = idev->cnf.mtu6;
-       rcu_read_unlock();
-
-out:
-       mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
-
-       return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
+       return ip6_dst_mtu_maybe_forward(dst, false);
 }
 EXPORT_INDIRECT_CALLABLE(ip6_mtu);
 
 
                flow_tuple->mtu = ip_dst_mtu_maybe_forward(dst, true);
                break;
        case NFPROTO_IPV6:
-               flow_tuple->mtu = ip6_dst_mtu_forward(dst);
+               flow_tuple->mtu = ip6_dst_mtu_maybe_forward(dst, true);
                break;
        }