aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIdo Schimmel <idosch@nvidia.com>2020-11-04 15:30:29 +0200
committerJakub Kicinski <kuba@kernel.org>2020-11-06 11:28:49 -0800
commit732d167bf5f53a8c1e8c53cf7dbffe2a13f63752 (patch)
tree790ade2d34897b86daa9a9ebf854975afdfbe201
parentnexthop: Allow setting "offload" and "trap" indications on nexthops (diff)
downloadlinux-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.h3
-rw-r--r--net/ipv4/nexthop.c6
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);