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