2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "stc-iptables-util.h"
21 #include "helper-iptables.h"
22 #include "helper-ip6tables.h"
24 #define STC_IPTABLES_DBUS_ERROR_NAME "net.stc.iptables.Error.Failed"
26 #define STC_IPTABLES_DBUS_REPLY(invocation, parameters) \
27 g_dbus_method_invocation_return_value((invocation), parameters);
29 #define STC_IPTABLES_DBUS_REPLY_ERROR(invocation, err_num) \
30 g_dbus_method_invocation_return_dbus_error((invocation), \
31 STC_IPTABLES_DBUS_ERROR_NAME, \
32 stc_iptables_err_strs[-(err_num)])
34 static const gchar *stc_iptables_err_strs[] = {
45 void __stc_extract_rule(const char *key, GVariant *value,
48 iptables_rule_s *rule = (iptables_rule_s *)user_data;
52 if (!g_strcmp0(key, "chain")) {
54 rule->chain = g_variant_dup_string(value, &len);
55 STC_LOGD("chain: [%s]", rule->chain);
57 } else if (!g_strcmp0(key, "type")) {
58 rule->type = g_variant_get_uint32(value);
59 STC_LOGD("type: [%d]", rule->type);
61 } else if (!g_strcmp0(key, "ifname")) {
63 rule->ifname = g_variant_dup_string(value, &len);
64 STC_LOGD("ifname: [%s]", rule->ifname);
66 } else if (!g_strcmp0(key, "cgroup")) {
67 rule->classid = g_variant_get_uint32(value);
68 STC_LOGD("classid: [%d]", rule->classid);
70 } else if (!g_strcmp0(key, "nfacct")) {
72 rule->nfacct_name = g_variant_dup_string(value, &len);
73 STC_LOGD("nfacct_name: [%s]", rule->nfacct_name);
75 } else if (!g_strcmp0(key, "target")) {
77 rule->target = g_variant_dup_string(value, &len);
78 STC_LOGD("target: [%s]", rule->target);
81 STC_LOGD("Unknown rule");
85 void __stc_extract_6_rule(const char *key, GVariant *value,
88 ip6tables_rule_s *rule = (ip6tables_rule_s *)user_data;
92 if (!g_strcmp0(key, "chain")) {
94 rule->chain = g_variant_dup_string(value, &len);
95 STC_LOGD("chain: [%s]", rule->chain);
97 } else if (!g_strcmp0(key, "type")) {
98 rule->type = g_variant_get_uint32(value);
99 STC_LOGD("type: [%d]", rule->type);
101 } else if (!g_strcmp0(key, "ifname")) {
103 rule->ifname = g_variant_dup_string(value, &len);
104 STC_LOGD("ifname: [%s]", rule->ifname);
106 } else if (!g_strcmp0(key, "cgroup")) {
107 rule->classid = g_variant_get_uint32(value);
108 STC_LOGD("classid: [%d]", rule->classid);
110 } else if (!g_strcmp0(key, "nfacct")) {
112 rule->nfacct_name = g_variant_dup_string(value, &len);
113 STC_LOGD("nfacct_name: [%s]", rule->nfacct_name);
115 } else if (!g_strcmp0(key, "target")) {
117 rule->target = g_variant_dup_string(value, &len);
118 STC_LOGD("target: [%s]", rule->target);
121 STC_LOGD("Unknown rule");
125 gboolean handle_iptables_add_rule(StcRule *object,
126 GDBusMethodInvocation *invocation,
130 __STC_LOG_FUNC_ENTER__;
131 stc_error_e ret = STC_ERROR_NONE;
132 GVariant *return_parameters = NULL;
135 GVariantIter *iter = NULL;
136 GVariantIter *iter_row = NULL;
138 g_variant_get(rules, "aa{sv}", &iter);
140 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
141 iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
143 memset(rule, 0, sizeof(iptables_rule_s));
145 stc_iptables_gdbus_dict_foreach(iter_row,
149 ret = iptables_add_rule(rule);
150 if (ret != STC_ERROR_NONE) {
151 STC_LOGE("Failed add rule [%s:%d:%s:%d:%s:%s]", rule->chain,
152 rule->type, rule->ifname, rule->classid,
153 rule->nfacct_name, rule->target);
158 FREE(rule->nfacct_name);
162 g_variant_iter_free(iter_row);
164 g_variant_iter_free(iter);
166 STC_IPTABLES_DBUS_REPLY_ERROR(invocation,
167 STC_ERROR_INVALID_PARAMETER);
168 __STC_LOG_FUNC_EXIT__;
172 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
174 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
175 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
177 __STC_LOG_FUNC_EXIT__;
181 gboolean handle_iptables_remove_rule(StcRule *object,
182 GDBusMethodInvocation *invocation,
186 __STC_LOG_FUNC_ENTER__;
187 stc_error_e ret = STC_ERROR_NONE;
188 GVariant *return_parameters = NULL;
191 GVariantIter *iter = NULL;
192 GVariantIter *iter_row = NULL;
193 g_variant_get(rules, "aa{sv}", &iter);
195 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
196 iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
198 memset(rule, 0, sizeof(iptables_rule_s));
200 stc_iptables_gdbus_dict_foreach(iter_row,
204 ret = iptables_remove_rule(rule);
205 if (ret != STC_ERROR_NONE) {
206 STC_LOGE("Failed remove rule [%s:%d:%s:%d:%s:%s]", rule->chain,
207 rule->type, rule->ifname, rule->classid,
208 rule->nfacct_name, rule->target);
213 FREE(rule->nfacct_name);
217 g_variant_iter_free(iter_row);
219 g_variant_iter_free(iter);
221 STC_IPTABLES_DBUS_REPLY_ERROR(invocation,
222 STC_ERROR_INVALID_PARAMETER);
223 __STC_LOG_FUNC_EXIT__;
227 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
229 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
230 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
232 __STC_LOG_FUNC_EXIT__;
236 gboolean handle_iptables_add_chain(StcChain *object,
237 GDBusMethodInvocation *invocation,
241 __STC_LOG_FUNC_ENTER__;
242 stc_error_e ret = STC_ERROR_NONE;
243 GVariant *return_parameters = NULL;
245 ret = iptables_add_chain(chain);
246 if (ret < STC_ERROR_NONE) {
247 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
248 __STC_LOG_FUNC_EXIT__;
252 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
254 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
255 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
257 __STC_LOG_FUNC_EXIT__;
261 gboolean handle_iptables_remove_chain(StcChain *object,
262 GDBusMethodInvocation *invocation,
266 __STC_LOG_FUNC_ENTER__;
267 stc_error_e ret = STC_ERROR_NONE;
268 GVariant *return_parameters = NULL;
270 ret = iptables_remove_chain(chain);
271 if (ret < STC_ERROR_NONE) {
272 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
273 __STC_LOG_FUNC_EXIT__;
277 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
279 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
280 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
282 __STC_LOG_FUNC_EXIT__;
286 gboolean handle_ip6tables_add_rule(StcRule *object,
287 GDBusMethodInvocation *invocation,
291 __STC_LOG_FUNC_ENTER__;
292 stc_error_e ret = STC_ERROR_NONE;
293 GVariant *return_parameters = NULL;
296 GVariantIter *iter = NULL;
297 GVariantIter *iter_row = NULL;
299 g_variant_get(rules, "aa{sv}", &iter);
301 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
302 ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
304 memset(rule, 0, sizeof(ip6tables_rule_s));
306 stc_iptables_gdbus_dict_foreach(iter_row,
307 __stc_extract_6_rule,
310 ret = ip6tables_add_rule(rule);
311 if (ret != STC_ERROR_NONE) {
312 STC_LOGE("Failed add rule [%s:%d:%s:%d:%s:%s]", rule->chain,
313 rule->type, rule->ifname, rule->classid,
314 rule->nfacct_name, rule->target);
319 FREE(rule->nfacct_name);
323 g_variant_iter_free(iter_row);
325 g_variant_iter_free(iter);
327 STC_IPTABLES_DBUS_REPLY_ERROR(invocation,
328 STC_ERROR_INVALID_PARAMETER);
329 __STC_LOG_FUNC_EXIT__;
333 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
335 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
336 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
338 __STC_LOG_FUNC_EXIT__;
342 gboolean handle_ip6tables_remove_rule(StcRule *object,
343 GDBusMethodInvocation *invocation,
347 __STC_LOG_FUNC_ENTER__;
348 stc_error_e ret = STC_ERROR_NONE;
349 GVariant *return_parameters = NULL;
352 GVariantIter *iter = NULL;
353 GVariantIter *iter_row = NULL;
354 g_variant_get(rules, "aa{sv}", &iter);
356 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
357 ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
359 memset(rule, 0, sizeof(ip6tables_rule_s));
361 stc_iptables_gdbus_dict_foreach(iter_row,
362 __stc_extract_6_rule,
365 ret = ip6tables_remove_rule(rule);
366 if (ret != STC_ERROR_NONE) {
367 STC_LOGE("Failed remove rule [%s:%d:%s:%d:%s:%s]", rule->chain,
368 rule->type, rule->ifname, rule->classid,
369 rule->nfacct_name, rule->target);
374 FREE(rule->nfacct_name);
378 g_variant_iter_free(iter_row);
380 g_variant_iter_free(iter);
382 STC_IPTABLES_DBUS_REPLY_ERROR(invocation,
383 STC_ERROR_INVALID_PARAMETER);
384 __STC_LOG_FUNC_EXIT__;
388 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
390 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
391 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
393 __STC_LOG_FUNC_EXIT__;
397 gboolean handle_ip6tables_add_chain(StcChain *object,
398 GDBusMethodInvocation *invocation,
402 __STC_LOG_FUNC_ENTER__;
403 stc_error_e ret = STC_ERROR_NONE;
404 GVariant *return_parameters = NULL;
406 ret = ip6tables_add_chain(chain);
407 if (ret < STC_ERROR_NONE) {
408 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
409 __STC_LOG_FUNC_EXIT__;
413 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
415 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
416 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
418 __STC_LOG_FUNC_EXIT__;
422 gboolean handle_ip6tables_remove_chain(StcChain *object,
423 GDBusMethodInvocation *invocation,
427 __STC_LOG_FUNC_ENTER__;
428 stc_error_e ret = STC_ERROR_NONE;
429 GVariant *return_parameters = NULL;
431 ret = ip6tables_remove_chain(chain);
432 if (ret < STC_ERROR_NONE) {
433 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
434 __STC_LOG_FUNC_EXIT__;
438 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
440 STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
441 STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
443 __STC_LOG_FUNC_EXIT__;