Commit a6c76c17 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

ipv4: Notify route after insertion to the routing table

Currently, a new route is notified in the FIB notification chain before
it is inserted to the FIB alias list.

Subsequent patches will use the placement of the new route in the
ordered FIB alias list in order to determine if the route should be
notified or not.

As a preparatory step, change the order so that the route is first
inserted into the FIB alias list and only then notified.
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ba838123
...@@ -1063,9 +1063,6 @@ static int fib_insert_node(struct trie *t, struct key_vector *tp, ...@@ -1063,9 +1063,6 @@ static int fib_insert_node(struct trie *t, struct key_vector *tp,
return -ENOMEM; return -ENOMEM;
} }
/* fib notifier for ADD is sent before calling fib_insert_alias with
* the expectation that the only possible failure ENOMEM
*/
static int fib_insert_alias(struct trie *t, struct key_vector *tp, static int fib_insert_alias(struct trie *t, struct key_vector *tp,
struct key_vector *l, struct fib_alias *new, struct key_vector *l, struct fib_alias *new,
struct fib_alias *fa, t_key key) struct fib_alias *fa, t_key key)
...@@ -1118,6 +1115,9 @@ static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack) ...@@ -1118,6 +1115,9 @@ static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack)
return true; return true;
} }
static void fib_remove_alias(struct trie *t, struct key_vector *tp,
struct key_vector *l, struct fib_alias *old);
/* Caller must hold RTNL. */ /* Caller must hold RTNL. */
int fib_table_insert(struct net *net, struct fib_table *tb, int fib_table_insert(struct net *net, struct fib_table *tb,
struct fib_config *cfg, struct netlink_ext_ack *extack) struct fib_config *cfg, struct netlink_ext_ack *extack)
...@@ -1269,14 +1269,19 @@ int fib_table_insert(struct net *net, struct fib_table *tb, ...@@ -1269,14 +1269,19 @@ int fib_table_insert(struct net *net, struct fib_table *tb,
new_fa->tb_id = tb->tb_id; new_fa->tb_id = tb->tb_id;
new_fa->fa_default = -1; new_fa->fa_default = -1;
err = call_fib_entry_notifiers(net, event, key, plen, new_fa, extack); /* Insert new entry to the list. */
err = fib_insert_alias(t, tp, l, new_fa, fa, key);
if (err) if (err)
goto out_free_new_fa; goto out_free_new_fa;
/* Insert new entry to the list. */ /* The alias was already inserted, so the node must exist. */
err = fib_insert_alias(t, tp, l, new_fa, fa, key); l = l ? l : fib_find_node(t, &tp, key);
if (WARN_ON_ONCE(!l))
goto out_free_new_fa;
err = call_fib_entry_notifiers(net, event, key, plen, new_fa, extack);
if (err) if (err)
goto out_fib_notif; goto out_remove_new_fa;
if (!plen) if (!plen)
tb->tb_num_default++; tb->tb_num_default++;
...@@ -1287,14 +1292,8 @@ int fib_table_insert(struct net *net, struct fib_table *tb, ...@@ -1287,14 +1292,8 @@ int fib_table_insert(struct net *net, struct fib_table *tb,
succeeded: succeeded:
return 0; return 0;
out_fib_notif: out_remove_new_fa:
/* notifier was sent that entry would be added to trie, but fib_remove_alias(t, tp, l, new_fa);
* the add failed and need to recover. Only failure for
* fib_insert_alias is ENOMEM.
*/
NL_SET_ERR_MSG(extack, "Failed to insert route into trie");
call_fib_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, key,
plen, new_fa, NULL);
out_free_new_fa: out_free_new_fa:
kmem_cache_free(fn_alias_kmem, new_fa); kmem_cache_free(fn_alias_kmem, new_fa);
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment