diff options
author | Ido Schimmel <idosch@nvidia.com> | 2020-11-04 15:30:29 +0200 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2020-11-06 11:28:49 -0800 |
commit | 732d167bf5f53a8c1e8c53cf7dbffe2a13f63752 (patch) | |
tree | 790ade2d34897b86daa9a9ebf854975afdfbe201 | |
parent | nexthop: Allow setting "offload" and "trap" indications on nexthops (diff) | |
download | linux-dev-732d167bf5f53a8c1e8c53cf7dbffe2a13f63752.tar.xz linux-dev-732d167bf5f53a8c1e8c53cf7dbffe2a13f63752.zip |
nexthop: Emit a notification when a nexthop is added
Emit a notification in the nexthop notification chain when a new nexthop
is added (not replaced). The nexthop can either be a new group or a
single nexthop.
The notification is sent after the nexthop is inserted into the
red-black tree, as listeners might need to callback into the nexthop
code with the nexthop ID in order to mark the nexthop as offloaded.
A 'REPLACE' notification is emitted instead of 'ADD' as the distinction
between the two is not important for in-kernel listeners. In case the
listener is not familiar with the encoded nexthop ID, it can simply
treat it as a new one. This is also consistent with the route offload
API.
Changes since RFC:
* Reword commit message
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | include/net/nexthop.h | 3 | ||||
-rw-r--r-- | net/ipv4/nexthop.c | 6 |
2 files changed, 7 insertions, 2 deletions
diff --git a/include/net/nexthop.h b/include/net/nexthop.h index aa7ac12c35e2..9c85199b826e 100644 --- a/include/net/nexthop.h +++ b/include/net/nexthop.h @@ -105,7 +105,8 @@ struct nexthop { }; enum nexthop_event_type { - NEXTHOP_EVENT_DEL + NEXTHOP_EVENT_DEL, + NEXTHOP_EVENT_REPLACE, }; struct nh_notifier_single_info { diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c index d1a1600aee18..4e9d0395f959 100644 --- a/net/ipv4/nexthop.c +++ b/net/ipv4/nexthop.c @@ -1278,7 +1278,11 @@ static int insert_nexthop(struct net *net, struct nexthop *new_nh, rb_link_node_rcu(&new_nh->rb_node, parent, pp); rb_insert_color(&new_nh->rb_node, root); - rc = 0; + + rc = call_nexthop_notifiers(net, NEXTHOP_EVENT_REPLACE, new_nh, extack); + if (rc) + rb_erase(&new_nh->rb_node, &net->nexthop.rb_root); + out: if (!rc) { nh_base_seq_inc(net); |