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