test-netfilter.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * QTest testcase for netfilter
  3. *
  4. * Copyright (c) 2015 FUJITSU LIMITED
  5. * Author: Yang Hongyang <yanghy@cn.fujitsu.com>
  6. *
  7. * This work is licensed under the terms of the GNU GPL, version 2 or
  8. * later. See the COPYING file in the top-level directory.
  9. */
  10. #include "qemu/osdep.h"
  11. #include "libqtest-single.h"
  12. #include "qapi/qmp/qdict.h"
  13. /* add a netfilter to a netdev and then remove it */
  14. static void add_one_netfilter(void)
  15. {
  16. QDict *response;
  17. response = qmp("{'execute': 'object-add',"
  18. " 'arguments': {"
  19. " 'qom-type': 'filter-buffer',"
  20. " 'id': 'qtest-f0',"
  21. " 'props': {"
  22. " 'netdev': 'qtest-bn0',"
  23. " 'queue': 'rx',"
  24. " 'interval': 1000"
  25. "}}}");
  26. g_assert(response);
  27. g_assert(!qdict_haskey(response, "error"));
  28. qobject_unref(response);
  29. response = qmp("{'execute': 'object-del',"
  30. " 'arguments': {"
  31. " 'id': 'qtest-f0'"
  32. "}}");
  33. g_assert(response);
  34. g_assert(!qdict_haskey(response, "error"));
  35. qobject_unref(response);
  36. }
  37. /* add a netfilter to a netdev and then remove the netdev */
  38. static void remove_netdev_with_one_netfilter(void)
  39. {
  40. QDict *response;
  41. response = qmp("{'execute': 'object-add',"
  42. " 'arguments': {"
  43. " 'qom-type': 'filter-buffer',"
  44. " 'id': 'qtest-f0',"
  45. " 'props': {"
  46. " 'netdev': 'qtest-bn0',"
  47. " 'queue': 'rx',"
  48. " 'interval': 1000"
  49. "}}}");
  50. g_assert(response);
  51. g_assert(!qdict_haskey(response, "error"));
  52. qobject_unref(response);
  53. response = qmp("{'execute': 'netdev_del',"
  54. " 'arguments': {"
  55. " 'id': 'qtest-bn0'"
  56. "}}");
  57. g_assert(response);
  58. g_assert(!qdict_haskey(response, "error"));
  59. qobject_unref(response);
  60. /* add back the netdev */
  61. response = qmp("{'execute': 'netdev_add',"
  62. " 'arguments': {"
  63. " 'type': 'user',"
  64. " 'id': 'qtest-bn0'"
  65. "}}");
  66. g_assert(response);
  67. g_assert(!qdict_haskey(response, "error"));
  68. qobject_unref(response);
  69. }
  70. /* add multi(2) netfilters to a netdev and then remove them */
  71. static void add_multi_netfilter(void)
  72. {
  73. QDict *response;
  74. response = qmp("{'execute': 'object-add',"
  75. " 'arguments': {"
  76. " 'qom-type': 'filter-buffer',"
  77. " 'id': 'qtest-f0',"
  78. " 'props': {"
  79. " 'netdev': 'qtest-bn0',"
  80. " 'queue': 'rx',"
  81. " 'interval': 1000"
  82. "}}}");
  83. g_assert(response);
  84. g_assert(!qdict_haskey(response, "error"));
  85. qobject_unref(response);
  86. response = qmp("{'execute': 'object-add',"
  87. " 'arguments': {"
  88. " 'qom-type': 'filter-buffer',"
  89. " 'id': 'qtest-f1',"
  90. " 'props': {"
  91. " 'netdev': 'qtest-bn0',"
  92. " 'queue': 'rx',"
  93. " 'interval': 1000"
  94. "}}}");
  95. g_assert(response);
  96. g_assert(!qdict_haskey(response, "error"));
  97. qobject_unref(response);
  98. response = qmp("{'execute': 'object-del',"
  99. " 'arguments': {"
  100. " 'id': 'qtest-f0'"
  101. "}}");
  102. g_assert(response);
  103. g_assert(!qdict_haskey(response, "error"));
  104. qobject_unref(response);
  105. response = qmp("{'execute': 'object-del',"
  106. " 'arguments': {"
  107. " 'id': 'qtest-f1'"
  108. "}}");
  109. g_assert(response);
  110. g_assert(!qdict_haskey(response, "error"));
  111. qobject_unref(response);
  112. }
  113. /* add multi(2) netfilters to a netdev and then remove the netdev */
  114. static void remove_netdev_with_multi_netfilter(void)
  115. {
  116. QDict *response;
  117. response = qmp("{'execute': 'object-add',"
  118. " 'arguments': {"
  119. " 'qom-type': 'filter-buffer',"
  120. " 'id': 'qtest-f0',"
  121. " 'props': {"
  122. " 'netdev': 'qtest-bn0',"
  123. " 'queue': 'rx',"
  124. " 'interval': 1000"
  125. "}}}");
  126. g_assert(response);
  127. g_assert(!qdict_haskey(response, "error"));
  128. qobject_unref(response);
  129. response = qmp("{'execute': 'object-add',"
  130. " 'arguments': {"
  131. " 'qom-type': 'filter-buffer',"
  132. " 'id': 'qtest-f1',"
  133. " 'props': {"
  134. " 'netdev': 'qtest-bn0',"
  135. " 'queue': 'rx',"
  136. " 'interval': 1000"
  137. "}}}");
  138. g_assert(response);
  139. g_assert(!qdict_haskey(response, "error"));
  140. qobject_unref(response);
  141. response = qmp("{'execute': 'netdev_del',"
  142. " 'arguments': {"
  143. " 'id': 'qtest-bn0'"
  144. "}}");
  145. g_assert(response);
  146. g_assert(!qdict_haskey(response, "error"));
  147. qobject_unref(response);
  148. /* add back the netdev */
  149. response = qmp("{'execute': 'netdev_add',"
  150. " 'arguments': {"
  151. " 'type': 'user',"
  152. " 'id': 'qtest-bn0'"
  153. "}}");
  154. g_assert(response);
  155. g_assert(!qdict_haskey(response, "error"));
  156. qobject_unref(response);
  157. }
  158. int main(int argc, char **argv)
  159. {
  160. int ret;
  161. char *args;
  162. const char *devstr = "e1000";
  163. if (g_str_equal(qtest_get_arch(), "s390x")) {
  164. devstr = "virtio-net-ccw";
  165. }
  166. g_test_init(&argc, &argv, NULL);
  167. qtest_add_func("/netfilter/addremove_one", add_one_netfilter);
  168. qtest_add_func("/netfilter/remove_netdev_one",
  169. remove_netdev_with_one_netfilter);
  170. qtest_add_func("/netfilter/addremove_multi", add_multi_netfilter);
  171. qtest_add_func("/netfilter/remove_netdev_multi",
  172. remove_netdev_with_multi_netfilter);
  173. args = g_strdup_printf("-netdev user,id=qtest-bn0 "
  174. "-device %s,netdev=qtest-bn0", devstr);
  175. qtest_start(args);
  176. ret = g_test_run();
  177. qtest_end();
  178. g_free(args);
  179. return ret;
  180. }