Replaced to single rule from rule list 76/163776/1
authorhyunuktak <hyunuk.tak@samsung.com>
Wed, 13 Dec 2017 09:48:19 +0000 (18:48 +0900)
committerhyunuktak <hyunuk.tak@samsung.com>
Wed, 13 Dec 2017 09:48:46 +0000 (18:48 +0900)
Change-Id: Ie71dedbfd421149cdb3d9ee27f18b8f986ada7cc
Signed-off-by: hyunuktak <hyunuk.tak@samsung.com>
packaging/stc-iptables.spec
test/stc_ipt_chain.c
test/stc_ipt_rule.c
test/stc_ipt_rule.h
test/stc_ipt_test.c

index bc8be6e69839b6a673731e92fcb5636315a70ad1..653551f978a0041b93b9dda56f971e4b0a803ab3 100644 (file)
@@ -1,6 +1,6 @@
 Name:       stc-iptables
 Summary:    STC(Smart Traffic Control) iptables
-Version:    0.0.7
+Version:    0.0.8
 Release:    0
 Group:      Network & Connectivity/Other
 License:    GPL-2.0+
index ec0ed41d430f7a6ab64235614b70829424c19c90..bd58fb97022fc0cfa4fe143463a631c5512818f5 100755 (executable)
@@ -180,8 +180,8 @@ static int test_stc_ipt_remove_chain(MManager *mm, struct menu_data *menu)
 }
 
 struct menu_data menu_chain[] = {
-       { "1", LOG_LIGHTMAGENTA "[Set]" LOG_END " Chain Name", NULL, NULL, g_chain_name},
-       { "a", LOG_LIGHTBLUE "[Add]" LOG_END " Chain", NULL, test_stc_ipt_add_chain, NULL},
-       { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " Chain", NULL, test_stc_ipt_remove_chain, NULL},
+       { "1", LOG_LIGHTMAGENTA "[Set]" LOG_END " chain name", NULL, NULL, g_chain_name},
+       { "a", LOG_LIGHTBLUE "[Add]" LOG_END " chain", NULL, test_stc_ipt_add_chain, NULL},
+       { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " chain", NULL, test_stc_ipt_remove_chain, NULL},
        { NULL, NULL, },
 };
index 28e6c22daf9f1ae07096e2cfae55523380da91d0..166283639186874872230ec96d8c27fd965103e9 100755 (executable)
@@ -34,6 +34,7 @@
 
 #define TARGET_ACCEPT "ACCEPT"
 #define TARGET_DROP   "DROP"
+#define TARGET_RETURN "RETURN"
 
 #define RULE_CHAIN   "chain"
 #define RULE_TYPE    "type"
@@ -74,7 +75,7 @@ static char g_rule_cgroup[MENU_DATA_SIZE] = "0";
 static char g_rule_nfacct[MENU_DATA_SIZE] = "";
 static char g_rule_target[MENU_DATA_SIZE] = "0";
 
-static __thread GSList *g_rule_list = NULL;
+static ipt_rule_s *g_rule = NULL;
 
 static void __test_print_rule(ipt_rule_s *rule)
 {
@@ -93,118 +94,79 @@ static void __test_print_rule(ipt_rule_s *rule)
        msg(HR_SINGLE);
 }
 
-static int __test_append_rule_to_list(void)
+static void __test_rule_free(ipt_rule_s *rule)
 {
-       ipt_rule_s *rule;
+       FREE(rule->chain);
+       FREE(rule->ifname);
+       FREE(rule->nfacct_name);
+       FREE(rule->target);
+
+       FREE(rule);
+       rule = NULL;
+}
 
+static int __test_set_rule(void)
+{
        int type = (int)strtol(g_rule_type, NULL, 10);
        int classid = (int)strtol(g_rule_cgroup, NULL, 10);
        int target = (int)strtol(g_rule_target, NULL, 10);
 
        if (g_rule_chain[0] == '\0' ||
-               g_rule_ifname[0] == '\0' ||
-               g_rule_nfacct[0] == '\0' ||
                type < IPTABLES_RULE_IN ||
                type > IPTABLES_RULE_OUT ||
-               classid < 0 ||
                target < IPTABLES_ACTION_NONE ||
                target > IPTABLES_ACTION_DROP) {
                msg(LOG_RED "Invalid parameter" LOG_END);
                return STC_ERROR_INVALID_PARAMETER;
        }
 
-       rule = g_try_new0(ipt_rule_s, 1);
-       if (rule == NULL) {
+       if (g_rule)
+               __test_rule_free(g_rule);
+
+       g_rule = g_try_new0(ipt_rule_s, 1);
+       if (g_rule == NULL) {
                msg(LOG_RED "Out of memory" LOG_END);
                return STC_ERROR_OUT_OF_MEMORY;
        }
 
-       memset(rule, 0, sizeof(ipt_rule_s));
-       rule->chain = g_strdup(g_rule_chain);
-       rule->type = type;
-       rule->ifname = g_strdup(g_rule_ifname);
-       rule->classid = classid;
-       rule->nfacct_name = g_strdup(g_rule_nfacct);
+       memset(g_rule, 0, sizeof(ipt_rule_s));
+       g_rule->chain = g_strdup(g_rule_chain);
+       g_rule->type = type;
+       if (g_rule_ifname[0] != '\0')
+               g_rule->ifname = g_strdup(g_rule_ifname);
+       if (classid > 0)
+               g_rule->classid = classid;
+       if (g_rule_nfacct[0] != '\0')
+               g_rule->nfacct_name = g_strdup(g_rule_nfacct);
 
        switch (target) {
        case IPTABLES_ACTION_ACCEPT:
-               rule->target = g_strdup(TARGET_ACCEPT);
+               g_rule->target = g_strdup(TARGET_ACCEPT);
                break;
        case IPTABLES_ACTION_DROP:
-               rule->target = g_strdup(TARGET_DROP);
+               g_rule->target = g_strdup(TARGET_DROP);
                break;
        default:
-               rule->target = NULL;
+               g_rule->target = g_strdup(TARGET_RETURN);;
                break;
        }
 
-       g_rule_list = g_slist_append(g_rule_list, rule);
-       __test_print_rule(rule);
-
        return STC_ERROR_NONE;
 }
 
-static void __test_get_rule_list(void)
-{
-       GSList *list;
-
-       for (list = g_rule_list; list; list = list->next) {
-               ipt_rule_s *rule = (ipt_rule_s *)list->data;
-               __test_print_rule(rule);
-       }
-}
-
-static void __test_list_free_func(gpointer data)
-{
-       ipt_rule_s *rule = (ipt_rule_s *)data;
-
-       FREE(rule->chain);
-       FREE(rule->ifname);
-       FREE(rule->nfacct_name);
-       FREE(rule->target);
-       FREE(rule);
-}
-
-static void __test_remove_rule_list(void)
-{
-       if (g_rule_list != NULL)
-               g_slist_free_full(g_rule_list, __test_list_free_func);
-
-       g_rule_list = NULL;
-}
-
-static int test_stc_ipt_add_rule(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_set_rule(MManager *mm, struct menu_data *menu)
 {
        int ret = STC_ERROR_NONE;
 
-       ret = __test_append_rule_to_list();
+       ret = __test_set_rule();
        if (ret != STC_ERROR_NONE) {
                msg(LOG_RED "Failed to add rule to list" LOG_END);
                return ret;
        }
 
-       msg(LOG_GREEN "Successfully add rule" LOG_END);
-
-       return ret;
-}
-
-static int test_stc_ipt_get_rules(MManager *mm, struct menu_data *menu)
-{
-       int ret = STC_ERROR_NONE;
-
-       __test_get_rule_list();
-       msg(LOG_GREEN "Successfully get rule" LOG_END);
-
-       return ret;
-}
-
-static int test_stc_ipt_reset_rules(MManager *mm, struct menu_data *menu)
-{
-       int ret = STC_ERROR_NONE;
-
-       __test_remove_rule_list();
-       msg(LOG_GREEN "Successfully reset rule" LOG_END);
+       __test_print_rule(g_rule);
 
+       msg(LOG_GREEN "Successfully add rule" LOG_END);
        return ret;
 }
 
@@ -217,13 +179,16 @@ static void __test_add_rule_info_to_builder(GVariantBuilder *builder,
        g_variant_builder_add(builder, "{sv}", RULE_TYPE,
                                g_variant_new_uint32(rule->type));
 
-       g_variant_builder_add(builder, "{sv}", RULE_IFNAME,
+       if (rule->ifname)
+               g_variant_builder_add(builder, "{sv}", RULE_IFNAME,
                                g_variant_new_string(rule->ifname));
 
-       g_variant_builder_add(builder, "{sv}", RULE_CGROUP,
+       if (rule->classid > 0)
+               g_variant_builder_add(builder, "{sv}", RULE_CGROUP,
                                g_variant_new_uint32(rule->classid));
 
-       g_variant_builder_add(builder, "{sv}", RULE_NFACCT,
+       if (rule->nfacct_name)
+               g_variant_builder_add(builder, "{sv}", RULE_NFACCT,
                                g_variant_new_string(rule->nfacct_name));
 
        if (rule->target)
@@ -232,53 +197,19 @@ static void __test_add_rule_info_to_builder(GVariantBuilder *builder,
 
 }
 
-static int __test_make_rule_params(GVariantBuilder *builder,
-                       ipt_rule_s *rule)
-{
-       GVariantBuilder sub_builder;
-
-       if (builder == NULL || rule == NULL)
-               return STC_ERROR_INVALID_PARAMETER;
-
-       g_variant_builder_init(&sub_builder, G_VARIANT_TYPE("a{sv}"));
-       __test_add_rule_info_to_builder(&sub_builder, rule);
-       __test_print_rule(rule);
-       g_variant_builder_add_value(builder, g_variant_builder_end(&sub_builder));
-
-       return STC_ERROR_NONE;
-}
-
-static int __stc_ipt_add_rules(void)
+static int __stc_ipt_add_rule(void)
 {
        int err = STC_ERROR_NONE;
-       int len = 0;
        int result = 0;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GVariant *message = NULL;
-       GSList *list;
-
-       len = g_slist_length(g_rule_list);
-       if (len == 0) {
-               msg(LOG_RED "There are no rules" LOG_END);
-               return STC_ERROR_INVALID_OPERATION;
-       }
-
-       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
-       for (list = g_rule_list; list; list = list->next) {
-               ipt_rule_s *rule = (ipt_rule_s *)list->data;
-               err = __test_make_rule_params(builder, rule);
-               if (err != STC_ERROR_NONE) {
-                       g_variant_builder_unref(builder);
-                       return err;
-               }
-       }
 
-       params = g_variant_new("(aa{sv})", builder);
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       __test_add_rule_info_to_builder(builder, g_rule);
+       params = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
 
-       err = STC_ERROR_NONE;
        message = stc_ipt_dbus_invoke_method(
                        STC_IPT_DBUS_SERVICE,
                        STC_IPT_DBUS_RULE_PATH,
@@ -301,37 +232,19 @@ static int __stc_ipt_add_rules(void)
        return STC_ERROR_NONE;
 }
 
-static int __stc_ip6t_add_rules(void)
+static int __stc_ip6t_add_rule(void)
 {
        int err = STC_ERROR_NONE;
-       int len = 0;
        int result = 0;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GVariant *message = NULL;
-       GSList *list;
-
-       len = g_slist_length(g_rule_list);
-       if (len == 0) {
-               msg(LOG_RED "There are no rules" LOG_END);
-               return STC_ERROR_INVALID_OPERATION;
-       }
-
-       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
-       for (list = g_rule_list; list; list = list->next) {
-               ipt_rule_s *rule = (ipt_rule_s *)list->data;
-               err = __test_make_rule_params(builder, rule);
-               if (err != STC_ERROR_NONE) {
-                       g_variant_builder_unref(builder);
-                       return err;
-               }
-       }
 
-       params = g_variant_new("(aa{sv})", builder);
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       __test_add_rule_info_to_builder(builder, g_rule);
+       params = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
 
-       err = STC_ERROR_NONE;
        message = stc_ipt_dbus_invoke_method(
                        STC_IPT_DBUS_SERVICE,
                        STC_IPT_DBUS_RULE_PATH,
@@ -355,37 +268,19 @@ static int __stc_ip6t_add_rules(void)
 }
 
 
-static int __stc_ipt_remove_rules(void)
+static int __stc_ipt_remove_rule(void)
 {
        int err = STC_ERROR_NONE;
-       int len = 0;
        int result = 0;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GVariant *message = NULL;
-       GSList *list;
-
-       len = g_slist_length(g_rule_list);
-       if (len == 0) {
-               msg(LOG_RED "There are no rules" LOG_END);
-               return STC_ERROR_INVALID_OPERATION;
-       }
-
-       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
 
-       for (list = g_rule_list; list; list = list->next) {
-               ipt_rule_s *rule = (ipt_rule_s *)list->data;
-               err = __test_make_rule_params(builder, rule);
-               if (err != STC_ERROR_NONE) {
-                       g_variant_builder_unref(builder);
-                       return err;
-               }
-       }
-
-       params = g_variant_new("(aa{sv})", builder);
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       __test_add_rule_info_to_builder(builder, g_rule);
+       params = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
 
-       err = STC_ERROR_NONE;
        message = stc_ipt_dbus_invoke_method(
                        STC_IPT_DBUS_SERVICE,
                        STC_IPT_DBUS_RULE_PATH,
@@ -408,34 +303,17 @@ static int __stc_ipt_remove_rules(void)
        return STC_ERROR_NONE;
 }
 
-static int __stc_ip6t_remove_rules(void)
+static int __stc_ip6t_remove_rule(void)
 {
        int err = STC_ERROR_NONE;
-       int len = 0;
        int result = 0;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GVariant *message = NULL;
-       GSList *list;
-
-       len = g_slist_length(g_rule_list);
-       if (len == 0) {
-               msg(LOG_RED "There are no rules" LOG_END);
-               return STC_ERROR_INVALID_OPERATION;
-       }
 
-       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
-
-       for (list = g_rule_list; list; list = list->next) {
-               ipt_rule_s *rule = (ipt_rule_s *)list->data;
-               err = __test_make_rule_params(builder, rule);
-               if (err != STC_ERROR_NONE) {
-                       g_variant_builder_unref(builder);
-                       return err;
-               }
-       }
-
-       params = g_variant_new("(aa{sv})", builder);
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       __test_add_rule_info_to_builder(builder, g_rule);
+       params = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
 
        err = STC_ERROR_NONE;
@@ -461,39 +339,40 @@ static int __stc_ip6t_remove_rules(void)
        return STC_ERROR_NONE;
 }
 
-static int test_stc_ipt_add_rules(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_add_rule(MManager *mm, struct menu_data *menu)
 {
        int err = STC_ERROR_NONE;
 
-       err = __stc_ipt_add_rules();
+       err = __stc_ipt_add_rule();
        if (err != STC_ERROR_NONE)
-               msg(LOG_RED "Failed to add rules" LOG_END);
+               msg(LOG_RED "Failed to add rule" LOG_END);
 
-       err = __stc_ip6t_add_rules();
+       err = __stc_ip6t_add_rule();
        if (err != STC_ERROR_NONE)
-               msg(LOG_RED "Failed to add 6 rules" LOG_END);
+               msg(LOG_RED "Failed to add 6 rule" LOG_END);
 
        return err;
 }
 
-static int test_stc_ipt_remove_rules(MManager *mm, struct menu_data *menu)
+static int test_stc_ipt_remove_rule(MManager *mm, struct menu_data *menu)
 {
        int err = STC_ERROR_NONE;
 
-       err = __stc_ipt_remove_rules();
+       err = __stc_ipt_remove_rule();
        if (err != STC_ERROR_NONE)
-               msg(LOG_RED "Failed to remove rules" LOG_END);
+               msg(LOG_RED "Failed to remove rule" LOG_END);
 
-       err = __stc_ip6t_remove_rules();
+       err = __stc_ip6t_remove_rule();
        if (err != STC_ERROR_NONE)
-               msg(LOG_RED "Failed to remove 6 rules" LOG_END);
+               msg(LOG_RED "Failed to remove 6 rule" LOG_END);
 
        return err;
 }
 
-int test_stc_ipt_clear_rule_list(void)
+int test_stc_ipt_clear_rule(void)
 {
-       __test_remove_rule_list();
+       if (g_rule)
+               __test_rule_free(g_rule);
 }
 
 static struct menu_data menu_set[] = {
@@ -503,15 +382,13 @@ static struct menu_data menu_set[] = {
        { "4", "cgroup classid", NULL, NULL, g_rule_cgroup},
        { "5", "nfacct name", NULL, NULL, g_rule_nfacct},
        { "6", "target (0.NONE/1.ACCEPT/2.DROP)", NULL, NULL, g_rule_target},
-       { "a", LOG_LIGHTBLUE "[Add]" LOG_END " rule to list", NULL, test_stc_ipt_add_rule, NULL},
+       { "s", LOG_LIGHTBLUE "[Set]" LOG_END " rule", NULL, test_stc_ipt_set_rule, NULL},
        { NULL, NULL, },
 };
 
 struct menu_data menu_rule[] = {
-       { "1", LOG_LIGHTBLUE "[Set]" LOG_END " rule list", menu_set, NULL, NULL},
-       { "2", LOG_LIGHTBLUE "[Get]" LOG_END " rule list", NULL, test_stc_ipt_get_rules, NULL},
-       { "3", LOG_LIGHTBLUE "[Reset]" LOG_END " rule list", NULL, test_stc_ipt_reset_rules, NULL},
-       { "a", LOG_LIGHTMAGENTA "[Add]" LOG_END " rules", NULL, test_stc_ipt_add_rules, NULL},
-       { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " rules", NULL, test_stc_ipt_remove_rules, NULL},
+       { "1", LOG_LIGHTMAGENTA "[Set]" LOG_END " rule info", menu_set, NULL, NULL},
+       { "a", LOG_LIGHTBLUE "[Add]" LOG_END " rule", NULL, test_stc_ipt_add_rule, NULL},
+       { "r", LOG_LIGHTMAGENTA "[Remove]" LOG_END " rule", NULL, test_stc_ipt_remove_rule, NULL},
        { NULL, NULL, },
 };
index 51ef0e3de885140a85aafdb5075b634841018fd1..0ec3e98ee7f52dc7b08474ebdb5626054b4bdfaf 100755 (executable)
@@ -17,6 +17,6 @@
 #ifndef __TEST_STC_IPT_RULE_H__
 #define __TEST_STC_IPT_RULE_H__
 
-int test_stc_ipt_clear_rule_list(void);
+int test_stc_ipt_clear_rule(void);
 
 #endif /** __TEST_STC_IPT_RULE_H__ */
index 2bf2ae00d777cdeb0576782ac11950721d4141ea..15d834298b4a4816586a8f5d4e26181377eb1e17 100755 (executable)
@@ -73,7 +73,7 @@ static int __test_stc_ipt_deinitialize(void)
        GDBusConnection *conn;
        int ret = STC_ERROR_NONE;
 
-       test_stc_ipt_clear_rule_list();
+       test_stc_ipt_clear_rule();
 
        conn = stc_ipt_dbus_get_connection();
        if (conn == NULL) {