On 3/6/18 3:10 AM, Stefano Brivio wrote:
> Currently, administrative MTU changes on a given netdevice are
> not reflected on route exceptions for MTU-less routes, with a
> set PMTU value, for that device:
>
> # ip -6 route get 2001:db8::b
> 2001:db8::b from :: dev vti_a proto kernel src 2001:db8::a metric 256 pref
> medium
> # ping6 -c 1 -q -s10000 2001:db8::b > /dev/null
> # ip netns exec a ip -6 route get 2001:db8::b
> 2001:db8::b from :: dev vti_a src 2001:db8::a metric 0
> cache expires 571sec mtu 4926 pref medium
> # ip link set dev vti_a mtu 3000
> # ip -6 route get 2001:db8::b
> 2001:db8::b from :: dev vti_a src 2001:db8::a metric 0
> cache expires 571sec mtu 4926 pref medium
> # ip link set dev vti_a mtu 9000
> # ip -6 route get 2001:db8::b
> 2001:db8::b from :: dev vti_a src 2001:db8::a metric 0
> cache expires 571sec mtu 4926 pref medium
>
> The first issue is that since commit fb56be83e43d ("net-ipv6: on
> device mtu change do not add mtu to mtu-less routes") we don't
> call rt6_exceptions_update_pmtu() from rt6_mtu_change_route(),
> which handles administrative MTU changes, if the regular route
> is MTU-less.
>
> However, PMTU exceptions should be always updated, as long as
> RTAX_MTU is not locked. Keep the check for MTU-less main route,
> as introduced by that commit, but, for exceptions,
> call rt6_exceptions_update_pmtu() regardless of that check.
>
> Once that is fixed, one problem remains: MTU changes are not
> reflected if the new MTU is higher than the previous one,
> because rt6_exceptions_update_pmtu() doesn't allow that. We
> should instead allow PMTU increase if the old PMTU matches the
> local MTU, as that implies that the old MTU was the lowest in the
> path, and PMTU discovery might lead to different results.
>
> The existing check in rt6_mtu_change_route() correctly took that
> case into account (for regular routes only), so factor it out
> and re-use it also in rt6_exceptions_update_pmtu().
>
> While at it, fix comments style and grammar, and try to be a bit
> more descriptive.
>
> Reported-by: Xiumei Mu <[email protected]>
> Fixes: fb56be83e43d ("net-ipv6: on device mtu change do not add mtu to
> mtu-less routes")
> Fixes: f5bbe7ee79c2 ("ipv6: prepare rt6_mtu_change() for exception table")
> Signed-off-by: Stefano Brivio <[email protected]>
> ---
Acked-by: David Ahern <[email protected]>