From: Nilay Shroff <nilay@linux.ibm.com>
To: kbusch@kernel.org, hch@lst.de, hare@suse.de, sagi@grimberg.me,
chaitanyak@nvidia.com, gjoyce@linux.ibm.com, kuba@kernel.org,
davem@davemloft.net, edumazet@google.com, pabeni@redhat.com,
horms@kernel.org
Cc: linux-nvme@lists.infradead.org, netdev@vger.kernel.org,
Nilay Shroff <nilay@linux.ibm.com>
Subject: [RESEND PATCH v2 1/4] net: add helper for device lookup by destination address
Date: Fri, 31 Jul 2026 13:09:05 +0530 [thread overview]
Message-ID: <20260731073918.614014-2-nilay@linux.ibm.com> (raw)
In-Reply-To: <20260731073918.614014-1-nilay@linux.ibm.com>
Add netdev_get_by_addr(), a helper that looks up the routing table to
retrieve the network device associated with a destination address. The
helper also supports netdev reference tracking.
Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
---
include/linux/netdevice.h | 5 +++
net/core/dev.c | 84 +++++++++++++++++++++++++++++++++++++++
2 files changed, 89 insertions(+)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 9981d637f8b5..f43c3aa8486c 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3487,6 +3487,11 @@ struct net_device *netdev_get_by_index(struct net *net, int ifindex,
struct net_device *netdev_get_by_index_lock(struct net *net, int ifindex);
struct net_device *netdev_get_by_name(struct net *net, const char *name,
netdevice_tracker *tracker, gfp_t gfp);
+struct net_device *netdev_get_by_addr(struct net *net,
+ struct sockaddr_storage *src,
+ struct sockaddr_storage *dest,
+ netdevice_tracker *tracker,
+ gfp_t gfp);
struct net_device *netdev_get_by_flags_rcu(struct net *net, netdevice_tracker *tracker,
unsigned short flags, unsigned short mask);
struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
diff --git a/net/core/dev.c b/net/core/dev.c
index 5933c5dab09e..fd8afcd26de4 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -163,6 +163,8 @@
#include <net/page_pool/memory_provider.h>
#include <net/rps.h>
#include <linux/phy_link_topology.h>
+#include <net/route.h>
+#include <net/ip6_route.h>
#include "dev.h"
#include "devmem.h"
@@ -944,6 +946,88 @@ struct net_device *netdev_get_by_name(struct net *net, const char *name,
}
EXPORT_SYMBOL(netdev_get_by_name);
+/**
+ * netdev_get_by_addr() - find an egress device by destination address
+ * @net: the applicable net namespace
+ * @src: optional source address
+ * @dest: destination address
+ * @tracker: tracking onject for the acquired reference
+ * @gfp: allocation flag for the tracker
+ *
+ * Find an interface by looking up route table entry based on dest address
+ * and an optional src address. The returned handle has the usage count
+ * incremented and the caller must use netdev_put() to release it when it
+ * is no longer needed. %NULL is returned if dest is not specified, or src
+ * and dest belong to different address families, or no matching device is
+ * found.
+ */
+struct net_device *netdev_get_by_addr(struct net *net,
+ struct sockaddr_storage *src,
+ struct sockaddr_storage *dest,
+ netdevice_tracker *tracker,
+ gfp_t gfp)
+{
+ struct net_device *dev = NULL;
+
+ if (!dest)
+ return NULL;
+
+ if (src && src->ss_family != dest->ss_family)
+ return NULL;
+
+ if (dest->ss_family == AF_INET) {
+ struct rtable *rt;
+ struct flowi4 fl4 = {};
+
+ fl4.daddr = ((struct sockaddr_in *)dest)->sin_addr.s_addr;
+ if (src)
+ fl4.saddr = ((struct sockaddr_in *)src)->sin_addr.s_addr;
+
+ rt = ip_route_output_key(net, &fl4);
+ if (IS_ERR(rt))
+ return NULL;
+
+ dev = dst_dev(&rt->dst);
+ /*
+ * Get reference to netdev as ip_rt_put() will release netdev
+ * reference.
+ */
+ if (dev)
+ netdev_hold(dev, tracker, gfp);
+
+ ip_rt_put(rt);
+
+#if IS_ENABLED(CONFIG_IPV6)
+ } else if (dest->ss_family == AF_INET6) {
+ struct dst_entry *dst;
+ struct flowi6 fl6 = {};
+
+ fl6.daddr = ((struct sockaddr_in6 *)dest)->sin6_addr;
+ if (src)
+ fl6.saddr = ((struct sockaddr_in6 *)src)->sin6_addr;
+
+ dst = ip6_route_output(net, NULL, &fl6);
+ if (dst->error) {
+ dst_release(dst);
+ return NULL;
+ }
+
+ dev = dst_dev(dst);
+ /*
+ * Get reference to netdev as dst_release() will
+ * release the netdev reference.
+ */
+ if (dev)
+ netdev_hold(dev, tracker, gfp);
+
+ dst_release(dst);
+#endif
+ }
+
+ return dev;
+}
+EXPORT_SYMBOL(netdev_get_by_addr);
+
/**
* __dev_get_by_index - find a device by its ifindex
* @net: the applicable net namespace
--
2.53.0
next prev parent reply other threads:[~2026-07-31 7:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 7:39 [RESEND PATCH v2 0/4] nvme-tcp: NIC topology aware I/O queue scaling and queue info export Nilay Shroff
2026-07-31 7:39 ` Nilay Shroff [this message]
2026-07-31 7:39 ` [RESEND PATCH v2 2/4] nvme-tcp: limit I/O queue count based on NIC queue count Nilay Shroff
2026-07-31 7:39 ` [RESEND PATCH v2 3/4] nvme: add debugfs helpers for NVMe drivers Nilay Shroff
2026-07-31 8:14 ` Maurizio Lombardi
2026-07-31 7:39 ` [RESEND PATCH v2 4/4] nvme: expose queue information via debugfs Nilay Shroff
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=20260731073918.614014-2-nilay@linux.ibm.com \
--to=nilay@linux.ibm.com \
--cc=chaitanyak@nvidia.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gjoyce@linux.ibm.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=horms@kernel.org \
--cc=kbusch@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sagi@grimberg.me \
/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.