iproute2/include
Alexander Mikhalitsyn 459ce6e3d7 ip route: ignore ENOENT during save if RT_TABLE_MAIN is being dumped
We started to use in-kernel filtering feature which allows to get only
needed tables (see iproute_dump_filter()). From the kernel side it's
implemented in net/ipv4/fib_frontend.c (inet_dump_fib), net/ipv6/ip6_fib.c
(inet6_dump_fib). The problem here is that behaviour of "ip route save"
was changed after
c7e6371bc ("ip route: Add protocol, table id and device to dump request").
If filters are used, then kernel returns ENOENT error if requested table
is absent, but in newly created net namespace even RT_TABLE_MAIN table
doesn't exist. It is really allocated, for instance, after issuing
"ip l set lo up".

Reproducer is fairly simple:
$ unshare -n ip route save > dump
Error: ipv4: FIB table does not exist.
Dump terminated

Expected result here is to get empty dump file (as it was before this
change).

v2: reworked, so, now it takes into account NLMSGERR_ATTR_MSG
(see nl_dump_ext_ack_done() function). We want to suppress error messages
in stderr about absent FIB table from kernel too.

v3: reworked to make code clearer. Introduced rtnl_suppressed_errors(),
rtnl_suppress_error() helpers. User may suppress up to 3 errors (may be
easily extended by changing SUPPRESS_ERRORS_INIT macro).

v4: reworked, rtnl_dump_filter_errhndlr() was introduced. Thanks
to Stephen Hemminger for comments and suggestions

v5: space fixes, commit message reformat, empty initializers

Fixes: c7e6371bc ("ip route: Add protocol, table id and device to dump request")
Cc: David Ahern <dsahern@gmail.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Andrei Vagin <avagin@gmail.com>
Cc: Alexander Mikhalitsyn <alexander@mihalicyn.com>
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
2021-07-07 07:32:56 -07:00
..
iptables SPDX license identifiers 2017-11-24 12:21:35 -08:00
libiptc SPDX license identifiers 2017-11-24 12:21:35 -08:00
netinet ss: report ecnseen 2011-11-23 14:51:54 -08:00
uapi uapi: update kernel headers from 5.14-rc1 2021-07-06 17:07:24 -07:00
bpf_api.h examples/bpf: add bpf examples with BTF defined maps 2020-11-24 22:14:08 -07:00
bpf_elf.h bpf: implement btf handling and map annotation 2018-07-17 19:38:44 -07:00
bpf_scm.h SPDX license identifiers 2017-11-24 12:21:35 -08:00
bpf_util.h lib: add libbpf support 2020-11-24 22:14:05 -07:00
cg_map.h ss: introduce cgroup2 cache and helper functions 2020-05-13 14:28:04 +00:00
color.h lib/color: make local functions static 2018-11-19 11:42:44 -08:00
dlfcn.h SPDX license identifiers 2017-11-24 12:21:35 -08:00
ip6tables.h SPDX license identifiers 2017-11-24 12:21:35 -08:00
iptables.h remove trailing whitespace 2021-04-27 11:55:53 -07:00
json_print.h json_print: Add print_tv() 2021-03-19 15:00:08 +00:00
json_writer.h Merge branch 'iproute2-master' into iproute2-next 2018-12-19 12:02:17 -08:00
libgenl.h mptcp: add support for event monitoring 2021-04-22 05:10:25 +00:00
libnetlink.h ip route: ignore ENOENT during save if RT_TABLE_MAIN is being dumped 2021-07-07 07:32:56 -07:00
list.h devlink: Add support for devlink resource abstraction 2018-02-23 08:36:05 -08:00
ll_map.h ll_map: Add function to remove link cache entry by index 2019-02-22 18:51:15 -08:00
mnl_utils.h utils: Introduce helper routines for generic socket recv 2021-03-03 04:00:04 +00:00
names.h tc: drop unused name_to_id function 2018-11-19 11:42:44 -08:00
namespace.h netns: make netns_{save,restore} static 2019-06-20 14:30:41 -07:00
rt_names.h lib: rt_names: Add rtnl_dsfield_get_name() 2021-01-18 04:09:29 +00:00
rtm_map.h SPDX license identifiers 2017-11-24 12:21:35 -08:00
utils.h Merge branch 'main' into next 2021-07-01 14:29:42 +00:00
version.h v5.13.0 2021-06-29 11:24:17 -07:00
xt-internal.h SPDX license identifiers 2017-11-24 12:21:35 -08:00
xtables.h tc: adjust xtables_match and xtables_target to changes in recent iptables 2019-06-24 16:12:17 -07:00