File Index
Files and directories
Sign in
FILE

proc_net_pktgen.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/proc_net_pktgen.c C
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * proc_net_pktgen: kselftest for /proc/net/pktgen interface
  4 *
  5 * Copyright (c) 2025 Peter Seiderer <ps.report@gmx.net>
  6 *
  7 */
  8#include <errno.h>
  9#include <fcntl.h>
 10#include <stdlib.h>
 11#include <unistd.h>
 12
 13#include "kselftest_harness.h"
 14
 15static const char ctrl_cmd_stop[] = "stop";
 16static const char ctrl_cmd_start[] = "start";
 17static const char ctrl_cmd_reset[] = "reset";
 18
 19static const char wrong_ctrl_cmd[] = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
 20
 21static const char thr_cmd_add_loopback_0[] = "add_device lo@0";
 22static const char thr_cmd_rm_loopback_0[] = "rem_device_all";
 23
 24static const char wrong_thr_cmd[] = "forsureawrongcommand";
 25static const char legacy_thr_cmd[] = "max_before_softirq";
 26
 27static const char wrong_dev_cmd[] = "forsurewrongcommand";
 28static const char dev_cmd_min_pkt_size_0[] = "min_pkt_size";
 29static const char dev_cmd_min_pkt_size_1[] = "min_pkt_size ";
 30static const char dev_cmd_min_pkt_size_2[] = "min_pkt_size 0";
 31static const char dev_cmd_min_pkt_size_3[] = "min_pkt_size 1";
 32static const char dev_cmd_min_pkt_size_4[] = "min_pkt_size 100";
 33static const char dev_cmd_min_pkt_size_5[] = "min_pkt_size=1001";
 34static const char dev_cmd_min_pkt_size_6[] = "min_pkt_size =2002";
 35static const char dev_cmd_min_pkt_size_7[] = "min_pkt_size= 3003";
 36static const char dev_cmd_min_pkt_size_8[] = "min_pkt_size = 4004";
 37static const char dev_cmd_max_pkt_size_0[] = "max_pkt_size 200";
 38static const char dev_cmd_pkt_size_0[] = "pkt_size 300";
 39static const char dev_cmd_imix_weights_0[] = "imix_weights 0,7 576,4 1500,1";
 40static const char dev_cmd_imix_weights_1[] = "imix_weights 101,1 102,2 103,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";
 41static const char dev_cmd_imix_weights_2[] = "imix_weights 100,1 102,2 103,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";
 42static const char dev_cmd_imix_weights_3[] = "imix_weights";
 43static const char dev_cmd_imix_weights_4[] = "imix_weights ";
 44static const char dev_cmd_imix_weights_5[] = "imix_weights 0";
 45static const char dev_cmd_imix_weights_6[] = "imix_weights 0,";
 46static const char dev_cmd_debug_0[] = "debug 1";
 47static const char dev_cmd_debug_1[] = "debug 0";
 48static const char dev_cmd_frags_0[] = "frags 100";
 49static const char dev_cmd_delay_0[] = "delay 100";
 50static const char dev_cmd_delay_1[] = "delay 2147483647";
 51static const char dev_cmd_rate_0[] = "rate 0";
 52static const char dev_cmd_rate_1[] = "rate 100";
 53static const char dev_cmd_ratep_0[] = "ratep 0";
 54static const char dev_cmd_ratep_1[] = "ratep 200";
 55static const char dev_cmd_udp_src_min_0[] = "udp_src_min 1";
 56static const char dev_cmd_udp_dst_min_0[] = "udp_dst_min 2";
 57static const char dev_cmd_udp_src_max_0[] = "udp_src_max 3";
 58static const char dev_cmd_udp_dst_max_0[] = "udp_dst_max 4";
 59static const char dev_cmd_clone_skb_0[] = "clone_skb 1";
 60static const char dev_cmd_clone_skb_1[] = "clone_skb 0";
 61static const char dev_cmd_count_0[] = "count 100";
 62static const char dev_cmd_src_mac_count_0[] = "src_mac_count 100";
 63static const char dev_cmd_dst_mac_count_0[] = "dst_mac_count 100";
 64static const char dev_cmd_burst_0[] = "burst 0";
 65static const char dev_cmd_node_0[] = "node 100";
 66static const char dev_cmd_xmit_mode_0[] = "xmit_mode start_xmit";
 67static const char dev_cmd_xmit_mode_1[] = "xmit_mode netif_receive";
 68static const char dev_cmd_xmit_mode_2[] = "xmit_mode queue_xmit";
 69static const char dev_cmd_xmit_mode_3[] = "xmit_mode nonsense";
 70static const char dev_cmd_flag_0[] = "flag UDPCSUM";
 71static const char dev_cmd_flag_1[] = "flag !UDPCSUM";
 72static const char dev_cmd_flag_2[] = "flag nonsense";
 73static const char dev_cmd_dst_min_0[] = "dst_min 101.102.103.104";
 74static const char dev_cmd_dst_0[] = "dst 101.102.103.104";
 75static const char dev_cmd_dst_max_0[] = "dst_max 201.202.203.204";
 76static const char dev_cmd_dst6_0[] = "dst6 2001:db38:1234:0000:0000:0000:0000:0000";
 77static const char dev_cmd_dst6_min_0[] = "dst6_min 2001:db8:1234:0000:0000:0000:0000:0000";
 78static const char dev_cmd_dst6_max_0[] = "dst6_max 2001:db8:1234:0000:0000:0000:0000:0000";
 79static const char dev_cmd_src6_0[] = "src6 2001:db38:1234:0000:0000:0000:0000:0000";
 80static const char dev_cmd_src_min_0[] = "src_min 101.102.103.104";
 81static const char dev_cmd_src_max_0[] = "src_max 201.202.203.204";
 82static const char dev_cmd_dst_mac_0[] = "dst_mac 01:02:03:04:05:06";
 83static const char dev_cmd_src_mac_0[] = "src_mac 11:12:13:14:15:16";
 84static const char dev_cmd_clear_counters_0[] = "clear_counters";
 85static const char dev_cmd_flows_0[] = "flows 100";
 86static const char dev_cmd_spi_0[] = "spi 100";
 87static const char dev_cmd_flowlen_0[] = "flowlen 100";
 88static const char dev_cmd_queue_map_min_0[] = "queue_map_min 1";
 89static const char dev_cmd_queue_map_max_0[] = "queue_map_max 2";
 90static const char dev_cmd_mpls_0[] = "mpls 00000001";
 91static const char dev_cmd_mpls_1[] = "mpls 00000001,000000f2";
 92static const char dev_cmd_mpls_2[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f";
 93static const char dev_cmd_mpls_3[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f,00000f10";
 94static const char dev_cmd_vlan_id_0[] = "vlan_id 1";
 95static const char dev_cmd_vlan_p_0[] = "vlan_p 1";
 96static const char dev_cmd_vlan_cfi_0[] = "vlan_cfi 1";
 97static const char dev_cmd_vlan_id_1[] = "vlan_id 4096";
 98static const char dev_cmd_svlan_id_0[] = "svlan_id 1";
 99static const char dev_cmd_svlan_p_0[] = "svlan_p 1";
100static const char dev_cmd_svlan_cfi_0[] = "svlan_cfi 1";
101static const char dev_cmd_svlan_id_1[] = "svlan_id 4096";
102static const char dev_cmd_tos_0[] = "tos 0";
103static const char dev_cmd_tos_1[] = "tos 0f";
104static const char dev_cmd_tos_2[] = "tos 0ff";
105static const char dev_cmd_traffic_class_0[] = "traffic_class f0";
106static const char dev_cmd_skb_priority_0[] = "skb_priority 999";
107
108FIXTURE(proc_net_pktgen) {
109	int ctrl_fd;
110	int thr_fd;
111	int dev_fd;
112};
113
114FIXTURE_SETUP(proc_net_pktgen) {
115	int r;
116	ssize_t len;
117
118	r = system("modprobe pktgen");
119	ASSERT_EQ(r, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?");
120
121	self->ctrl_fd = open("/proc/net/pktgen/pgctrl", O_RDWR);
122	ASSERT_GE(self->ctrl_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?");
123
124	self->thr_fd = open("/proc/net/pktgen/kpktgend_0", O_RDWR);
125	ASSERT_GE(self->thr_fd, 0) TH_LOG("CONFIG_NET_PKTGEN not enabled, module pktgen not loaded?");
126
127	len = write(self->thr_fd, thr_cmd_add_loopback_0, sizeof(thr_cmd_add_loopback_0));
128	ASSERT_EQ(len, sizeof(thr_cmd_add_loopback_0)) TH_LOG("device lo@0 already registered?");
129
130	self->dev_fd = open("/proc/net/pktgen/lo@0", O_RDWR);
131	ASSERT_GE(self->dev_fd, 0) TH_LOG("device entry for lo@0 missing?");
132}
133
134FIXTURE_TEARDOWN(proc_net_pktgen) {
135	int ret;
136	ssize_t len;
137
138	ret = close(self->dev_fd);
139	EXPECT_EQ(ret, 0);
140
141	len = write(self->thr_fd, thr_cmd_rm_loopback_0, sizeof(thr_cmd_rm_loopback_0));
142	EXPECT_EQ(len, sizeof(thr_cmd_rm_loopback_0));
143
144	ret = close(self->thr_fd);
145	EXPECT_EQ(ret, 0);
146
147	ret = close(self->ctrl_fd);
148	EXPECT_EQ(ret, 0);
149}
150
151TEST_F(proc_net_pktgen, wrong_ctrl_cmd) {
152	for (int i = 0; i <= sizeof(wrong_ctrl_cmd); i++) {
153		ssize_t len;
154
155		len = write(self->ctrl_fd, wrong_ctrl_cmd, i);
156		EXPECT_EQ(len, -1);
157		EXPECT_EQ(errno, EINVAL);
158	}
159}
160
161TEST_F(proc_net_pktgen, ctrl_cmd) {
162	ssize_t len;
163
164	len = write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop));
165	EXPECT_EQ(len,	sizeof(ctrl_cmd_stop));
166
167	len = write(self->ctrl_fd, ctrl_cmd_stop, sizeof(ctrl_cmd_stop) - 1);
168	EXPECT_EQ(len,	sizeof(ctrl_cmd_stop) - 1);
169
170	len = write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start));
171	EXPECT_EQ(len,	sizeof(ctrl_cmd_start));
172
173	len = write(self->ctrl_fd, ctrl_cmd_start, sizeof(ctrl_cmd_start) - 1);
174	EXPECT_EQ(len,	sizeof(ctrl_cmd_start) - 1);
175
176	len = write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset));
177	EXPECT_EQ(len,	sizeof(ctrl_cmd_reset));
178
179	len = write(self->ctrl_fd, ctrl_cmd_reset, sizeof(ctrl_cmd_reset) - 1);
180	EXPECT_EQ(len,	sizeof(ctrl_cmd_reset) - 1);
181}
182
183TEST_F(proc_net_pktgen, wrong_thr_cmd) {
184	for (int i = 0; i <= sizeof(wrong_thr_cmd); i++) {
185		ssize_t len;
186
187		len = write(self->thr_fd, wrong_thr_cmd, i);
188		EXPECT_EQ(len, -1);
189		EXPECT_EQ(errno, EINVAL);
190	}
191}
192
193TEST_F(proc_net_pktgen, legacy_thr_cmd) {
194	for (int i = 0; i <= sizeof(legacy_thr_cmd); i++) {
195		ssize_t len;
196
197		len = write(self->thr_fd, legacy_thr_cmd, i);
198		if (i < (sizeof(legacy_thr_cmd) - 1)) {
199			/* incomplete command string */
200			EXPECT_EQ(len, -1);
201			EXPECT_EQ(errno, EINVAL);
202		} else {
203			/* complete command string without/with trailing '\0' */
204			EXPECT_EQ(len, i);
205		}
206	}
207}
208
209TEST_F(proc_net_pktgen, wrong_dev_cmd) {
210	for (int i = 0; i <= sizeof(wrong_dev_cmd); i++) {
211		ssize_t len;
212
213		len = write(self->dev_fd, wrong_dev_cmd, i);
214		EXPECT_EQ(len, -1);
215		EXPECT_EQ(errno, EINVAL);
216	}
217}
218
219TEST_F(proc_net_pktgen, dev_cmd_min_pkt_size) {
220	ssize_t len;
221
222	/* with trailing '\0' */
223	len = write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pkt_size_0));
224	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_0));
225
226	/* without trailing '\0' */
227	len = write(self->dev_fd, dev_cmd_min_pkt_size_0, sizeof(dev_cmd_min_pkt_size_0) - 1);
228	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_0) - 1);
229
230	/* with trailing '\0' */
231	len = write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pkt_size_1));
232	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_1));
233
234	/* without trailing '\0' */
235	len = write(self->dev_fd, dev_cmd_min_pkt_size_1, sizeof(dev_cmd_min_pkt_size_1) - 1);
236	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_1) - 1);
237
238	/* with trailing '\0' */
239	len = write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pkt_size_2));
240	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2));
241
242	/* without trailing '\0' */
243	len = write(self->dev_fd, dev_cmd_min_pkt_size_2, sizeof(dev_cmd_min_pkt_size_2) - 1);
244	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_2) - 1);
245
246	len = write(self->dev_fd, dev_cmd_min_pkt_size_3, sizeof(dev_cmd_min_pkt_size_3));
247	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_3));
248
249	len = write(self->dev_fd, dev_cmd_min_pkt_size_4, sizeof(dev_cmd_min_pkt_size_4));
250	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_4));
251
252	len = write(self->dev_fd, dev_cmd_min_pkt_size_5, sizeof(dev_cmd_min_pkt_size_5));
253	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_5));
254
255	len = write(self->dev_fd, dev_cmd_min_pkt_size_6, sizeof(dev_cmd_min_pkt_size_6));
256	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_6));
257
258	len = write(self->dev_fd, dev_cmd_min_pkt_size_7, sizeof(dev_cmd_min_pkt_size_7));
259	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_7));
260
261	len = write(self->dev_fd, dev_cmd_min_pkt_size_8, sizeof(dev_cmd_min_pkt_size_8));
262	EXPECT_EQ(len, sizeof(dev_cmd_min_pkt_size_8));
263}
264
265TEST_F(proc_net_pktgen, dev_cmd_max_pkt_size) {
266	ssize_t len;
267
268	len = write(self->dev_fd, dev_cmd_max_pkt_size_0, sizeof(dev_cmd_max_pkt_size_0));
269	EXPECT_EQ(len, sizeof(dev_cmd_max_pkt_size_0));
270}
271
272TEST_F(proc_net_pktgen, dev_cmd_pkt_size) {
273	ssize_t len;
274
275	len = write(self->dev_fd, dev_cmd_pkt_size_0, sizeof(dev_cmd_pkt_size_0));
276	EXPECT_EQ(len, sizeof(dev_cmd_pkt_size_0));
277}
278
279TEST_F(proc_net_pktgen, dev_cmd_imix_weights) {
280	ssize_t len;
281
282	len = write(self->dev_fd, dev_cmd_imix_weights_0, sizeof(dev_cmd_imix_weights_0));
283	EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_0));
284
285	len = write(self->dev_fd, dev_cmd_imix_weights_1, sizeof(dev_cmd_imix_weights_1));
286	EXPECT_EQ(len, sizeof(dev_cmd_imix_weights_1));
287
288	len = write(self->dev_fd, dev_cmd_imix_weights_2, sizeof(dev_cmd_imix_weights_2));
289	EXPECT_EQ(len, -1);
290	EXPECT_EQ(errno, E2BIG);
291
292	/* with trailing '\0' */
293	len = write(self->dev_fd, dev_cmd_imix_weights_3, sizeof(dev_cmd_imix_weights_3));
294	EXPECT_EQ(len, -1);
295	EXPECT_EQ(errno, EINVAL);
296
297	/* without trailing '\0' */
298	len = write(self->dev_fd, dev_cmd_imix_weights_3, sizeof(dev_cmd_imix_weights_3) - 1);
299	EXPECT_EQ(len, -1);
300	EXPECT_EQ(errno, EINVAL);
301
302	/* with trailing '\0' */
303	len = write(self->dev_fd, dev_cmd_imix_weights_4, sizeof(dev_cmd_imix_weights_4));
304	EXPECT_EQ(len, -1);
305	EXPECT_EQ(errno, EINVAL);
306
307	/* without trailing '\0' */
308	len = write(self->dev_fd, dev_cmd_imix_weights_4, sizeof(dev_cmd_imix_weights_4) - 1);
309	EXPECT_EQ(len, -1);
310	EXPECT_EQ(errno, EINVAL);
311
312	/* with trailing '\0' */
313	len = write(self->dev_fd, dev_cmd_imix_weights_5, sizeof(dev_cmd_imix_weights_5));
314	EXPECT_EQ(len, -1);
315	EXPECT_EQ(errno, EINVAL);
316
317	/* without trailing '\0' */
318	len = write(self->dev_fd, dev_cmd_imix_weights_5, sizeof(dev_cmd_imix_weights_5) - 1);
319	EXPECT_EQ(len, -1);
320	EXPECT_EQ(errno, EINVAL);
321
322	/* with trailing '\0' */
323	len = write(self->dev_fd, dev_cmd_imix_weights_6, sizeof(dev_cmd_imix_weights_6));
324	EXPECT_EQ(len, -1);
325	EXPECT_EQ(errno, EINVAL);
326
327	/* without trailing '\0' */
328	len = write(self->dev_fd, dev_cmd_imix_weights_6, sizeof(dev_cmd_imix_weights_6) - 1);
329	EXPECT_EQ(len, -1);
330	EXPECT_EQ(errno, EINVAL);
331}
332
333TEST_F(proc_net_pktgen, dev_cmd_debug) {
334	ssize_t len;
335
336	/* debug on */
337	len = write(self->dev_fd, dev_cmd_debug_0, sizeof(dev_cmd_debug_0));
338	EXPECT_EQ(len, sizeof(dev_cmd_debug_0));
339
340	/* debug off */
341	len = write(self->dev_fd, dev_cmd_debug_1, sizeof(dev_cmd_debug_1));
342	EXPECT_EQ(len, sizeof(dev_cmd_debug_1));
343}
344
345TEST_F(proc_net_pktgen, dev_cmd_frags) {
346	ssize_t len;
347
348	len = write(self->dev_fd, dev_cmd_frags_0, sizeof(dev_cmd_frags_0));
349	EXPECT_EQ(len, sizeof(dev_cmd_frags_0));
350}
351
352TEST_F(proc_net_pktgen, dev_cmd_delay) {
353	ssize_t len;
354
355	len = write(self->dev_fd, dev_cmd_delay_0, sizeof(dev_cmd_delay_0));
356	EXPECT_EQ(len, sizeof(dev_cmd_delay_0));
357
358	len = write(self->dev_fd, dev_cmd_delay_1, sizeof(dev_cmd_delay_1));
359	EXPECT_EQ(len, sizeof(dev_cmd_delay_1));
360}
361
362TEST_F(proc_net_pktgen, dev_cmd_rate) {
363	ssize_t len;
364
365	len = write(self->dev_fd, dev_cmd_rate_0, sizeof(dev_cmd_rate_0));
366	EXPECT_EQ(len, -1);
367	EXPECT_EQ(errno, EINVAL);
368
369	len = write(self->dev_fd, dev_cmd_rate_1, sizeof(dev_cmd_rate_1));
370	EXPECT_EQ(len, sizeof(dev_cmd_rate_1));
371}
372
373TEST_F(proc_net_pktgen, dev_cmd_ratep) {
374	ssize_t len;
375
376	len = write(self->dev_fd, dev_cmd_ratep_0, sizeof(dev_cmd_ratep_0));
377	EXPECT_EQ(len, -1);
378	EXPECT_EQ(errno, EINVAL);
379
380	len = write(self->dev_fd, dev_cmd_ratep_1, sizeof(dev_cmd_ratep_1));
381	EXPECT_EQ(len, sizeof(dev_cmd_ratep_1));
382}
383
384TEST_F(proc_net_pktgen, dev_cmd_udp_src_min) {
385	ssize_t len;
386
387	len = write(self->dev_fd, dev_cmd_udp_src_min_0, sizeof(dev_cmd_udp_src_min_0));
388	EXPECT_EQ(len, sizeof(dev_cmd_udp_src_min_0));
389}
390
391TEST_F(proc_net_pktgen, dev_cmd_udp_dst_min) {
392	ssize_t len;
393
394	len = write(self->dev_fd, dev_cmd_udp_dst_min_0, sizeof(dev_cmd_udp_dst_min_0));
395	EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_min_0));
396}
397
398TEST_F(proc_net_pktgen, dev_cmd_udp_src_max) {
399	ssize_t len;
400
401	len = write(self->dev_fd, dev_cmd_udp_src_max_0, sizeof(dev_cmd_udp_src_max_0));
402	EXPECT_EQ(len, sizeof(dev_cmd_udp_src_max_0));
403}
404
405TEST_F(proc_net_pktgen, dev_cmd_udp_dst_max) {
406	ssize_t len;
407
408	len = write(self->dev_fd, dev_cmd_udp_dst_max_0, sizeof(dev_cmd_udp_dst_max_0));
409	EXPECT_EQ(len, sizeof(dev_cmd_udp_dst_max_0));
410}
411
412TEST_F(proc_net_pktgen, dev_cmd_clone_skb) {
413	ssize_t len;
414
415	/* clone_skb on (gives EOPNOTSUPP on lo device) */
416	len = write(self->dev_fd, dev_cmd_clone_skb_0, sizeof(dev_cmd_clone_skb_0));
417	EXPECT_EQ(len, -1);
418	EXPECT_EQ(errno, EOPNOTSUPP);
419
420	/* clone_skb off */
421	len = write(self->dev_fd, dev_cmd_clone_skb_1, sizeof(dev_cmd_clone_skb_1));
422	EXPECT_EQ(len, sizeof(dev_cmd_clone_skb_1));
423}
424
425TEST_F(proc_net_pktgen, dev_cmd_count) {
426	ssize_t len;
427
428	len = write(self->dev_fd, dev_cmd_count_0, sizeof(dev_cmd_count_0));
429	EXPECT_EQ(len, sizeof(dev_cmd_count_0));
430}
431
432TEST_F(proc_net_pktgen, dev_cmd_src_mac_count) {
433	ssize_t len;
434
435	len = write(self->dev_fd, dev_cmd_src_mac_count_0, sizeof(dev_cmd_src_mac_count_0));
436	EXPECT_EQ(len, sizeof(dev_cmd_src_mac_count_0));
437}
438
439TEST_F(proc_net_pktgen, dev_cmd_dst_mac_count) {
440	ssize_t len;
441
442	len = write(self->dev_fd, dev_cmd_dst_mac_count_0, sizeof(dev_cmd_dst_mac_count_0));
443	EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_count_0));
444}
445
446TEST_F(proc_net_pktgen, dev_cmd_burst) {
447	ssize_t len;
448
449	/* burst off */
450	len = write(self->dev_fd, dev_cmd_burst_0, sizeof(dev_cmd_burst_0));
451	EXPECT_EQ(len, sizeof(dev_cmd_burst_0));
452}
453
454TEST_F(proc_net_pktgen, dev_cmd_node) {
455	ssize_t len;
456
457	len = write(self->dev_fd, dev_cmd_node_0, sizeof(dev_cmd_node_0));
458	EXPECT_EQ(len, sizeof(dev_cmd_node_0));
459}
460
461TEST_F(proc_net_pktgen, dev_cmd_xmit_mode) {
462	ssize_t len;
463
464	len = write(self->dev_fd, dev_cmd_xmit_mode_0, sizeof(dev_cmd_xmit_mode_0));
465	EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_0));
466
467	len = write(self->dev_fd, dev_cmd_xmit_mode_1, sizeof(dev_cmd_xmit_mode_1));
468	EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_1));
469
470	len = write(self->dev_fd, dev_cmd_xmit_mode_2, sizeof(dev_cmd_xmit_mode_2));
471	EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_2));
472
473	len = write(self->dev_fd, dev_cmd_xmit_mode_3, sizeof(dev_cmd_xmit_mode_3));
474	EXPECT_EQ(len, sizeof(dev_cmd_xmit_mode_3));
475}
476
477TEST_F(proc_net_pktgen, dev_cmd_flag) {
478	ssize_t len;
479
480	/* flag UDPCSUM on */
481	len = write(self->dev_fd, dev_cmd_flag_0, sizeof(dev_cmd_flag_0));
482	EXPECT_EQ(len, sizeof(dev_cmd_flag_0));
483
484	/* flag UDPCSUM off */
485	len = write(self->dev_fd, dev_cmd_flag_1, sizeof(dev_cmd_flag_1));
486	EXPECT_EQ(len, sizeof(dev_cmd_flag_1));
487
488	/* flag invalid */
489	len = write(self->dev_fd, dev_cmd_flag_2, sizeof(dev_cmd_flag_2));
490	EXPECT_EQ(len, sizeof(dev_cmd_flag_2));
491}
492
493TEST_F(proc_net_pktgen, dev_cmd_dst_min) {
494	ssize_t len;
495
496	len = write(self->dev_fd, dev_cmd_dst_min_0, sizeof(dev_cmd_dst_min_0));
497	EXPECT_EQ(len, sizeof(dev_cmd_dst_min_0));
498}
499
500TEST_F(proc_net_pktgen, dev_cmd_dst) {
501	ssize_t len;
502
503	len = write(self->dev_fd, dev_cmd_dst_0, sizeof(dev_cmd_dst_0));
504	EXPECT_EQ(len, sizeof(dev_cmd_dst_0));
505}
506
507TEST_F(proc_net_pktgen, dev_cmd_dst_max) {
508	ssize_t len;
509
510	len = write(self->dev_fd, dev_cmd_dst_max_0, sizeof(dev_cmd_dst_max_0));
511	EXPECT_EQ(len, sizeof(dev_cmd_dst_max_0));
512}
513
514TEST_F(proc_net_pktgen, dev_cmd_dst6) {
515	ssize_t len;
516
517	len = write(self->dev_fd, dev_cmd_dst6_0, sizeof(dev_cmd_dst6_0));
518	EXPECT_EQ(len, sizeof(dev_cmd_dst6_0));
519}
520
521TEST_F(proc_net_pktgen, dev_cmd_dst6_min) {
522	ssize_t len;
523
524	len = write(self->dev_fd, dev_cmd_dst6_min_0, sizeof(dev_cmd_dst6_min_0));
525	EXPECT_EQ(len, sizeof(dev_cmd_dst6_min_0));
526}
527
528TEST_F(proc_net_pktgen, dev_cmd_dst6_max) {
529	ssize_t len;
530
531	len = write(self->dev_fd, dev_cmd_dst6_max_0, sizeof(dev_cmd_dst6_max_0));
532	EXPECT_EQ(len, sizeof(dev_cmd_dst6_max_0));
533}
534
535TEST_F(proc_net_pktgen, dev_cmd_src6) {
536	ssize_t len;
537
538	len = write(self->dev_fd, dev_cmd_src6_0, sizeof(dev_cmd_src6_0));
539	EXPECT_EQ(len, sizeof(dev_cmd_src6_0));
540}
541
542TEST_F(proc_net_pktgen, dev_cmd_src_min) {
543	ssize_t len;
544
545	len = write(self->dev_fd, dev_cmd_src_min_0, sizeof(dev_cmd_src_min_0));
546	EXPECT_EQ(len, sizeof(dev_cmd_src_min_0));
547}
548
549TEST_F(proc_net_pktgen, dev_cmd_src_max) {
550	ssize_t len;
551
552	len = write(self->dev_fd, dev_cmd_src_max_0, sizeof(dev_cmd_src_max_0));
553	EXPECT_EQ(len, sizeof(dev_cmd_src_max_0));
554}
555
556TEST_F(proc_net_pktgen, dev_cmd_dst_mac) {
557	ssize_t len;
558
559	len = write(self->dev_fd, dev_cmd_dst_mac_0, sizeof(dev_cmd_dst_mac_0));
560	EXPECT_EQ(len, sizeof(dev_cmd_dst_mac_0));
561}
562
563TEST_F(proc_net_pktgen, dev_cmd_src_mac) {
564	ssize_t len;
565
566	len = write(self->dev_fd, dev_cmd_src_mac_0, sizeof(dev_cmd_src_mac_0));
567	EXPECT_EQ(len, sizeof(dev_cmd_src_mac_0));
568}
569
570TEST_F(proc_net_pktgen, dev_cmd_clear_counters) {
571	ssize_t len;
572
573	len = write(self->dev_fd, dev_cmd_clear_counters_0, sizeof(dev_cmd_clear_counters_0));
574	EXPECT_EQ(len, sizeof(dev_cmd_clear_counters_0));
575}
576
577TEST_F(proc_net_pktgen, dev_cmd_flows) {
578	ssize_t len;
579
580	len = write(self->dev_fd, dev_cmd_flows_0, sizeof(dev_cmd_flows_0));
581	EXPECT_EQ(len, sizeof(dev_cmd_flows_0));
582}
583
584TEST_F(proc_net_pktgen, dev_cmd_spi) {
585	ssize_t len;
586
587	len = write(self->dev_fd, dev_cmd_spi_0, sizeof(dev_cmd_spi_0));
588	EXPECT_EQ(len, sizeof(dev_cmd_spi_0)) TH_LOG("CONFIG_XFRM not enabled?");
589}
590
591TEST_F(proc_net_pktgen, dev_cmd_flowlen) {
592	ssize_t len;
593
594	len = write(self->dev_fd, dev_cmd_flowlen_0, sizeof(dev_cmd_flowlen_0));
595	EXPECT_EQ(len, sizeof(dev_cmd_flowlen_0));
596}
597
598TEST_F(proc_net_pktgen, dev_cmd_queue_map_min) {
599	ssize_t len;
600
601	len = write(self->dev_fd, dev_cmd_queue_map_min_0, sizeof(dev_cmd_queue_map_min_0));
602	EXPECT_EQ(len, sizeof(dev_cmd_queue_map_min_0));
603}
604
605TEST_F(proc_net_pktgen, dev_cmd_queue_map_max) {
606	ssize_t len;
607
608	len = write(self->dev_fd, dev_cmd_queue_map_max_0, sizeof(dev_cmd_queue_map_max_0));
609	EXPECT_EQ(len, sizeof(dev_cmd_queue_map_max_0));
610}
611
612TEST_F(proc_net_pktgen, dev_cmd_mpls) {
613	ssize_t len;
614
615	len = write(self->dev_fd, dev_cmd_mpls_0, sizeof(dev_cmd_mpls_0));
616	EXPECT_EQ(len, sizeof(dev_cmd_mpls_0));
617
618	len = write(self->dev_fd, dev_cmd_mpls_1, sizeof(dev_cmd_mpls_1));
619	EXPECT_EQ(len, sizeof(dev_cmd_mpls_1));
620
621	len = write(self->dev_fd, dev_cmd_mpls_2, sizeof(dev_cmd_mpls_2));
622	EXPECT_EQ(len, sizeof(dev_cmd_mpls_2));
623
624	len = write(self->dev_fd, dev_cmd_mpls_3, sizeof(dev_cmd_mpls_3));
625	EXPECT_EQ(len, -1);
626	EXPECT_EQ(errno, E2BIG);
627}
628
629TEST_F(proc_net_pktgen, dev_cmd_vlan_id) {
630	ssize_t len;
631
632	len = write(self->dev_fd, dev_cmd_vlan_id_0, sizeof(dev_cmd_vlan_id_0));
633	EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_0));
634
635	len = write(self->dev_fd, dev_cmd_vlan_p_0, sizeof(dev_cmd_vlan_p_0));
636	EXPECT_EQ(len, sizeof(dev_cmd_vlan_p_0));
637
638	len = write(self->dev_fd, dev_cmd_vlan_cfi_0, sizeof(dev_cmd_vlan_cfi_0));
639	EXPECT_EQ(len, sizeof(dev_cmd_vlan_cfi_0));
640
641	len = write(self->dev_fd, dev_cmd_vlan_id_1, sizeof(dev_cmd_vlan_id_1));
642	EXPECT_EQ(len, sizeof(dev_cmd_vlan_id_1));
643}
644
645TEST_F(proc_net_pktgen, dev_cmd_svlan_id) {
646	ssize_t len;
647
648	len = write(self->dev_fd, dev_cmd_svlan_id_0, sizeof(dev_cmd_svlan_id_0));
649	EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_0));
650
651	len = write(self->dev_fd, dev_cmd_svlan_p_0, sizeof(dev_cmd_svlan_p_0));
652	EXPECT_EQ(len, sizeof(dev_cmd_svlan_p_0));
653
654	len = write(self->dev_fd, dev_cmd_svlan_cfi_0, sizeof(dev_cmd_svlan_cfi_0));
655	EXPECT_EQ(len, sizeof(dev_cmd_svlan_cfi_0));
656
657	len = write(self->dev_fd, dev_cmd_svlan_id_1, sizeof(dev_cmd_svlan_id_1));
658	EXPECT_EQ(len, sizeof(dev_cmd_svlan_id_1));
659}
660
661
662TEST_F(proc_net_pktgen, dev_cmd_tos) {
663	ssize_t len;
664
665	len = write(self->dev_fd, dev_cmd_tos_0, sizeof(dev_cmd_tos_0));
666	EXPECT_EQ(len, sizeof(dev_cmd_tos_0));
667
668	len = write(self->dev_fd, dev_cmd_tos_1, sizeof(dev_cmd_tos_1));
669	EXPECT_EQ(len, sizeof(dev_cmd_tos_1));
670
671	len = write(self->dev_fd, dev_cmd_tos_2, sizeof(dev_cmd_tos_2));
672	EXPECT_EQ(len, sizeof(dev_cmd_tos_2));
673}
674
675
676TEST_F(proc_net_pktgen, dev_cmd_traffic_class) {
677	ssize_t len;
678
679	len = write(self->dev_fd, dev_cmd_traffic_class_0, sizeof(dev_cmd_traffic_class_0));
680	EXPECT_EQ(len, sizeof(dev_cmd_traffic_class_0));
681}
682
683TEST_F(proc_net_pktgen, dev_cmd_skb_priority) {
684	ssize_t len;
685
686	len = write(self->dev_fd, dev_cmd_skb_priority_0, sizeof(dev_cmd_skb_priority_0));
687	EXPECT_EQ(len, sizeof(dev_cmd_skb_priority_0));
688}
689
690TEST_HARNESS_MAIN
~/ Read-only file preview.