net: ipv4: use a dedicated counter for icmp_v4 redirect packets
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Wed, 6 Feb 2019 18:18:04 +0000 (19:18 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Feb 2019 08:06:42 +0000 (09:06 +0100)
commit4e4d02b992fb8e5d95c78c373b5d6b3211c86598
tree7d86cca8c1cac69b8eda233e7df4b942230120ad
parent3aafc4459c4144ef8ab243cfb5e6947f5ba46a35
net: ipv4: use a dedicated counter for icmp_v4 redirect packets

[ Upstream commit c09551c6ff7fe16a79a42133bcecba5fc2fc3291 ]

According to the algorithm described in the comment block at the
beginning of ip_rt_send_redirect, the host should try to send
'ip_rt_redirect_number' ICMP redirect packets with an exponential
backoff and then stop sending them at all assuming that the destination
ignores redirects.
If the device has previously sent some ICMP error packets that are
rate-limited (e.g TTL expired) and continues to receive traffic,
the redirect packets will never be transmitted. This happens since
peer->rate_tokens will be typically greater than 'ip_rt_redirect_number'
and so it will never be reset even if the redirect silence timeout
(ip_rt_redirect_silence) has elapsed without receiving any packet
requiring redirects.

Fix it by using a dedicated counter for the number of ICMP redirect
packets that has been sent by the host

I have not been able to identify a given commit that introduced the
issue since ip_rt_send_redirect implements the same rate-limiting
algorithm from commit 1da177e4c3f4 ("Linux-2.6.12-rc2")

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/net/inetpeer.h
net/ipv4/inetpeer.c
net/ipv4/route.c