All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2] ip route: ignore ENOENT during save if RT_TABLE_MAIN is being dumped
@ 2021-06-22 15:03 Alexander Mikhalitsyn
  2021-06-23 15:36 ` David Ahern
  2021-06-24 15:28 ` [PATCHv2 " Alexander Mikhalitsyn
  0 siblings, 2 replies; 31+ messages in thread
From: Alexander Mikhalitsyn @ 2021-06-22 15:03 UTC (permalink / raw)
  To: netdev
  Cc: Alexander Mikhalitsyn, David Ahern, Stephen Hemminger,
	Andrei Vagin, Alexander Mikhalitsyn

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).

This affects on CRIU [1] because we use ip route save in dump process, to workaround
problem in tests we just put loopback interface up in each net namespace.
Other users also met this problem [2].

Links:
[1] https://github.com/checkpoint-restore/criu/issues/747
[2] https://www.spinics.net/lists/netdev/msg559739.html

Fixes: c7e6371bc ("ip route: Add protocol, table id and device to dump request")

Cc: David Ahern <dsahern@kernel.org>
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>
---
 ip/iproute.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/ip/iproute.c b/ip/iproute.c
index 5853f026..b70acc00 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -1734,6 +1734,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
 	char *od = NULL;
 	unsigned int mark = 0;
 	rtnl_filter_t filter_fn;
+	int ret;
 
 	if (action == IPROUTE_SAVE) {
 		if (save_route_prep())
@@ -1939,7 +1940,11 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
 
 	new_json_obj(json);
 
-	if (rtnl_dump_filter(&rth, filter_fn, stdout) < 0) {
+	ret = rtnl_dump_filter(&rth, filter_fn, stdout);
+
+	/* Let's ignore ENOENT error if we want to dump RT_TABLE_MAIN table */
+	if (ret < 0 &&
+	    !(errno == ENOENT && filter.tb == RT_TABLE_MAIN)) {
 		fprintf(stderr, "Dump terminated\n");
 		return -2;
 	}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 31+ messages in thread
* [PATCH iproute2] ip route: ignore ENOENT during save if RT_TABLE_MAIN is being dumped
@ 2021-06-22 14:44 Alexander Mikhalitsyn
  0 siblings, 0 replies; 31+ messages in thread
From: Alexander Mikhalitsyn @ 2021-06-22 14:44 UTC (permalink / raw)
  To: netdev
  Cc: Alexander Mikhalitsyn, David Ahern, Stephen Hemminger,
	Andrei Vagin, Alexander Mikhalitsyn

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:
Error: ipv4: FIB table does not exist.
Dump terminated

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

This affects on CRIU [1] because we use ip route save in dump process, to workaround
problem in tests we just put loopback interface up in each net namespace.

Links:
[1] https://github.com/checkpoint-restore/criu/issues/747
[2] https://www.spinics.net/lists/netdev/msg559739.html

Fixes: c7e6371bc ("ip route: Add protocol, table id and device to dump request")

Cc: David Ahern <dsahern@kernel.org>
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>
---
 ip/iproute.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/ip/iproute.c b/ip/iproute.c
index 5853f026..b70acc00 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -1734,6 +1734,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
 	char *od = NULL;
 	unsigned int mark = 0;
 	rtnl_filter_t filter_fn;
+	int ret;
 
 	if (action == IPROUTE_SAVE) {
 		if (save_route_prep())
@@ -1939,7 +1940,11 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
 
 	new_json_obj(json);
 
-	if (rtnl_dump_filter(&rth, filter_fn, stdout) < 0) {
+	ret = rtnl_dump_filter(&rth, filter_fn, stdout);
+
+	/* Let's ignore ENOENT error if we want to dump RT_TABLE_MAIN table */
+	if (ret < 0 &&
+	    !(errno == ENOENT && filter.tb == RT_TABLE_MAIN)) {
 		fprintf(stderr, "Dump terminated\n");
 		return -2;
 	}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2021-07-11 11:12 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-22 15:03 [PATCH iproute2] ip route: ignore ENOENT during save if RT_TABLE_MAIN is being dumped Alexander Mikhalitsyn
2021-06-23 15:36 ` David Ahern
2021-06-23 16:11   ` Alexander Mikhalitsyn
2021-06-24 15:28 ` [PATCHv2 " Alexander Mikhalitsyn
2021-06-24 15:36   ` Stephen Hemminger
2021-06-24 15:40     ` Alexander Mikhalitsyn
2021-06-25 10:59     ` Alexander Mikhalitsyn
2021-06-25 10:44   ` [PATCHv3 " Alexander Mikhalitsyn
2021-06-27 21:54     ` Stephen Hemminger
2021-06-28  6:31       ` Alexander Mikhalitsyn
2021-06-28 17:17         ` Stephen Hemminger
2021-06-28 17:21           ` Alexander Mikhalitsyn
2021-06-29 15:51     ` [PATCHv4 " Alexander Mikhalitsyn
2021-07-06  7:47       ` Alexander Mikhalitsyn
2021-07-06 15:34       ` Stephen Hemminger
2021-07-06 15:44         ` Alexander Mikhalitsyn
2021-07-06 16:18           ` Stephen Hemminger
2021-07-06 17:17             ` Alexander Mikhalitsyn
2021-07-07  0:05               ` Stephen Hemminger
2021-07-07 12:22                 ` Alexander Mikhalitsyn
2021-07-07 14:31                   ` Stephen Hemminger
2021-07-07 14:32                     ` Alexander Mikhalitsyn
2021-07-07 12:09     ` [PATCHv5 " Alexander Mikhalitsyn
2021-07-07 12:22     ` Alexander Mikhalitsyn
2021-07-07 14:35       ` Stephen Hemminger
2021-07-07 14:38         ` Alexander Mikhalitsyn
2021-07-07 14:50       ` patchwork-bot+netdevbpf
2021-07-11 10:59         ` Roi Dayan
2021-07-11 11:09           ` Roi Dayan
2021-07-11 11:12             ` Alexander Mihalicyn
  -- strict thread matches above, loose matches on Subject: below --
2021-06-22 14:44 [PATCH " Alexander Mikhalitsyn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.