Patch "ipv4/fib: send notify when delete source address routes" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipv4/fib: send notify when delete source address routes

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipv4-fib-send-notify-when-delete-source-address-rout.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 83c0d832d995f157ea39c05aae19540ff216ef2b
Author: Hangbin Liu <liuhangbin@xxxxxxxxx>
Date:   Fri Sep 22 15:55:08 2023 +0800

    ipv4/fib: send notify when delete source address routes
    
    [ Upstream commit 4b2b606075e50cdae62ab2356b0a1e206947c354 ]
    
    After deleting an interface address in fib_del_ifaddr(), the function
    scans the fib_info list for stray entries and calls fib_flush() and
    fib_table_flush(). Then the stray entries will be deleted silently and no
    RTM_DELROUTE notification will be sent.
    
    This lack of notification can make routing daemons, or monitor like
    `ip monitor route` miss the routing changes. e.g.
    
    + ip link add dummy1 type dummy
    + ip link add dummy2 type dummy
    + ip link set dummy1 up
    + ip link set dummy2 up
    + ip addr add 192.168.5.5/24 dev dummy1
    + ip route add 7.7.7.0/24 dev dummy2 src 192.168.5.5
    + ip -4 route
    7.7.7.0/24 dev dummy2 scope link src 192.168.5.5
    192.168.5.0/24 dev dummy1 proto kernel scope link src 192.168.5.5
    + ip monitor route
    + ip addr del 192.168.5.5/24 dev dummy1
    Deleted 192.168.5.0/24 dev dummy1 proto kernel scope link src 192.168.5.5
    Deleted broadcast 192.168.5.255 dev dummy1 table local proto kernel scope link src 192.168.5.5
    Deleted local 192.168.5.5 dev dummy1 table local proto kernel scope host src 192.168.5.5
    
    As Ido reminded, fib_table_flush() isn't only called when an address is
    deleted, but also when an interface is deleted or put down. The lack of
    notification in these cases is deliberate. And commit 7c6bb7d2faaf
    ("net/ipv6: Add knob to skip DELROUTE message on device down") introduced
    a sysctl to make IPv6 behave like IPv4 in this regard. So we can't send
    the route delete notify blindly in fib_table_flush().
    
    To fix this issue, let's add a new flag in "struct fib_info" to track the
    deleted prefer source address routes, and only send notify for them.
    
    After update:
    + ip monitor route
    + ip addr del 192.168.5.5/24 dev dummy1
    Deleted 192.168.5.0/24 dev dummy1 proto kernel scope link src 192.168.5.5
    Deleted broadcast 192.168.5.255 dev dummy1 table local proto kernel scope link src 192.168.5.5
    Deleted local 192.168.5.5 dev dummy1 table local proto kernel scope host src 192.168.5.5
    Deleted 7.7.7.0/24 dev dummy2 scope link src 192.168.5.5
    
    Suggested-by: Thomas Haller <thaller@xxxxxxxxxx>
    Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxx>
    Acked-by: Nicolas Dichtel <nicolas.dichtel@xxxxxxxxx>
    Reviewed-by: David Ahern <dsahern@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230922075508.848925-1-liuhangbin@xxxxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index c3324a1949c3a..9f6e2a476dc28 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -151,6 +151,7 @@ struct fib_info {
 	int			fib_nhs;
 	bool			fib_nh_is_v6;
 	bool			nh_updated;
+	bool			pfsrc_removed;
 	struct nexthop		*nh;
 	struct rcu_head		rcu;
 	struct fib_nh		fib_nh[];
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index 91a3d6d338874..735901b8c9f69 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -1908,6 +1908,7 @@ int fib_sync_down_addr(struct net_device *dev, __be32 local)
 			continue;
 		if (fi->fib_prefsrc == local) {
 			fi->fib_flags |= RTNH_F_DEAD;
+			fi->pfsrc_removed = true;
 			ret++;
 		}
 	}
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 22531aac0ccbf..0b74debeecbb1 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -2021,6 +2021,7 @@ void fib_table_flush_external(struct fib_table *tb)
 int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)
 {
 	struct trie *t = (struct trie *)tb->tb_data;
+	struct nl_info info = { .nl_net = net };
 	struct key_vector *pn = t->kv;
 	unsigned long cindex = 1;
 	struct hlist_node *tmp;
@@ -2083,6 +2084,9 @@ int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)
 
 			fib_notify_alias_delete(net, n->key, &n->leaf, fa,
 						NULL);
+			if (fi->pfsrc_removed)
+				rtmsg_fib(RTM_DELROUTE, htonl(n->key), fa,
+					  KEYLENGTH - fa->fa_slen, tb->tb_id, &info, 0);
 			hlist_del_rcu(&fa->fa_list);
 			fib_release_info(fa->fa_info);
 			alias_free_mem_rcu(fa);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux