From mboxrd@z Thu Jan  1 00:00:00 1970
Authentication-Results: mail.toke.dk; spf=pass (mailfrom) smtp.mailfrom=intel.com (client-ip=192.198.163.7; helo=mgamail.intel.com; envelope-from=larysa.zaremba@intel.com; receiver=<UNKNOWN>)
Authentication-Results: mail.toke.dk;
	dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=HQZxFdWx
Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7])
	by mail.toke.dk (Postfix) with ESMTPS id 5BF4FA2DD5D
	for <xdp-hints@xdp-project.net>; Mon,  2 Oct 2023 18:35:46 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple;
  d=intel.com; i=@intel.com; q=dns/txt; s=Intel;
  t=1696264549; x=1727800549;
  h=from:to:cc:subject:date:message-id:mime-version:
   content-transfer-encoding;
  bh=HtXXSaxIUxjHE1Wz5boFHGVVOcQNpMLjN6igcpPHakg=;
  b=HQZxFdWxva4oWtfWbKboMQr1vAi9vK3gCr56YNkt7+WQT+q5dCL7axAP
   QF+hPlMzNOQDF2APC2BGN4xK7VPbd3LsQO6QnH8YIgNSnaE7RTOTjAPYA
   5T3dSfW4vs4NxrhWFghP1rXPxwUg50PQYysCUIsSaLjfYl57bC7Or3OqX
   xk2Yfk43+oKQc+/SUgQu4gkqjt3v78S5YFMS9DKzjP504UKSc/rtxa1em
   6+BXbFdiPIdGNUZw1mQNR72ASdFkUCE6RFZI6nNgWDGGqhx0t9bkJmK7E
   yQh6CmL3OHPJiX9uckTM7dYRI9BM1YZsUmxzLiAw4Tq/irYKYRuheHAgH
   g==;
X-IronPort-AV: E=McAfee;i="6600,9927,10851"; a="4259639"
X-IronPort-AV: E=Sophos;i="6.03,194,1694761200";
   d="scan'208";a="4259639"
Received: from fmsmga007.fm.intel.com ([10.253.24.52])
  by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Oct 2023 09:35:17 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=McAfee;i="6600,9927,10851"; a="754107462"
X-IronPort-AV: E=Sophos;i="6.03,194,1694761200";
   d="scan'208";a="754107462"
Received: from irvmail002.ir.intel.com ([10.43.11.120])
  by fmsmga007.fm.intel.com with ESMTP; 02 Oct 2023 09:35:10 -0700
Received: from lincoln.igk.intel.com (lincoln.igk.intel.com [10.102.21.235])
	by irvmail002.ir.intel.com (Postfix) with ESMTP id 559EC43C38;
	Mon,  2 Oct 2023 17:35:07 +0100 (IST)
From: Larysa Zaremba <larysa.zaremba@intel.com>
To: bpf@vger.kernel.org
Date: Mon,  2 Oct 2023 18:26:50 +0200
Message-ID: <20231002162653.297318-1-larysa.zaremba@intel.com>
X-Mailer: git-send-email 2.41.0
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Message-ID-Hash: G6RTEH3L3BG7DHCGZNOFRDMY7EPZ5G32
X-Message-ID-Hash: G6RTEH3L3BG7DHCGZNOFRDMY7EPZ5G32
X-MailFrom: larysa.zaremba@intel.com
X-Mailman-Rule-Hits: member-moderation
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address
CC: Larysa Zaremba <larysa.zaremba@intel.com>, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, song@kernel.org, yhs@fb.com, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@google.com, haoluo@google.com, jolsa@kernel.org, David Ahern <dsahern@gmail.com>, Jakub Kicinski <kuba@kernel.org>, Willem de Bruijn <willemb@google.com>, Jesper Dangaard Brouer <brouer@redhat.com>, Anatoly Burakov <anatoly.burakov@intel.com>, Alexander Lobakin <alexandr.lobakin@intel.com>, Magnus Karlsson <magnus.karlsson@gmail.com>, Maryam Tahhan <mtahhan@redhat.com>, xdp-hints@xdp-project.net, netdev@vger.kernel.org
X-Mailman-Version: 3.3.8
Precedence: list
Subject: [xdp-hints] [PATCH bpf-next] selftests/bpf: add options and ZC mode to xdp_hw_metadata
List-Id: XDP hardware hints design discussion <xdp-hints.xdp-project.net>
Archived-At: <https://lists.xdp-project.net/xdp-hints/20231002162653.297318-1-larysa.zaremba@intel.com/>
List-Archive: <https://lists.xdp-project.net/xdp-hints/>
List-Help: <mailto:xdp-hints-request@xdp-project.net?subject=help>
List-Owner: <mailto:xdp-hints-owner@xdp-project.net>
List-Post: <mailto:xdp-hints@xdp-project.net>
List-Subscribe: <mailto:xdp-hints-join@xdp-project.net>
List-Unsubscribe: <mailto:xdp-hints-leave@xdp-project.net>

By default, xdp_hw_metadata runs in AF_XDP copy mode. However, hints are
also supposed to be supported in ZC mode, which is usually implemented
separately in driver, and so needs to be tested too.

Add an option to run xdp_hw_metadata in ZC mode.

As for now, xdp_hw_metadata accepts no options, so add simple option
parsing logic and a help message.

For quick reference, also add an ingress packet generation command to the
help message. The command comes from [0].

[0] https://lore.kernel.org/all/20230119221536.3349901-18-sdf@google.com/

Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
---
 tools/testing/selftests/bpf/xdp_hw_metadata.c | 59 ++++++++++++++++---
 1 file changed, 52 insertions(+), 7 deletions(-)

diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/selftests/bpf/xdp_hw_metadata.c
index 613321eb84c1..c1d1b161a964 100644
--- a/tools/testing/selftests/bpf/xdp_hw_metadata.c
+++ b/tools/testing/selftests/bpf/xdp_hw_metadata.c
@@ -26,6 +26,7 @@
 #include <linux/sockios.h>
 #include <sys/mman.h>
 #include <net/if.h>
+#include <ctype.h>
 #include <poll.h>
 #include <time.h>
 
@@ -49,6 +50,7 @@ struct xsk {
 struct xdp_hw_metadata *bpf_obj;
 struct xsk *rx_xsk;
 const char *ifname;
+bool zero_copy;
 int ifindex;
 int rxq;
 
@@ -60,7 +62,7 @@ static int open_xsk(int ifindex, struct xsk *xsk, __u32 queue_id)
 	const struct xsk_socket_config socket_config = {
 		.rx_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
 		.tx_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
-		.bind_flags = XDP_COPY,
+		.bind_flags = zero_copy ? XDP_ZEROCOPY : XDP_COPY,
 	};
 	const struct xsk_umem_config umem_config = {
 		.fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
@@ -404,6 +406,54 @@ static void timestamping_enable(int fd, int val)
 		error(1, errno, "setsockopt(SO_TIMESTAMPING)");
 }
 
+static void print_usage(void)
+{
+	const char *usage =
+		"  Usage: xdp_hw_metadata [OPTIONS] [IFNAME]\n"
+		"  Options:\n"
+		"  -z            Run AF_XDP in ZC mode (copy mode is used by default)\n"
+		"  -h            Display this help and exit\n\n"
+		"  Generate test packets on other machine with:\n"
+		"    echo -n xdp | nc -u -q1 <dst_ip> 9091\n";
+
+	printf("%s", usage);
+}
+
+static void read_args(int argc, char *argv[])
+{
+	char opt;
+
+	while ((opt = getopt(argc, argv, "zh")) != -1) {
+		switch (opt) {
+		case 'z':
+			zero_copy = true;
+			break;
+		case 'h':
+			print_usage();
+			exit(0);
+		case '?':
+			if (isprint(optopt))
+				fprintf(stderr, "Unknown option: -%c\n", optopt);
+			fallthrough;
+		default:
+			print_usage();
+			error(-1, opterr, "Command line options error");
+		}
+	}
+
+	if (optind >= argc) {
+		fprintf(stderr, "No device name provided\n");
+		print_usage();
+		exit(-1);
+	}
+
+	ifname = argv[optind];
+	ifindex = if_nametoindex(ifname);
+
+	if (!ifname)
+		error(-1, errno, "Invalid interface name");
+}
+
 int main(int argc, char *argv[])
 {
 	clockid_t clock_id = CLOCK_TAI;
@@ -413,13 +463,8 @@ int main(int argc, char *argv[])
 
 	struct bpf_program *prog;
 
-	if (argc != 2) {
-		fprintf(stderr, "pass device name\n");
-		return -1;
-	}
+	read_args(argc, argv);
 
-	ifname = argv[1];
-	ifindex = if_nametoindex(ifname);
 	rxq = rxq_num(ifname);
 
 	printf("rxq: %d\n", rxq);
-- 
2.41.0