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 11 #include "qemu/osdep.h" 12 #include "libqtest-single.h" 13 #include "qapi/qmp/qdict.h" 14 15 /* add a netfilter to a netdev and then remove it */ 16 static void add_one_netfilter(void) 17 { 18 QDict *response; 19 20 response = qmp("{'execute': 'object-add'," 21 " 'arguments': {" 22 " 'qom-type': 'filter-buffer'," 23 " 'id': 'qtest-f0'," 24 " 'netdev': 'qtest-bn0'," 25 " 'queue': 'rx'," 26 " 'interval': 1000" 27 "}}"); 28 29 g_assert(response); 30 g_assert(!qdict_haskey(response, "error")); 31 qobject_unref(response); 32 33 response = qmp("{'execute': 'object-del'," 34 " 'arguments': {" 35 " 'id': 'qtest-f0'" 36 "}}"); 37 g_assert(response); 38 g_assert(!qdict_haskey(response, "error")); 39 qobject_unref(response); 40 } 41 42 /* add a netfilter to a netdev and then remove the netdev */ 43 static void remove_netdev_with_one_netfilter(void) 44 { 45 QDict *response; 46 47 response = qmp("{'execute': 'object-add'," 48 " 'arguments': {" 49 " 'qom-type': 'filter-buffer'," 50 " 'id': 'qtest-f0'," 51 " 'netdev': 'qtest-bn0'," 52 " 'queue': 'rx'," 53 " 'interval': 1000" 54 "}}"); 55 56 g_assert(response); 57 g_assert(!qdict_haskey(response, "error")); 58 qobject_unref(response); 59 60 response = qmp("{'execute': 'netdev_del'," 61 " 'arguments': {" 62 " 'id': 'qtest-bn0'" 63 "}}"); 64 g_assert(response); 65 g_assert(!qdict_haskey(response, "error")); 66 qobject_unref(response); 67 68 /* add back the netdev */ 69 response = qmp("{'execute': 'netdev_add'," 70 " 'arguments': {" 71 " 'type': 'user'," 72 " 'id': 'qtest-bn0'" 73 "}}"); 74 g_assert(response); 75 g_assert(!qdict_haskey(response, "error")); 76 qobject_unref(response); 77 } 78 79 /* add multi(2) netfilters to a netdev and then remove them */ 80 static void add_multi_netfilter(void) 81 { 82 QDict *response; 83 84 response = qmp("{'execute': 'object-add'," 85 " 'arguments': {" 86 " 'qom-type': 'filter-buffer'," 87 " 'id': 'qtest-f0'," 88 " 'netdev': 'qtest-bn0'," 89 " 'queue': 'rx'," 90 " 'interval': 1000" 91 "}}"); 92 93 g_assert(response); 94 g_assert(!qdict_haskey(response, "error")); 95 qobject_unref(response); 96 97 response = qmp("{'execute': 'object-add'," 98 " 'arguments': {" 99 " 'qom-type': 'filter-buffer'," 100 " 'id': 'qtest-f1'," 101 " 'netdev': 'qtest-bn0'," 102 " 'queue': 'rx'," 103 " 'interval': 1000" 104 "}}"); 105 106 g_assert(response); 107 g_assert(!qdict_haskey(response, "error")); 108 qobject_unref(response); 109 110 response = qmp("{'execute': 'object-del'," 111 " 'arguments': {" 112 " 'id': 'qtest-f0'" 113 "}}"); 114 g_assert(response); 115 g_assert(!qdict_haskey(response, "error")); 116 qobject_unref(response); 117 118 response = qmp("{'execute': 'object-del'," 119 " 'arguments': {" 120 " 'id': 'qtest-f1'" 121 "}}"); 122 g_assert(response); 123 g_assert(!qdict_haskey(response, "error")); 124 qobject_unref(response); 125 } 126 127 /* add multi(2) netfilters to a netdev and then remove the netdev */ 128 static void remove_netdev_with_multi_netfilter(void) 129 { 130 QDict *response; 131 132 response = qmp("{'execute': 'object-add'," 133 " 'arguments': {" 134 " 'qom-type': 'filter-buffer'," 135 " 'id': 'qtest-f0'," 136 " 'netdev': 'qtest-bn0'," 137 " 'queue': 'rx'," 138 " 'interval': 1000" 139 "}}"); 140 141 g_assert(response); 142 g_assert(!qdict_haskey(response, "error")); 143 qobject_unref(response); 144 145 response = qmp("{'execute': 'object-add'," 146 " 'arguments': {" 147 " 'qom-type': 'filter-buffer'," 148 " 'id': 'qtest-f1'," 149 " 'netdev': 'qtest-bn0'," 150 " 'queue': 'rx'," 151 " 'interval': 1000" 152 "}}"); 153 154 g_assert(response); 155 g_assert(!qdict_haskey(response, "error")); 156 qobject_unref(response); 157 158 response = qmp("{'execute': 'netdev_del'," 159 " 'arguments': {" 160 " 'id': 'qtest-bn0'" 161 "}}"); 162 g_assert(response); 163 g_assert(!qdict_haskey(response, "error")); 164 qobject_unref(response); 165 166 /* add back the netdev */ 167 response = qmp("{'execute': 'netdev_add'," 168 " 'arguments': {" 169 " 'type': 'user'," 170 " 'id': 'qtest-bn0'" 171 "}}"); 172 g_assert(response); 173 g_assert(!qdict_haskey(response, "error")); 174 qobject_unref(response); 175 } 176 177 int main(int argc, char **argv) 178 { 179 int ret; 180 char *args; 181 182 g_test_init(&argc, &argv, NULL); 183 qtest_add_func("/netfilter/addremove_one", add_one_netfilter); 184 qtest_add_func("/netfilter/remove_netdev_one", 185 remove_netdev_with_one_netfilter); 186 qtest_add_func("/netfilter/addremove_multi", add_multi_netfilter); 187 qtest_add_func("/netfilter/remove_netdev_multi", 188 remove_netdev_with_multi_netfilter); 189 190 args = g_strdup_printf("-nic user,id=qtest-bn0"); 191 qtest_start(args); 192 ret = g_test_run(); 193 194 qtest_end(); 195 g_free(args); 196 197 return ret; 198 } 199