xref: /linux/tools/testing/selftests/net/proc_net_pktgen.c (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
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 
15 static const char ctrl_cmd_stop[] = "stop";
16 static const char ctrl_cmd_start[] = "start";
17 static const char ctrl_cmd_reset[] = "reset";
18 
19 static const char wrong_ctrl_cmd[] = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
20 
21 static const char thr_cmd_add_loopback_0[] = "add_device lo@0";
22 static const char thr_cmd_rm_loopback_0[] = "rem_device_all";
23 
24 static const char wrong_thr_cmd[] = "forsureawrongcommand";
25 static const char legacy_thr_cmd[] = "max_before_softirq";
26 
27 static const char wrong_dev_cmd[] = "forsurewrongcommand";
28 static const char dev_cmd_min_pkt_size_0[] = "min_pkt_size";
29 static const char dev_cmd_min_pkt_size_1[] = "min_pkt_size ";
30 static const char dev_cmd_min_pkt_size_2[] = "min_pkt_size 0";
31 static const char dev_cmd_min_pkt_size_3[] = "min_pkt_size 1";
32 static const char dev_cmd_min_pkt_size_4[] = "min_pkt_size 100";
33 static const char dev_cmd_min_pkt_size_5[] = "min_pkt_size=1001";
34 static const char dev_cmd_min_pkt_size_6[] = "min_pkt_size =2002";
35 static const char dev_cmd_min_pkt_size_7[] = "min_pkt_size= 3003";
36 static const char dev_cmd_min_pkt_size_8[] = "min_pkt_size = 4004";
37 static const char dev_cmd_max_pkt_size_0[] = "max_pkt_size 200";
38 static const char dev_cmd_pkt_size_0[] = "pkt_size 300";
39 static const char dev_cmd_imix_weights_0[] = "imix_weights 0,7 576,4 1500,1";
40 static 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";
41 static 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";
42 static const char dev_cmd_imix_weights_3[] = "imix_weights";
43 static const char dev_cmd_imix_weights_4[] = "imix_weights ";
44 static const char dev_cmd_imix_weights_5[] = "imix_weights 0";
45 static const char dev_cmd_imix_weights_6[] = "imix_weights 0,";
46 static const char dev_cmd_debug_0[] = "debug 1";
47 static const char dev_cmd_debug_1[] = "debug 0";
48 static const char dev_cmd_frags_0[] = "frags 100";
49 static const char dev_cmd_delay_0[] = "delay 100";
50 static const char dev_cmd_delay_1[] = "delay 2147483647";
51 static const char dev_cmd_rate_0[] = "rate 0";
52 static const char dev_cmd_rate_1[] = "rate 100";
53 static const char dev_cmd_ratep_0[] = "ratep 0";
54 static const char dev_cmd_ratep_1[] = "ratep 200";
55 static const char dev_cmd_udp_src_min_0[] = "udp_src_min 1";
56 static const char dev_cmd_udp_dst_min_0[] = "udp_dst_min 2";
57 static const char dev_cmd_udp_src_max_0[] = "udp_src_max 3";
58 static const char dev_cmd_udp_dst_max_0[] = "udp_dst_max 4";
59 static const char dev_cmd_clone_skb_0[] = "clone_skb 1";
60 static const char dev_cmd_clone_skb_1[] = "clone_skb 0";
61 static const char dev_cmd_count_0[] = "count 100";
62 static const char dev_cmd_src_mac_count_0[] = "src_mac_count 100";
63 static const char dev_cmd_dst_mac_count_0[] = "dst_mac_count 100";
64 static const char dev_cmd_burst_0[] = "burst 0";
65 static const char dev_cmd_node_0[] = "node 100";
66 static const char dev_cmd_xmit_mode_0[] = "xmit_mode start_xmit";
67 static const char dev_cmd_xmit_mode_1[] = "xmit_mode netif_receive";
68 static const char dev_cmd_xmit_mode_2[] = "xmit_mode queue_xmit";
69 static const char dev_cmd_xmit_mode_3[] = "xmit_mode nonsense";
70 static const char dev_cmd_flag_0[] = "flag UDPCSUM";
71 static const char dev_cmd_flag_1[] = "flag !UDPCSUM";
72 static const char dev_cmd_flag_2[] = "flag nonsense";
73 static const char dev_cmd_dst_min_0[] = "dst_min 101.102.103.104";
74 static const char dev_cmd_dst_0[] = "dst 101.102.103.104";
75 static const char dev_cmd_dst_max_0[] = "dst_max 201.202.203.204";
76 static const char dev_cmd_dst6_0[] = "dst6 2001:db38:1234:0000:0000:0000:0000:0000";
77 static const char dev_cmd_dst6_min_0[] = "dst6_min 2001:db8:1234:0000:0000:0000:0000:0000";
78 static const char dev_cmd_dst6_max_0[] = "dst6_max 2001:db8:1234:0000:0000:0000:0000:0000";
79 static const char dev_cmd_src6_0[] = "src6 2001:db38:1234:0000:0000:0000:0000:0000";
80 static const char dev_cmd_src_min_0[] = "src_min 101.102.103.104";
81 static const char dev_cmd_src_max_0[] = "src_max 201.202.203.204";
82 static const char dev_cmd_dst_mac_0[] = "dst_mac 01:02:03:04:05:06";
83 static const char dev_cmd_src_mac_0[] = "src_mac 11:12:13:14:15:16";
84 static const char dev_cmd_clear_counters_0[] = "clear_counters";
85 static const char dev_cmd_flows_0[] = "flows 100";
86 static const char dev_cmd_spi_0[] = "spi 100";
87 static const char dev_cmd_flowlen_0[] = "flowlen 100";
88 static const char dev_cmd_queue_map_min_0[] = "queue_map_min 1";
89 static const char dev_cmd_queue_map_max_0[] = "queue_map_max 2";
90 static const char dev_cmd_mpls_0[] = "mpls 00000001";
91 static const char dev_cmd_mpls_1[] = "mpls 00000001,000000f2";
92 static const char dev_cmd_mpls_2[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f";
93 static const char dev_cmd_mpls_3[] = "mpls 00000f00,00000f01,00000f02,00000f03,00000f04,00000f05,00000f06,00000f07,00000f08,00000f09,00000f0a,00000f0b,00000f0c,00000f0d,00000f0e,00000f0f,00000f10";
94 static const char dev_cmd_vlan_id_0[] = "vlan_id 1";
95 static const char dev_cmd_vlan_p_0[] = "vlan_p 1";
96 static const char dev_cmd_vlan_cfi_0[] = "vlan_cfi 1";
97 static const char dev_cmd_vlan_id_1[] = "vlan_id 4096";
98 static const char dev_cmd_svlan_id_0[] = "svlan_id 1";
99 static const char dev_cmd_svlan_p_0[] = "svlan_p 1";
100 static const char dev_cmd_svlan_cfi_0[] = "svlan_cfi 1";
101 static const char dev_cmd_svlan_id_1[] = "svlan_id 4096";
102 static const char dev_cmd_tos_0[] = "tos 0";
103 static const char dev_cmd_tos_1[] = "tos 0f";
104 static const char dev_cmd_tos_2[] = "tos 0ff";
105 static const char dev_cmd_traffic_class_0[] = "traffic_class f0";
106 static const char dev_cmd_skb_priority_0[] = "skb_priority 999";
107 
FIXTURE(proc_net_pktgen)108 FIXTURE(proc_net_pktgen) {
109 	int ctrl_fd;
110 	int thr_fd;
111 	int dev_fd;
112 };
113 
FIXTURE_SETUP(proc_net_pktgen)114 FIXTURE_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 
FIXTURE_TEARDOWN(proc_net_pktgen)134 FIXTURE_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 
TEST_F(proc_net_pktgen,wrong_ctrl_cmd)151 TEST_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 
TEST_F(proc_net_pktgen,ctrl_cmd)161 TEST_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 
TEST_F(proc_net_pktgen,wrong_thr_cmd)183 TEST_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 
TEST_F(proc_net_pktgen,legacy_thr_cmd)193 TEST_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 
TEST_F(proc_net_pktgen,wrong_dev_cmd)209 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_min_pkt_size)219 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_max_pkt_size)265 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_pkt_size)272 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_imix_weights)279 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_debug)333 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_frags)345 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_delay)352 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_rate)362 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_ratep)373 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_udp_src_min)384 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_udp_dst_min)391 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_udp_src_max)398 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_udp_dst_max)405 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_clone_skb)412 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_count)425 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_src_mac_count)432 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst_mac_count)439 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_burst)446 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_node)454 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_xmit_mode)461 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_flag)477 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst_min)493 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst)500 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst_max)507 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst6)514 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst6_min)521 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst6_max)528 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_src6)535 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_src_min)542 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_src_max)549 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_dst_mac)556 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_src_mac)563 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_clear_counters)570 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_flows)577 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_spi)584 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_flowlen)591 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_queue_map_min)598 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_queue_map_max)605 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_mpls)612 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_vlan_id)629 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_svlan_id)645 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_tos)662 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_traffic_class)676 TEST_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 
TEST_F(proc_net_pktgen,dev_cmd_skb_priority)683 TEST_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 
690 TEST_HARNESS_MAIN
691