net: ipv4: Emit notification when fib hardware flags are changed
authorAmit Cohen <amcohen@nvidia.com>
Mon, 1 Feb 2021 19:47:52 +0000 (21:47 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 3 Feb 2021 01:45:59 +0000 (17:45 -0800)
commit680aea08e78c003292415518ad270bc20f9c80b1
tree1215e16fb0586bf8b296e70a26c6f4ccd031cd31
parent1e7bdec6bbc7816cdc6a093374f4bf4e732c3d44
net: ipv4: Emit notification when fib hardware flags are changed

After installing a route to the kernel, user space receives an
acknowledgment, which means the route was installed in the kernel,
but not necessarily in hardware.

The asynchronous nature of route installation in hardware can lead to a
routing daemon advertising a route before it was actually installed in
hardware. This can result in packet loss or mis-routed packets until the
route is installed in hardware.

It is also possible for a route already installed in hardware to change
its action and therefore its flags. For example, a host route that is
trapping packets can be "promoted" to perform decapsulation following
the installation of an IPinIP/VXLAN tunnel.

Emit RTM_NEWROUTE notifications whenever RTM_F_OFFLOAD/RTM_F_TRAP flags
are changed. The aim is to provide an indication to user-space
(e.g., routing daemons) about the state of the route in hardware.

Introduce a sysctl that controls this behavior.

Keep the default value at 0 (i.e., do not emit notifications) for several
reasons:
- Multiple RTM_NEWROUTE notification per-route might confuse existing
  routing daemons.
- Convergence reasons in routing daemons.
- The extra notifications will negatively impact the insertion rate.
- Not all users are interested in these notifications.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Acked-by: Roopa Prabhu <roopa@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/networking/ip-sysctl.rst
include/net/netns/ipv4.h
net/ipv4/af_inet.c
net/ipv4/fib_trie.c
net/ipv4/sysctl_net_ipv4.c