lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <112373c1-cdb6-86bf-33ac-f555b93db735@gmail.com> Date: Wed, 11 Dec 2019 10:40:09 -0700 From: David Ahern <dsahern@...il.com> To: Ido Schimmel <idosch@...sch.org>, netdev@...r.kernel.org Cc: davem@...emloft.net, jiri@...lanox.com, roopa@...ulusnetworks.com, mlxsw@...lanox.com, Ido Schimmel <idosch@...lanox.com> Subject: Re: [PATCH net-next 3/9] ipv4: Notify route if replacing currently offloaded one On 12/10/19 10:23 AM, Ido Schimmel wrote: > From: Ido Schimmel <idosch@...lanox.com> > > When replacing a route, its replacement should only be notified in case > the replaced route is of any interest to listeners. In other words, if > the replaced route is currently used in the data path, which means it is > the first route in the FIB alias list with the given {prefix, prefix > length, table ID}. > > Signed-off-by: Ido Schimmel <idosch@...lanox.com> > --- > net/ipv4/fib_trie.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c > index 9264d6628e9f..6822aa90657a 100644 > --- a/net/ipv4/fib_trie.c > +++ b/net/ipv4/fib_trie.c > @@ -978,6 +978,27 @@ static struct key_vector *fib_find_node(struct trie *t, > return n; > } > > +/* Return the first fib alias matching prefix length and table ID. */ > +static struct fib_alias *fib_find_first_alias(struct hlist_head *fah, u8 slen, > + u32 tb_id) > +{ > + struct fib_alias *fa; > + > + hlist_for_each_entry(fa, fah, fa_list) { > + if (fa->fa_slen < slen) > + continue; > + if (fa->fa_slen != slen) > + break; > + if (fa->tb_id > tb_id) > + continue; > + if (fa->tb_id != tb_id) > + break; > + return fa; Rather than duplicating fib_find_alias, how about adding a 'bool find_first' argument and bail on it: if (find_first) return fa; continue to tos and priority compares. > + } > + > + return NULL; > +} > + > /* Return the first fib alias matching TOS with > * priority less than or equal to PRIO. > */ > @@ -1217,6 +1238,17 @@ int fib_table_insert(struct net *net, struct fib_table *tb, > new_fa->tb_id = tb->tb_id; > new_fa->fa_default = -1; > > + if (fib_find_first_alias(&l->leaf, fa->fa_slen, > + tb->tb_id) == fa) { > + enum fib_event_type fib_event; > + > + fib_event = FIB_EVENT_ENTRY_REPLACE_TMP; > + err = call_fib_entry_notifiers(net, fib_event, > + key, plen, > + new_fa, extack); > + if (err) > + goto out_free_new_fa; > + } > err = call_fib_entry_notifiers(net, > FIB_EVENT_ENTRY_REPLACE, > key, plen, new_fa, >
Powered by blists - more mailing lists