proc_net_pktgen.c 23 KB

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