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

ipv4: Extend FIB alias find function

Extend the function with another argument, 'find_first'. When set, the
function returns the first FIB alias with the matching {prefix, prefix
length, table ID}. The TOS and priority parameters are ignored. Current
callers are converted to pass 'false' in order to maintain existing
behavior.

This will be used by subsequent patches in the series.

v2:
* New patch
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Suggested-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a6c76c17
...@@ -980,9 +980,12 @@ static struct key_vector *fib_find_node(struct trie *t, ...@@ -980,9 +980,12 @@ static struct key_vector *fib_find_node(struct trie *t,
/* Return the first fib alias matching TOS with /* Return the first fib alias matching TOS with
* priority less than or equal to PRIO. * priority less than or equal to PRIO.
* If 'find_first' is set, return the first matching
* fib alias, regardless of TOS and priority.
*/ */
static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen, static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen,
u8 tos, u32 prio, u32 tb_id) u8 tos, u32 prio, u32 tb_id,
bool find_first)
{ {
struct fib_alias *fa; struct fib_alias *fa;
...@@ -998,6 +1001,8 @@ static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen, ...@@ -998,6 +1001,8 @@ static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen,
continue; continue;
if (fa->tb_id != tb_id) if (fa->tb_id != tb_id)
break; break;
if (find_first)
return fa;
if (fa->fa_tos > tos) if (fa->fa_tos > tos)
continue; continue;
if (fa->fa_info->fib_priority >= prio || fa->fa_tos < tos) if (fa->fa_info->fib_priority >= prio || fa->fa_tos < tos)
...@@ -1149,7 +1154,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb, ...@@ -1149,7 +1154,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb,
l = fib_find_node(t, &tp, key); l = fib_find_node(t, &tp, key);
fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority, fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority,
tb->tb_id) : NULL; tb->tb_id, false) : NULL;
/* Now fa, if non-NULL, points to the first fib alias /* Now fa, if non-NULL, points to the first fib alias
* with the same keys [prefix,tos,priority], if such key already * with the same keys [prefix,tos,priority], if such key already
...@@ -1565,7 +1570,7 @@ int fib_table_delete(struct net *net, struct fib_table *tb, ...@@ -1565,7 +1570,7 @@ int fib_table_delete(struct net *net, struct fib_table *tb,
if (!l) if (!l)
return -ESRCH; return -ESRCH;
fa = fib_find_alias(&l->leaf, slen, tos, 0, tb->tb_id); fa = fib_find_alias(&l->leaf, slen, tos, 0, tb->tb_id, false);
if (!fa) if (!fa)
return -ESRCH; return -ESRCH;
......
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