ipv4: Only Replay routes of interest to new listeners
authorIdo Schimmel <idosch@mellanox.com>
Sat, 14 Dec 2019 15:53:13 +0000 (17:53 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Dec 2019 00:14:42 +0000 (16:14 -0800)
When a new listener is registered to the FIB notification chain it
receives a dump of all the available routes in the system. Instead, make
sure to only replay the IPv4 routes that are actually used in the data
path and are of any interest to the new listener.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/fib_trie.c

index c23be49ca51cb75878ad0d05f9d2b5a444d63974..3f2ff97618ec7cf6dc92f6c631f38005d2ef645c 100644 (file)
@@ -2080,6 +2080,7 @@ static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
                           struct netlink_ext_ack *extack)
 {
        struct fib_alias *fa;
+       int last_slen = -1;
        int err;
 
        hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
@@ -2099,6 +2100,16 @@ static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
                                              fa, extack);
                if (err)
                        return err;
+
+               if (fa->fa_slen == last_slen)
+                       continue;
+
+               last_slen = fa->fa_slen;
+               err = call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_REPLACE_TMP,
+                                             l->key, KEYLENGTH - fa->fa_slen,
+                                             fa, extack);
+               if (err)
+                       return err;
        }
        return 0;
 }