From: Nilay Shroff <nilay@linux.ibm.com>
To: linux-nvme@lists.infradead.org
Cc: dwagner@suse.de, sagi@grimberg.me, hare@suse.de,
kbusch@kernel.org, hch@lst.de, gjoyce@linux.ibm.com,
chaitanyak@nvidia.com, Nilay Shroff <nilay@linux.ibm.com>
Subject: [PATCH v2 3/4] shared: add more test coverage for net-util
Date: Mon, 21 Sep 2026 13:25:01 +0530 [thread overview]
Message-ID: <20260921075511.2108561-4-nilay@linux.ibm.com> (raw)
In-Reply-To: <20260921075511.2108561-1-nilay@linux.ibm.com>
Add test covergare for shr_route_get_egress_iface()
and shr_netdev_get_hw_queues().
Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
---
shared/tests/test-net-util.c | 117 +++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/shared/tests/test-net-util.c b/shared/tests/test-net-util.c
index e1ec62e5f..e7ffc5e68 100644
--- a/shared/tests/test-net-util.c
+++ b/shared/tests/test-net-util.c
@@ -7,7 +7,9 @@
*/
#include <arpa/inet.h>
+#include <errno.h>
#include <ifaddrs.h>
+#include <net/if.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <stdio.h>
@@ -42,6 +44,17 @@ static bool check_str(const char *name, const char *got, const char *want)
return false;
}
+static bool check_ret(const char *name, int got, int want)
+{
+ if (got == want) {
+ printf(" - %s [PASS]\n", name);
+ return true;
+ }
+
+ printf(" - %s: got %d, want %d [FAIL]\n", name, got, want);
+ return false;
+}
+
static bool test_ipaddrs_eq(void)
{
/*
@@ -178,6 +191,108 @@ static bool test_iface_primary_addr_matches(void)
return pass;
}
+static bool test_route_get_egress_iface(void)
+{
+ char ifname[IF_NAMESIZE];
+ char small_buf[8];
+ bool pass = true;
+ int ret;
+
+ printf("test_route_get_egress_iface:\n");
+
+ /* Invalid arguments */
+ pass &= check_ret("NULL daddr fails with -EINVAL",
+ shr_route_get_egress_iface(NULL, NULL, ifname,
+ sizeof(ifname)),
+ -EINVAL);
+ pass &= check_ret("invalid daddr string fails with -EINVAL",
+ shr_route_get_egress_iface(NULL, "invalid_ip",
+ ifname, sizeof(ifname)),
+ -EINVAL);
+ pass &= check_ret("invalid saddr string fails with -EINVAL",
+ shr_route_get_egress_iface("invalid_ip", "127.0.0.1",
+ ifname, sizeof(ifname)),
+ -EINVAL);
+ pass &= check_ret("mismatched saddr IPv4 and daddr IPv6 families fails with -EINVAL",
+ shr_route_get_egress_iface("127.0.0.1", "::1",
+ ifname, sizeof(ifname)),
+ -EINVAL);
+ pass &= check_ret("mismatched saddr IPv6 and daddr IPv4 families fails with -EINVAL",
+ shr_route_get_egress_iface("::1", "127.0.0.1",
+ ifname, sizeof(ifname)),
+ -EINVAL);
+ pass &= check_ret("buffer smaller than IF_NAMESIZE fails with -EINVAL",
+ shr_route_get_egress_iface(NULL, "127.0.0.1",
+ small_buf, sizeof(small_buf)),
+ -EINVAL);
+
+ /* Valid lookups (loopback routes always present) */
+ memset(ifname, 0, sizeof(ifname));
+ ret = shr_route_get_egress_iface(NULL, "127.0.0.1", ifname,
+ sizeof(ifname));
+ pass &= check_ret("IPv4 loopback destination lookup returns 0", ret, 0);
+ pass &= check_str("IPv4 loopback egress interface is lo", ifname, "lo");
+
+ memset(ifname, 0, sizeof(ifname));
+ ret = shr_route_get_egress_iface("127.0.0.1", "127.0.0.1", ifname,
+ sizeof(ifname));
+ pass &= check_ret("IPv4 loopback src and dst lookup returns 0", ret, 0);
+ pass &= check_str("IPv4 loopback src/dst egress interface is lo",
+ ifname, "lo");
+
+ memset(ifname, 0, sizeof(ifname));
+ ret = shr_route_get_egress_iface(NULL, "::1", ifname, sizeof(ifname));
+ pass &= check_ret("IPv6 loopback destination lookup returns 0", ret, 0);
+ pass &= check_str("IPv6 loopback egress interface is lo", ifname, "lo");
+
+ memset(ifname, 0, sizeof(ifname));
+ ret = shr_route_get_egress_iface("::1", "::1", ifname, sizeof(ifname));
+ pass &= check_ret("IPv6 loopback src and dst lookup returns 0", ret, 0);
+ pass &= check_str("IPv6 loopback src/dst egress interface is lo",
+ ifname, "lo");
+
+ return pass;
+}
+
+static bool test_netdev_get_hw_queues(void)
+{
+ uint32_t combined, tx, rx;
+ bool pass = true;
+ int ret;
+
+ printf("test_netdev_get_hw_queues:\n");
+
+ /* Invalid arguments */
+ pass &= check_ret("NULL ifname fails with -EINVAL",
+ shr_netdev_get_hw_queues(NULL, &combined, &tx, &rx),
+ -EINVAL);
+ pass &= check_ret("NULL combined_count fails with -EINVAL",
+ shr_netdev_get_hw_queues("lo", NULL, &tx, &rx),
+ -EINVAL);
+ pass &= check_ret("NULL tx_count fails with -EINVAL",
+ shr_netdev_get_hw_queues("lo", &combined, NULL, &rx),
+ -EINVAL);
+ pass &= check_ret("NULL rx_count fails with -EINVAL",
+ shr_netdev_get_hw_queues("lo", &combined, &tx, NULL),
+ -EINVAL);
+
+ /* Non-existent interface */
+ pass &= check_ret("non-existent interface fails with -ENODEV",
+ shr_netdev_get_hw_queues("nonexistent99", &combined,
+ &tx, &rx),
+ -ENODEV);
+
+ /*
+ * Querying loopback interface ("lo") or an interface without ethtool
+ * channel support typically returns -EOPNOTSUPP (or 0 if supported).
+ */
+ ret = shr_netdev_get_hw_queues("lo", &combined, &tx, &rx);
+ pass &= check_bool("querying loopback interface returns 0 or -EOPNOTSUPP",
+ (ret == 0 || ret == -EOPNOTSUPP), true);
+
+ return pass;
+}
+
int main(void)
{
bool pass = true;
@@ -185,6 +300,8 @@ int main(void)
pass &= test_ipaddrs_eq();
pass &= test_iface_matching_addr();
pass &= test_iface_primary_addr_matches();
+ pass &= test_route_get_egress_iface();
+ pass &= test_netdev_get_hw_queues();
fflush(stdout);
exit(pass ? EXIT_SUCCESS : EXIT_FAILURE);
--
2.53.0
next prev parent reply other threads:[~2026-09-21 7:55 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 7:54 [PATCH v2 0/4] nvme-cli: NIC topology aware I/O queue scaling Nilay Shroff
2026-09-21 7:54 ` [PATCH v2 1/4] shared/net-util-linux: add support for retrieving egress netdev Nilay Shroff
2026-09-21 7:55 ` [PATCH v2 2/4] shared/net-util-linux: add support for retrieving NIC h/w queues Nilay Shroff
2026-09-21 7:55 ` Nilay Shroff [this message]
2026-09-21 7:55 ` [PATCH v2 4/4] fabrics: determine --nr-io-queues when not explicitly specified 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=20260921075511.2108561-4-nilay@linux.ibm.com \
--to=nilay@linux.ibm.com \
--cc=chaitanyak@nvidia.com \
--cc=dwagner@suse.de \
--cc=gjoyce@linux.ibm.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox