test-netfilter.c (6203B)
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 */ 16static 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 */ 43static 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 */ 80static 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 */ 128static 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 177int main(int argc, char **argv) 178{ 179 int ret; 180 char *args; 181 const char *devstr = "e1000"; 182 183 if (g_str_equal(qtest_get_arch(), "s390x")) { 184 devstr = "virtio-net-ccw"; 185 } 186 187 g_test_init(&argc, &argv, NULL); 188 qtest_add_func("/netfilter/addremove_one", add_one_netfilter); 189 qtest_add_func("/netfilter/remove_netdev_one", 190 remove_netdev_with_one_netfilter); 191 qtest_add_func("/netfilter/addremove_multi", add_multi_netfilter); 192 qtest_add_func("/netfilter/remove_netdev_multi", 193 remove_netdev_with_multi_netfilter); 194 195 args = g_strdup_printf("-netdev user,id=qtest-bn0 " 196 "-device %s,netdev=qtest-bn0", devstr); 197 qtest_start(args); 198 ret = g_test_run(); 199 200 qtest_end(); 201 g_free(args); 202 203 return ret; 204}