All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ido Schimmel <idosch@idosch.org>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, jiri@mellanox.com, dsahern@gmail.com,
	roopa@cumulusnetworks.com, mlxsw@mellanox.com,
	Ido Schimmel <idosch@mellanox.com>
Subject: [PATCH net-next 3/9] ipv4: Notify route if replacing currently offloaded one
Date: Tue, 10 Dec 2019 19:23:56 +0200	[thread overview]
Message-ID: <20191210172402.463397-4-idosch@idosch.org> (raw)
In-Reply-To: <20191210172402.463397-1-idosch@idosch.org>

From: Ido Schimmel <idosch@mellanox.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@mellanox.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;
+	}
+
+	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,
-- 
2.23.0


  parent reply	other threads:[~2019-12-10 17:24 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-10 17:23 [PATCH net-next 0/9] Simplify IPv4 route offload API Ido Schimmel
2019-12-10 17:23 ` [PATCH net-next 1/9] net: fib_notifier: Add temporary events to the FIB notification chain Ido Schimmel
2019-12-10 17:23 ` [PATCH net-next 2/9] ipv4: Notify route after insertion to the routing table Ido Schimmel
2019-12-11 17:34   ` David Ahern
2019-12-10 17:23 ` Ido Schimmel [this message]
2019-12-11 17:40   ` [PATCH net-next 3/9] ipv4: Notify route if replacing currently offloaded one David Ahern
2019-12-11 19:47     ` Ido Schimmel
2019-12-10 17:23 ` [PATCH net-next 4/9] ipv4: Notify newly added route if should be offloaded Ido Schimmel
2019-12-10 17:23 ` [PATCH net-next 5/9] ipv4: Handle route deletion notification Ido Schimmel
2019-12-11 17:44   ` David Ahern
2019-12-10 17:23 ` [PATCH net-next 6/9] ipv4: Handle route deletion notification during flush Ido Schimmel
2019-12-11 17:46   ` David Ahern
2019-12-11 17:52     ` David Ahern
2019-12-11 17:52   ` David Ahern
2019-12-10 17:24 ` [PATCH net-next 7/9] ipv4: Only Replay routes of interest to new listeners Ido Schimmel
2019-12-11 17:57   ` David Ahern
2019-12-10 17:24 ` [PATCH net-next 8/9] mlxsw: spectrum_router: Start using new IPv4 route notifications Ido Schimmel
2019-12-11 17:58   ` David Ahern
2019-12-10 17:24 ` [PATCH net-next 9/9] ipv4: Remove old route notifications and convert listeners Ido Schimmel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191210172402.463397-4-idosch@idosch.org \
    --to=idosch@idosch.org \
    --cc=davem@davemloft.net \
    --cc=dsahern@gmail.com \
    --cc=idosch@mellanox.com \
    --cc=jiri@mellanox.com \
    --cc=mlxsw@mellanox.com \
    --cc=netdev@vger.kernel.org \
    --cc=roopa@cumulusnetworks.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.