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