Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cacaad11 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

ipv4: fib: Allow for consistent FIB dumping



The next patch will enable listeners of the FIB notification chain to
request a dump of the FIB tables. However, since RTNL isn't taken during
the dump, it's possible for the FIB tables to change mid-dump, which
will result in inconsistency between the listener's table and the
kernel's.

Allow listeners to know about changes that occurred mid-dump, by adding
a change sequence counter to each net namespace. The counter is
incremented just before a notification is sent in the FIB chain.

Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d3f706f6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -135,6 +135,9 @@ struct netns_ipv4 {
#ifdef CONFIG_IP_ROUTE_MULTIPATH
	int sysctl_fib_multipath_use_neigh;
#endif

	unsigned int	fib_seq;	/* protected by rtnl_mutex */

	atomic_t	rt_genid;
};
#endif
+2 −0
Original line number Diff line number Diff line
@@ -1219,6 +1219,8 @@ static int __net_init ip_fib_net_init(struct net *net)
	int err;
	size_t size = sizeof(struct hlist_head) * FIB_TABLE_HASHSZ;

	net->ipv4.fib_seq = 0;

	/* Avoid false sharing : Use at least a full cache line */
	size = max_t(size_t, size, L1_CACHE_BYTES);

+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ EXPORT_SYMBOL(unregister_fib_notifier);
int call_fib_notifiers(struct net *net, enum fib_event_type event_type,
		       struct fib_notifier_info *info)
{
	net->ipv4.fib_seq++;
	info->net = net;
	return atomic_notifier_call_chain(&fib_chain, event_type, info);
}