xref: /openbmc/qemu/tests/qtest/test-netfilter.c (revision ad1a706f)
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     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 }
205