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 108 FIXTURE(proc_net_pktgen) { 109 int ctrl_fd; 110 int thr_fd; 111 int dev_fd; 112 }; 113 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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