From nobody Mon Feb 9 23:19:45 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83B6321D3F6; Thu, 13 Feb 2025 11:19:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739445587; cv=none; b=QExpW9WtnDMfU7jb4o2656D/1xosdryIpGh0JVznbFMek+AM2582PC7Q1Go/pJrGimuFvT7f1r8mVSmHXsK7Ww0Y6sZ16G22F2WgTqOMeGZM7bcLw6VL92P2LiNASvcpfC0EqNF0eop51i8DP81UsJI25/ubjJPOz/p4xpIXFwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739445587; c=relaxed/simple; bh=rssjeyIiAeL8XBn/wMcEhJ0splDoaYGMtiY4pRMGGyo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t8yoXUTsunHuXJvFadq1I3bIalMskzYyXLXr+pcHNQNxrDmEZi735p4/i4UAEphAz7YL+9i3kdOFMey51NwM2PjU4lBbb/qLmaSO6fU+b3r6AAw4/JIZ7O0XffRSDe+02PUI5llkc0/35ED7zq93j50rCAMseW9PDuwH5VhOLWs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=psFKTMu9; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="psFKTMu9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1739445568; x=1740050368; i=ps.report@gmx.net; bh=rssjeyIiAeL8XBn/wMcEhJ0splDoaYGMtiY4pRMGGyo=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=psFKTMu9GGzORwmLPp1j7GZEGhtCIN3Jsd95gBQWOV+6W0KARNn5WGVPUaaT7YRR OHbKksvbSMjRpYLb3R+aFRvjd3KUZ0vGLEFjjURDb4x+FxRGa4S4bhzhVhwzpo9yn n2yHF7hjEFDL/V31a3p0MxWcM2fxSAT66PUWK7wdkuVr++i0gNPn7CaD+VNfoZgoJ ovA1Ow4c6bx3/isdpkmHVk3oz2yQMsYNm9F3Sf5xpYTiGL8Uq5QRdTdcFbXkP70BH /SY4w95txUJZqjnoMYyQ9O1whxhkQXs3kfBIEPVsGi7WQqVRAn2ZF1vuMuJoQwen7 s9JLsq4q9oFcelhO7w== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.197]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MVNAr-1tqTKh00tL-00VMYe; Thu, 13 Feb 2025 12:19:28 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Peter Seiderer , Thomas Gleixner , Artem Chernyshev , Nam Cao , Frederic Weisbecker Subject: [PATCH net-next v5 8/8] selftest: net: add proc_net_pktgen Date: Thu, 13 Feb 2025 12:19:20 +0100 Message-ID: <20250213111920.1439021-9-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250213111920.1439021-1-ps.report@gmx.net> References: <20250213111920.1439021-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:mWvR9DhNJksyPW1NHcmez+JupXYV8O2yEd/D3bL+dFi3jF/A47o Fch4zqSo3B0u7mRLur0ADukS5ZuMnlol5pUTwtFZuw4wM+cgWGzV6vGAHpnpvsxb7lngXRn avBe8FU93JpiHUs20uMXhx2zUBLVd2rEWYgCzLFmh36Sfu1JVWj8jdmBAYAO9N5voz5cd5K ZMgaR+KJFlzvaQGz6GWSg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:tvyH2MbilQo=;kKH4Nf1RIqtXLOfbIIJV7tXK76q wK05TqkYm625nt812eWDDZFW9haJDnZb5dLn9+KMc3CnCn2y+ftx6PuoE7yhYY0dS/5xs7fCR PGR5DExnxW2Rh0J5OqTuCEurM36ryyAh6Ii96ZdIjFuoemDp8LSNm+zMPNIYQLAZASp/ytB9C o1azae0kxTbZz//qMMBsoCrHr/IPcJNcypuynQpk1q5L0KvMlzOpXfoqpwULcbPmyim9zxVSZ 6G9xZ/Oo/WSwhFVaTVc50HDn++XE6dRRxEJDSCBCCcFvNR2NlAAkw/vnMfxbHwSkpPowaPBZq ceebkNR2sZvYUZujj9N8oryOPeBvLP0PqSw2iZLyuEZ2tp2q6HRMrV/H5qP2+CceCyvrm2keI jzQhWH8p801k9rRknk8MWwS4fxMoOLg7uXwGNUfJMIqYQEIjBKrdm7PU7vz4oQsp1NOplAGvm cr13i0qQPwsP4tfPtaJ22cfYjoTk0oDj2B+ecKLU9lPQKAFMpoQ7OpUJgap1CQCMLRpzupS3P aSFH1OS0ES4QywbY2bVDzY8WJG5dJhYPAogBigSSM3aInQzY9xFlmYUy92d+TkvDDJfCBfJ+7 TVK22v8xw4UMBnhN71MDDs97OAScabJW5nq88uJhkTa3CJBzhyeMqawI4gudmTz8/EVQrKovy ohHbeZiPFSLPj6thxEENQebaPqt3VnHNZ3jdTmCfOTeEe+AYOPxm70WnyrzHC6XBxA3K32RXY pq480FPG15m1neMWNxpdZ/iSKh+XwggMkvbyW3WYr7bxKtUaE9objjggsMywVQR9kF47iANhK NRdh/H4diA4iGK76W7Ikri+b7DcdOvYr9AJ5q8d61ddUGYuBMGCcgKLTLQKR1degvmuIRQ6uw P/eUGR3Z6YCFA+TBLCUa3HIqu0esNS51c3PnOvLyu5e6Ps5HtHgdqeQGTl0WW+cGxLENLJRje tciqCZPQVJLKWI+xkMZagKPMozsPIXWaia0fyI21FW9MRIBCPCOyFx/2UqZg8TfI9tNUXwvt8 uqfNRkoM022hXvgKqYAngBaGPsRfVnc0opfy1LkXsWcEbG29iib+giJEn35jV/tkCGd/6plGU Jk8G4ncNGXnZd7b7OVUUiDIXMcOmritvsZFIZYAGX+hmXh67CUwnlqniObIyg4IaYwi8B1V9G 1ZqX1N6eAyrb/z01QqDtTzvwHkgu3uHq1LguKSJi7k0mAKHjHFi7cWar1yvMZKL7yCBqNhfJ7 SFs9a38a5YJezptXDubEnhHWCbVbPOLu0f0p/WWta33oauBI3mXMmsKL+xaQGy5Uekjx1Ladj vqsSVJTs+8/4N57NiDaxjR2Lg+7U+YESnYb1QlARz8EY5UZjv3aPYPJSdy/ZNy64HJPW8n0EW MLvJ6NdUpVc8d4DKJf2/FN32foPAHWpvwrPAD3cPLHwwazxYA9LnH+03dV Content-Type: text/plain; charset="utf-8" Add some test for /proc/net/pktgen/... interface. - enable 'CONFIG_NET_PKTGEN=3Dm' in tools/testing/selftests/net/config Signed-off-by: Peter Seiderer --- Changes v4 -> v5 - split up patchset into part i/ii (suggested by Simon Horman) - addapt to dropped patch 'net: pktgen: hex32_arg/num_arg error out in ca= se no characters are available', empty hex/num arg is now implicit assumed= as zero value (instead of failure) Changes v3 -> v4: - no changes Changes v2 -> v3: - fix typo in change description ('v1 -> v1' and tyop) - rename some vars to better match usage add_loopback_0 -> thr_cmd_add_loopback_0 rm_loopback_0 -> thr_cmd_rm_loopback_0 wrong_ctrl_cmd -> wrong_thr_cmd legacy_ctrl_cmd -> legacy_thr_cmd ctrl_fd -> thr_fd - add ctrl interface tests Changes v1 -> v2: - fix tyop not vs. nod (suggested by Jakub Kicinski) - fix misaligned line (suggested by Jakub Kicinski) - enable fomerly commented out CONFIG_XFRM dependent test (command spi), as CONFIG_XFRM is enabled via tools/testing/selftests/net/config CONFIG_XFRM_INTERFACE/CONFIG_XFRM_USER (suggestex by Jakub Kicinski) - add CONFIG_NET_PKTGEN=3Dm to tools/testing/selftests/net/config (suggested by Jakub Kicinski) - add modprobe pktgen to FIXTURE_SETUP() (suggested by Jakub Kicinski) - fix some checkpatch warnings (Missing a blank line after declarations) - shrink line length by re-naming some variables (command -> cmd, device -> dev) - add 'rate 0' testcase - add 'ratep 0' testcase --- tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/config | 1 + tools/testing/selftests/net/proc_net_pktgen.c | 646 ++++++++++++++++++ 3 files changed, 648 insertions(+) create mode 100644 tools/testing/selftests/net/proc_net_pktgen.c diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests= /net/Makefile index b6271714504d..38c6e4b72d37 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -101,6 +101,7 @@ TEST_PROGS +=3D vlan_bridge_binding.sh TEST_PROGS +=3D bpf_offload.py TEST_PROGS +=3D ipv6_route_update_soft_lockup.sh TEST_PROGS +=3D busy_poll_test.sh +TEST_GEN_PROGS +=3D proc_net_pktgen =20 # YNL files, must be before "include ..lib.mk" YNL_GEN_FILES :=3D busy_poller netlink-dumps diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/n= et/config index 5b9baf708950..9fe1b3464fbc 100644 --- a/tools/testing/selftests/net/config +++ b/tools/testing/selftests/net/config @@ -107,3 +107,4 @@ CONFIG_XFRM_INTERFACE=3Dm CONFIG_XFRM_USER=3Dm CONFIG_IP_NF_MATCH_RPFILTER=3Dm CONFIG_IP6_NF_MATCH_RPFILTER=3Dm +CONFIG_NET_PKTGEN=3Dm diff --git a/tools/testing/selftests/net/proc_net_pktgen.c b/tools/testing/= selftests/net/proc_net_pktgen.c new file mode 100644 index 000000000000..917f45be4769 --- /dev/null +++ b/tools/testing/selftests/net/proc_net_pktgen.c @@ -0,0 +1,646 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * proc_net_pktgen: kselftest for /proc/net/pktgen interface + * + * Copyright (c) 2025 Peter Seiderer + * + */ +#include +#include +#include +#include + +#include "../kselftest_harness.h" + +static const char ctrl_cmd_stop[] =3D "stop"; +static const char ctrl_cmd_start[] =3D "start"; +static const char ctrl_cmd_reset[] =3D "reset"; + +static const char wrong_ctrl_cmd[] =3D "0123456789012345678901234567890123= 456789012345678901234567890123456789012345678901234567890123456789012345678= 901234567890123456789"; + +static const char thr_cmd_add_loopback_0[] =3D "add_device lo@0"; +static const char thr_cmd_rm_loopback_0[] =3D "rem_device_all"; + +static const char wrong_thr_cmd[] =3D "forsureawrongcommand"; +static const char legacy_thr_cmd[] =3D "max_before_softirq"; + +static const char wrong_dev_cmd[] =3D "forsurewrongcommand"; +static const char dev_cmd_min_pkt_size_0[] =3D "min_pkt_size"; +static const char dev_cmd_min_pkt_size_1[] =3D "min_pkt_size "; +static const char dev_cmd_min_pkt_size_2[] =3D "min_pkt_size 0"; +static const char dev_cmd_min_pkt_size_3[] =3D "min_pkt_size 1"; +static const char dev_cmd_min_pkt_size_4[] =3D "min_pkt_size 100"; +static const char dev_cmd_min_pkt_size_5[] =3D "min_pkt_size=3D1001"; +static const char dev_cmd_min_pkt_size_6[] =3D "min_pkt_size =3D2002"; +static const char dev_cmd_min_pkt_size_7[] =3D "min_pkt_size=3D 3003"; +static const char dev_cmd_min_pkt_size_8[] =3D "min_pkt_size =3D 4004"; +static const char dev_cmd_max_pkt_size_0[] =3D "max_pkt_size 200"; +static const char dev_cmd_pkt_size_0[] =3D "pkt_size 300"; +static const char dev_cmd_imix_weights_0[] =3D "imix_weights 0,7 576,4 150= 0,1"; +static const char dev_cmd_imix_weights_1[] =3D "imix_weights 101,1 102,2 1= 03,3 104,4 105,5 106,6 107,7 108,8 109,9 110,10 111,11 112,12 113,13 114,14= 115,15 116,16 117,17 118,18 119,19 120,20"; +static const char dev_cmd_imix_weights_2[] =3D "imix_weights 100,1 102,2 1= 03,3 104,4 105,5 106,6 107,7 108,8 109,9 110,10 111,11 112,12 113,13 114,14= 115,15 116,16 117,17 118,18 119,19 120,20 121,21"; +static const char dev_cmd_debug_0[] =3D "debug 1"; +static const char dev_cmd_debug_1[] =3D "debug 0"; +static const char dev_cmd_frags_0[] =3D "frags 100"; +static const char dev_cmd_delay_0[] =3D "delay 100"; +static const char dev_cmd_delay_1[] =3D "delay 2147483647"; +static const char dev_cmd_rate_0[] =3D "rate 0"; +static const char dev_cmd_rate_1[] =3D "rate 100"; +static const char dev_cmd_ratep_0[] =3D "ratep 0"; +static const char dev_cmd_ratep_1[] =3D "ratep 200"; +static const char dev_cmd_udp_src_min_0[] =3D "udp_src_min 1"; +static const char dev_cmd_udp_dst_min_0[] =3D "udp_dst_min 2"; +static const char dev_cmd_udp_src_max_0[] =3D "udp_src_max 3"; +static const char dev_cmd_udp_dst_max_0[] =3D "udp_dst_max 4"; +static const char dev_cmd_clone_skb_0[] =3D "clone_skb 1"; +static const char dev_cmd_clone_skb_1[] =3D "clone_skb 0"; +static const char dev_cmd_count_0[] =3D "count 100"; +static const char dev_cmd_src_mac_count_0[] =3D "src_mac_count 100"; +static const char dev_cmd_dst_mac_count_0[] =3D "dst_mac_count 100"; +static const char dev_cmd_burst_0[] =3D "burst 0"; +static const char dev_cmd_node_0[] =3D "node 100"; +static const char dev_cmd_xmit_mode_0[] =3D "xmit_mode start_xmit"; +static const char dev_cmd_xmit_mode_1[] =3D "xmit_mode netif_receive"; +static const char dev_cmd_xmit_mode_2[] =3D "xmit_mode queue_xmit"; +static const char dev_cmd_xmit_mode_3[] =3D "xmit_mode nonsense"; +static const char dev_cmd_flag_0[] =3D "flag UDPCSUM"; +static const char dev_cmd_flag_1[] =3D "flag !UDPCSUM"; +static const char dev_cmd_flag_2[] =3D "flag nonsense"; +static const char dev_cmd_dst_min_0[] =3D "dst_min 101.102.103.104"; +static const char dev_cmd_dst_0[] =3D "dst 101.102.103.104"; +static const char dev_cmd_dst_max_0[] =3D "dst_max 201.202.203.204"; +static const char dev_cmd_dst6_0[] =3D "dst6 2001:db38:1234:0000:0000:0000= :0000:0000"; +static const char dev_cmd_dst6_min_0[] =3D "dst6_min 2001:db8:1234:0000:00= 00:0000:0000:0000"; +static const char dev_cmd_dst6_max_0[] =3D "dst6_max 2001:db8:1234:0000:00= 00:0000:0000:0000"; +static const char dev_cmd_src6_0[] =3D "src6 2001:db38:1234:0000:0000:0000= :0000:0000"; +static const char dev_cmd_src_min_0[] =3D "src_min 101.102.103.104"; +static const char dev_cmd_src_max_0[] =3D "src_max 201.202.203.204"; +static const char dev_cmd_dst_mac_0[] =3D "dst_mac 01:02:03:04:05:06"; +static const char dev_cmd_src_mac_0[] =3D "src_mac 11:12:13:14:15:16"; +static const char dev_cmd_clear_counters_0[] =3D "clear_counters"; +static const char dev_cmd_flows_0[] =3D "flows 100"; +static const char dev_cmd_spi_0[] =3D "spi 100"; +static const char dev_cmd_flowlen_0[] =3D "flowlen 100"; +static const char dev_cmd_queue_map_min_0[] =3D "queue_map_min 1"; +static const char dev_cmd_queue_map_max_0[] =3D "queue_map_max 2"; +static const char dev_cmd_mpls_0[] =3D "mpls 00000001"; +static const char dev_cmd_mpls_1[] =3D "mpls 00000001,000000f2"; +static const char dev_cmd_mpls_2[] =3D "mpls 00000f00,00000f01,00000f02,00= 000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000= f0b,00000f0c,00000f0d,00000f0e,00000f0f"; +static const char dev_cmd_mpls_3[] =3D "mpls 00000f00,00000f01,00000f02,00= 000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000= f0b,00000f0c,00000f0d,00000f0e,00000f0f,00000f10"; +static const char dev_cmd_vlan_id_0[] =3D "vlan_id 1"; +static const char dev_cmd_vlan_p_0[] =3D "vlan_p 1"; +static const char dev_cmd_vlan_cfi_0[] =3D "vlan_cfi 1"; +static const char dev_cmd_vlan_id_1[] =3D "vlan_id 4096"; +static const char dev_cmd_svlan_id_0[] =3D "svlan_id 1"; +static const char dev_cmd_svlan_p_0[] =3D "svlan_p 1"; +static const char dev_cmd_svlan_cfi_0[] =3D "svlan_cfi 1"; +static const char dev_cmd_svlan_id_1[] =3D "svlan_id 4096"; +static const char dev_cmd_tos_0[] =3D "tos 0"; +static const char dev_cmd_tos_1[] =3D "tos 0f"; +static const char dev_cmd_tos_2[] =3D "tos 0ff"; +static const char dev_cmd_traffic_class_0[] =3D "traffic_class f0"; +static const char dev_cmd_skb_priority_0[] =3D "skb_priority 999"; + +FIXTURE(proc_net_pktgen) { + int ctrl_fd; + int thr_fd; + int dev_fd; +}; + +FIXTURE_SETUP(proc_net_pktgen) { + int r; + ssize_t len; + + r =3D system("modprobe pktgen"); + ASSERT_EQ(r, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not = loaded?"); + + self->ctrl_fd =3D open("/proc/net/pktgen/pgctrl", O_RDWR); + ASSERT_GE(self->ctrl_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module= pktgen not loaded?"); + + self->thr_fd =3D open("/proc/net/pktgen/kpktgend_0", O_RDWR); + ASSERT_GE(self->thr_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module = pktgen not loaded?"); + + len =3D write(self->thr_fd, thr_cmd_add_loopback_0, sizeof(thr_cmd_add_lo= opback_0)); + ASSERT_EQ(len, sizeof(thr_cmd_add_loopback_0)) TH_LOG("device lo@0 alread= y registered?"); + + self->dev_fd =3D open("/proc/net/pktgen/lo@0", O_RDWR); + ASSERT_GE(self->dev_fd, 0) TH_LOG("device entry for lo@0 missing?"); +} + +FIXTURE_TEARDOWN(proc_net_pktgen) { + int ret; + ssize_t len; + + ret =3D close(self->dev_fd); + EXPECT_EQ(ret, 0); + + len =3D write(self->thr_fd, thr_cmd_rm_loopback_0, sizeof(thr_cmd_rm_loop= back_0)); + EXPECT_EQ(len, sizeof(thr_cmd_rm_loopback_0)); + + ret =3D close(self->thr_fd); + EXPECT_EQ(ret, 0); + + ret =3D close(self->ctrl_fd); + EXPECT_EQ(ret, 0); +} + +TEST_F(proc_net_pktgen, wrong_ctrl_cmd) { + for (int i =3D 0; i <=3D sizeof(wrong_ctrl_cmd); i++) { + ssize_t len; + + len =3D write(self->ctrl_fd, wrong_ctrl_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, ctrl_cmd) { + ssize_t len; + + len =3D write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop)); + EXPECT_EQ(len, sizeof(ctrl_cmd_stop)); + + len =3D write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_stop) - 1); + + len =3D write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start)); + EXPECT_EQ(len, sizeof(ctrl_cmd_start)); + + len =3D write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_start) - 1); + + len =3D write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset)); + EXPECT_EQ(len, sizeof(ctrl_cmd_reset)); + + len =3D write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset) - 1); + EXPECT_EQ(len, sizeof(ctrl_cmd_reset) - 1); +} + +TEST_F(proc_net_pktgen, wrong_thr_cmd) { + for (int i =3D 0; i <=3D sizeof(wrong_thr_cmd); i++) { + ssize_t len; + + len =3D write(self->thr_fd, wrong_thr_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, legacy_thr_cmd) { + for (int i =3D 0; i <=3D sizeof(legacy_thr_cmd); i++) { + ssize_t len; + + len =3D write(self->thr_fd, legacy_thr_cmd, i); + if (i < (sizeof(legacy_thr_cmd) - 1)) { + // incomplete command string + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } else { + // complete command string without/with trailing '\0' + EXPECT_EQ(len, i); + } + } +} + +TEST_F(proc_net_pktgen, wrong_dev_cmd) { + for (int i =3D 0; i <=3D sizeof(wrong_dev_cmd); i++) { + ssize_t len; + + len =3D write(self->dev_fd, wrong_dev_cmd, i); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + } +} + +TEST_F(proc_net_pktgen, dev_cmd_min_pkt_size) { + ssize_t len; + + // with trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pk= t_size_0)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_0)); + + // without trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pk= t_size_0) - 1); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_0) - 1); + + // with trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pk= t_size_1)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_1)); + + // without trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pk= t_size_1) - 1); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_1) - 1); + + // with trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pk= t_size_2)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2)); + + // without trailing '\0' + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pk= t_size_2) - 1); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2) - 1); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_3, sizeof(dev_cmd_min_pk= t_size_3)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_3)); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_4, sizeof(dev_cmd_min_pk= t_size_4)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_4)); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_5, sizeof(dev_cmd_min_pk= t_size_5)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_5)); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_6, sizeof(dev_cmd_min_pk= t_size_6)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_6)); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_7, sizeof(dev_cmd_min_pk= t_size_7)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_7)); + + len =3D write(self->dev_fd, dev_cmd_min_pkt_size_8, sizeof(dev_cmd_min_pk= t_size_8)); + EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_8)); +} + +TEST_F(proc_net_pktgen, dev_cmd_max_pkt_size) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_max_pkt_size_0, sizeof(dev_cmd_max_pk= t_size_0)); + EXPECT_EQ(len, sizeof(dev_cmd_max_pkt_size_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_pkt_size) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_pkt_size_0, sizeof(dev_cmd_pkt_size_0= )); + EXPECT_EQ(len, sizeof(dev_cmd_pkt_size_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_imix_weights) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_imix_weights_0, sizeof(dev_cmd_imix_w= eights_0)); + EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_0)); + + len =3D write(self->dev_fd, dev_cmd_imix_weights_1, sizeof(dev_cmd_imix_w= eights_1)); + EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_1)); + + len =3D write(self->dev_fd, dev_cmd_imix_weights_2, sizeof(dev_cmd_imix_w= eights_2)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, E2BIG); +} + +TEST_F(proc_net_pktgen, dev_cmd_debug) { + ssize_t len; + + // debug on + len =3D write(self->dev_fd, dev_cmd_debug_0, sizeof(dev_cmd_debug_0)); + EXPECT_EQ(len, sizeof(dev_cmd_debug_0)); + + // debug off + len =3D write(self->dev_fd, dev_cmd_debug_1, sizeof(dev_cmd_debug_1)); + EXPECT_EQ(len, sizeof(dev_cmd_debug_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_frags) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_frags_0, sizeof(dev_cmd_frags_0)); + EXPECT_EQ(len, sizeof(dev_cmd_frags_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_delay) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_delay_0, sizeof(dev_cmd_delay_0)); + EXPECT_EQ(len, sizeof(dev_cmd_delay_0)); + + len =3D write(self->dev_fd, dev_cmd_delay_1, sizeof(dev_cmd_delay_1)); + EXPECT_EQ(len, sizeof(dev_cmd_delay_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_rate) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_rate_0, sizeof(dev_cmd_rate_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + len =3D write(self->dev_fd, dev_cmd_rate_1, sizeof(dev_cmd_rate_1)); + EXPECT_EQ(len, sizeof(dev_cmd_rate_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_ratep) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_ratep_0, sizeof(dev_cmd_ratep_0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EINVAL); + + len =3D write(self->dev_fd, dev_cmd_ratep_1, sizeof(dev_cmd_ratep_1)); + EXPECT_EQ(len, sizeof(dev_cmd_ratep_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_src_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_udp_src_min_0, sizeof(dev_cmd_udp_src= _min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_src_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_dst_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_udp_dst_min_0, sizeof(dev_cmd_udp_dst= _min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_src_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_udp_src_max_0, sizeof(dev_cmd_udp_src= _max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_src_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_udp_dst_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_udp_dst_max_0, sizeof(dev_cmd_udp_dst= _max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_clone_skb) { + ssize_t len; + + // clone_skb on (gives EOPNOTSUPP on lo device) + len =3D write(self->dev_fd, dev_cmd_clone_skb_0, sizeof(dev_cmd_clone_skb= _0)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, EOPNOTSUPP); + + // clone_skb off + len =3D write(self->dev_fd, dev_cmd_clone_skb_1, sizeof(dev_cmd_clone_skb= _1)); + EXPECT_EQ(len, sizeof(dev_cmd_clone_skb_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_count) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_count_0, sizeof(dev_cmd_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_mac_count) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_src_mac_count_0, sizeof(dev_cmd_src_m= ac_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_mac_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_mac_count) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst_mac_count_0, sizeof(dev_cmd_dst_m= ac_count_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_count_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_burst) { + ssize_t len; + + // burst off + len =3D write(self->dev_fd, dev_cmd_burst_0, sizeof(dev_cmd_burst_0)); + EXPECT_EQ(len, sizeof(dev_cmd_burst_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_node) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_node_0, sizeof(dev_cmd_node_0)); + EXPECT_EQ(len, sizeof(dev_cmd_node_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_xmit_mode) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_xmit_mode_0, sizeof(dev_cmd_xmit_mode= _0)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_0)); + + len =3D write(self->dev_fd, dev_cmd_xmit_mode_1, sizeof(dev_cmd_xmit_mode= _1)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_1)); + + len =3D write(self->dev_fd, dev_cmd_xmit_mode_2, sizeof(dev_cmd_xmit_mode= _2)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_2)); + + len =3D write(self->dev_fd, dev_cmd_xmit_mode_3, sizeof(dev_cmd_xmit_mode= _3)); + EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_3)); +} + +TEST_F(proc_net_pktgen, dev_cmd_flag) { + ssize_t len; + + // flag UDPCSUM on + len =3D write(self->dev_fd, dev_cmd_flag_0, sizeof(dev_cmd_flag_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_0)); + + // flag UDPCSUM off + len =3D write(self->dev_fd, dev_cmd_flag_1, sizeof(dev_cmd_flag_1)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_1)); + + // flag invalid + len =3D write(self->dev_fd, dev_cmd_flag_2, sizeof(dev_cmd_flag_2)); + EXPECT_EQ(len, sizeof(dev_cmd_flag_2)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst_min_0, sizeof(dev_cmd_dst_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst_0, sizeof(dev_cmd_dst_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst_max_0, sizeof(dev_cmd_dst_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst6_0, sizeof(dev_cmd_dst6_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst6_min_0, sizeof(dev_cmd_dst6_min_0= )); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst6_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst6_max_0, sizeof(dev_cmd_dst6_max_0= )); + EXPECT_EQ(len, sizeof(dev_cmd_dst6_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src6) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_src6_0, sizeof(dev_cmd_src6_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src6_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_src_min_0, sizeof(dev_cmd_src_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_src_max_0, sizeof(dev_cmd_src_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_dst_mac) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_dst_mac_0, sizeof(dev_cmd_dst_mac_0)); + EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_src_mac) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_src_mac_0, sizeof(dev_cmd_src_mac_0)); + EXPECT_EQ(len, sizeof(dev_cmd_src_mac_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_clear_counters) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_clear_counters_0, sizeof(dev_cmd_clea= r_counters_0)); + EXPECT_EQ(len, sizeof(dev_cmd_clear_counters_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_flows) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_flows_0, sizeof(dev_cmd_flows_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flows_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_spi) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_spi_0, sizeof(dev_cmd_spi_0)); + EXPECT_EQ(len, sizeof(dev_cmd_spi_0)) TH_LOG("CONFIG_XFRM not enabled?"); +} + +TEST_F(proc_net_pktgen, dev_cmd_flowlen) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_flowlen_0, sizeof(dev_cmd_flowlen_0)); + EXPECT_EQ(len, sizeof(dev_cmd_flowlen_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_queue_map_min) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_queue_map_min_0, sizeof(dev_cmd_queue= _map_min_0)); + EXPECT_EQ(len, sizeof(dev_cmd_queue_map_min_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_queue_map_max) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_queue_map_max_0, sizeof(dev_cmd_queue= _map_max_0)); + EXPECT_EQ(len, sizeof(dev_cmd_queue_map_max_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_mpls) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_mpls_0, sizeof(dev_cmd_mpls_0)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_0)); + + len =3D write(self->dev_fd, dev_cmd_mpls_1, sizeof(dev_cmd_mpls_1)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_1)); + + len =3D write(self->dev_fd, dev_cmd_mpls_2, sizeof(dev_cmd_mpls_2)); + EXPECT_EQ(len, sizeof(dev_cmd_mpls_2)); + + len =3D write(self->dev_fd, dev_cmd_mpls_3, sizeof(dev_cmd_mpls_3)); + EXPECT_EQ(len, -1); + EXPECT_EQ(errno, E2BIG); +} + +TEST_F(proc_net_pktgen, dev_cmd_vlan_id) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_vlan_id_0, sizeof(dev_cmd_vlan_id_0)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_0)); + + len =3D write(self->dev_fd, dev_cmd_vlan_p_0, sizeof(dev_cmd_vlan_p_0)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_p_0)); + + len =3D write(self->dev_fd, dev_cmd_vlan_cfi_0, sizeof(dev_cmd_vlan_cfi_0= )); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_cfi_0)); + + len =3D write(self->dev_fd, dev_cmd_vlan_id_1, sizeof(dev_cmd_vlan_id_1)); + EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_1)); +} + +TEST_F(proc_net_pktgen, dev_cmd_svlan_id) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_svlan_id_0, sizeof(dev_cmd_svlan_id_0= )); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_0)); + + len =3D write(self->dev_fd, dev_cmd_svlan_p_0, sizeof(dev_cmd_svlan_p_0)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_p_0)); + + len =3D write(self->dev_fd, dev_cmd_svlan_cfi_0, sizeof(dev_cmd_svlan_cfi= _0)); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_cfi_0)); + + len =3D write(self->dev_fd, dev_cmd_svlan_id_1, sizeof(dev_cmd_svlan_id_1= )); + EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_1)); +} + + +TEST_F(proc_net_pktgen, dev_cmd_tos) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_tos_0, sizeof(dev_cmd_tos_0)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_0)); + + len =3D write(self->dev_fd, dev_cmd_tos_1, sizeof(dev_cmd_tos_1)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_1)); + + len =3D write(self->dev_fd, dev_cmd_tos_2, sizeof(dev_cmd_tos_2)); + EXPECT_EQ(len, sizeof(dev_cmd_tos_2)); +} + + +TEST_F(proc_net_pktgen, dev_cmd_traffic_class) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_traffic_class_0, sizeof(dev_cmd_traff= ic_class_0)); + EXPECT_EQ(len, sizeof(dev_cmd_traffic_class_0)); +} + +TEST_F(proc_net_pktgen, dev_cmd_skb_priority) { + ssize_t len; + + len =3D write(self->dev_fd, dev_cmd_skb_priority_0, sizeof(dev_cmd_skb_pr= iority_0)); + EXPECT_EQ(len, sizeof(dev_cmd_skb_priority_0)); +} + +TEST_HARNESS_MAIN --=20 2.48.1