Add and remove restriction rule appropriately 55/201255/2 accepted/tizen/unified/20190325.070830 submit/tizen/20190322.054530
authorhyunuktak <hyunuk.tak@samsung.com>
Tue, 12 Mar 2019 01:22:49 +0000 (10:22 +0900)
committerhyunuktak <hyunuk.tak@samsung.com>
Tue, 12 Mar 2019 01:28:46 +0000 (10:28 +0900)
Change-Id: Icb7d614eb5b4197b05df880e91d59fe21b77b6c5
Signed-off-by: hyunuktak <hyunuk.tak@samsung.com>
plugin/monitor/stc-plugin-monitor-rstn.c

index 99951a2..365207c 100755 (executable)
 
 static void __print_rstn(stc_rstn_data_s *rstn_data)
 {
-       STC_LOGI("RstnID[%llu] AppID[%s] classid[%u] "
-               "iftype[%d] ifname[%s] rstn_state[%d] "
-               "rstn_type[%d] roaming[%d] subscriber_id[%s]",
-                rstn_data->restriction_id,
-                rstn_data->app_id, rstn_data->classid,
-                rstn_data->iftype, rstn_data->ifname,
-                rstn_data->rstn_state, rstn_data->rstn_type,
-                rstn_data->roaming, rstn_data->subscriber_id);
-       STC_LOGI("month_start_date[%d] limit[%lld] "
-               "warn_limit[%lld] monthly_limit[%lld] "
-               "weekly_limit[%lld] daily_limit[%lld] ",
-               rstn_data->month_start_date,
-               rstn_data->limit[STC_RSTN_LIMIT_TYPE_DATA],
-               rstn_data->limit[STC_RSTN_LIMIT_TYPE_DATA_WARN],
-               rstn_data->limit[STC_RSTN_LIMIT_TYPE_MONTHLY],
-               rstn_data->limit[STC_RSTN_LIMIT_TYPE_WEEKLY],
-               rstn_data->limit[STC_RSTN_LIMIT_TYPE_DAILY]);
-       STC_LOGI("data_counter[%lld] warn_counter[%lld] "
-               "monthly_counter[%lld] weekly_counter[%lld] "
-               "daily_counter[%lld]",
-               rstn_data->counter[STC_RSTN_LIMIT_TYPE_DATA],
-               rstn_data->counter[STC_RSTN_LIMIT_TYPE_DATA_WARN],
-               rstn_data->counter[STC_RSTN_LIMIT_TYPE_MONTHLY],
-               rstn_data->counter[STC_RSTN_LIMIT_TYPE_WEEKLY],
-               rstn_data->counter[STC_RSTN_LIMIT_TYPE_DAILY]);
+       if (STC_DEBUG_LOG && STC_RSTN_LOG) {
+               STC_LOGI("RstnID[%llu] AppID[%s] classid[%u] "
+                       "iftype[%d] ifname[%s] rstn_state[%d] "
+                       "rstn_type[%d] roaming[%d] subscriber_id[%s]",
+                        rstn_data->restriction_id,
+                        rstn_data->app_id, rstn_data->classid,
+                        rstn_data->iftype, rstn_data->ifname,
+                        rstn_data->rstn_state, rstn_data->rstn_type,
+                        rstn_data->roaming, rstn_data->subscriber_id);
+               STC_LOGI("month_start_date[%d] limit[%lld] "
+                       "warn_limit[%lld] monthly_limit[%lld] "
+                       "weekly_limit[%lld] daily_limit[%lld] ",
+                       rstn_data->month_start_date,
+                       rstn_data->limit[STC_RSTN_LIMIT_TYPE_DATA],
+                       rstn_data->limit[STC_RSTN_LIMIT_TYPE_DATA_WARN],
+                       rstn_data->limit[STC_RSTN_LIMIT_TYPE_MONTHLY],
+                       rstn_data->limit[STC_RSTN_LIMIT_TYPE_WEEKLY],
+                       rstn_data->limit[STC_RSTN_LIMIT_TYPE_DAILY]);
+               STC_LOGI("data_counter[%lld] warn_counter[%lld] "
+                       "monthly_counter[%lld] weekly_counter[%lld] "
+                       "daily_counter[%lld]",
+                       rstn_data->counter[STC_RSTN_LIMIT_TYPE_DATA],
+                       rstn_data->counter[STC_RSTN_LIMIT_TYPE_DATA_WARN],
+                       rstn_data->counter[STC_RSTN_LIMIT_TYPE_MONTHLY],
+                       rstn_data->counter[STC_RSTN_LIMIT_TYPE_WEEKLY],
+                       rstn_data->counter[STC_RSTN_LIMIT_TYPE_DAILY]);
+       }
 }
 
 static int __vconf_get_int(const char *key, int *value)
@@ -487,11 +489,12 @@ static void __rstn_process(enum traffic_restriction_type rstn_type,
                        if (conn == NULL || conn->ifname == NULL)
                                continue;
 
+                       connection = conn;
+
                        if (rstn_data->ifname != NULL &&
                                g_strcmp0(rstn_data->ifname, "") != 0 &&
-                               g_strcmp0(conn->ifname, rstn_data->ifname) == 0 &&
-                               g_strcmp0(conn->tether_iface.ifname, rstn_data->ifname) == 0)
-                               connection = conn;
+                               g_strcmp0(conn->ifname, rstn_data->ifname) != 0)
+                               connection = NULL;
                }
 
                if (connection == NULL)
@@ -671,12 +674,12 @@ static void __rstn_add(gpointer data, gpointer user_data)
                        rstn_data->app_id, rstn_data, user_data);
        }
 
-       if (STC_DEBUG_LOG && STC_RSTN_LOG) {
-               __print_rstn(rstn_data);
+       __print_rstn(rstn_data);
+
+       if (STC_DEBUG_LOG && STC_RSTN_LOG)
                STC_LOGD("\033[1;32mRestriction added\033[0;m "
                        "[\033[1;36m%d\033[0;m:\033[1;35m%lld\033[0;m]",
                        rstn_data->classid, rstn_data->restriction_id);
-       }
 }
 
 static void __rstn_add_by_connection(gpointer key,
@@ -703,12 +706,12 @@ static void __rstn_remove(gpointer data, gpointer user_data)
        __rstn_tethering_process(RST_UNSET,
                rstn_data->app_id, rstn_data, user_data);
 
-       if (STC_DEBUG_LOG && STC_RSTN_LOG) {
-               __print_rstn(rstn_data);
+       __print_rstn(rstn_data);
+
+       if (STC_DEBUG_LOG && STC_RSTN_LOG)
                STC_LOGD("\033[1;31mRestriction removed\033[0;m "
                        "[\033[1;36m%d\033[0;m:\033[1;35m%lld\033[0;m]",
                        rstn_data->classid, rstn_data->restriction_id);
-       }
 }
 
 static void __rstn_remove_by_connection(gpointer key,
@@ -770,6 +773,12 @@ static gint __rstn_data_comp(gconstpointer a, gconstpointer b)
        return -1;
 }
 
+static void __rstn_foreach_print(gpointer data, gpointer user_data)
+{
+       stc_rstn_data_s *rstn_data = (stc_rstn_data_s *)data;
+       __print_rstn(rstn_data);
+}
+
 static stc_error_e __rstn_data_remove(stc_rstn_data_s *data)
 {
        stc_rstn_value_s *lookup_value;
@@ -808,6 +817,8 @@ static stc_error_e __rstn_data_remove(stc_rstn_data_s *data)
                                                        lookup_data);
        __rstn_data_destroy(lookup_data);
 
+       g_slist_foreach(lookup_value->rules, __rstn_foreach_print, NULL);
+
        if (!lookup_value->rules)
                g_hash_table_remove(rstns, GUINT_TO_POINTER(data->classid));
 
@@ -820,25 +831,18 @@ static stc_error_e __rstn_data_add(stc_rstn_data_s *data)
        stc_rstn_value_s *lookup_value;
        stc_rstn_value_s *rstn_value;
        stc_rstn_data_s *rstn_data;
+       GSList *lookup_list;
        GHashTable *rstns = stc_monitor_get_system_rstns();
 
        if (!rstns)
                return STC_ERROR_NO_DATA;
 
-       rstn_data = MALLOC0(stc_rstn_data_s, 1);
-       if (!rstn_data) {
-               if (STC_DEBUG_LOG && STC_RSTN_LOG)
-                       STC_LOGE("Rstn_data allocation failed");
-               return STC_ERROR_OUT_OF_MEMORY;
-       }
-
        lookup_value = g_hash_table_lookup(rstns, GUINT_TO_POINTER(data->classid));
        if (!lookup_value) {
                rstn_value = MALLOC0(stc_rstn_value_s, 1);
                if (!rstn_value) {
                        if (STC_DEBUG_LOG && STC_RSTN_LOG)
                                STC_LOGE("Rstn_value allocation failed");
-                       FREE(rstn_data);
                        return STC_ERROR_OUT_OF_MEMORY;
                }
 
@@ -848,12 +852,31 @@ static stc_error_e __rstn_data_add(stc_rstn_data_s *data)
                rstn_value = lookup_value;
        }
 
+       lookup_list = g_slist_find_custom(rstn_value->rules,
+                                       data, __rstn_data_comp);
+       if (!lookup_list) {
+               rstn_data = MALLOC0(stc_rstn_data_s, 1);
+               if (!rstn_data) {
+                       if (STC_DEBUG_LOG && STC_RSTN_LOG)
+                               STC_LOGE("Rstn_data allocation failed");
+                       return STC_ERROR_OUT_OF_MEMORY;
+               }
+
+               rstn_value->rules = g_slist_append(rstn_value->rules, rstn_data);
+       } else {
+               rstn_data = lookup_list->data;
+       }
+
        rstn_data->classid = data->classid;
+       FREE(rstn_data->app_id);
        rstn_data->app_id = g_strdup(data->app_id);
        rstn_data->iftype = data->iftype;
+       FREE(rstn_data->ifname);
        rstn_data->ifname = g_strdup(data->ifname);
+       FREE(rstn_data->subscriber_id);
        rstn_data->subscriber_id = g_strdup(data->subscriber_id);
        rstn_data->roaming = data->roaming;
+       FREE(rstn_data->mac);
        rstn_data->mac = g_strdup(data->mac);
 
        rstn_data->restriction_id = data->restriction_id;
@@ -870,11 +893,10 @@ static stc_error_e __rstn_data_add(stc_rstn_data_s *data)
        rstn_data->month_start_date = data->month_start_date;
        rstn_data->month_start_ts = data->month_start_ts;
 
-       __rstn_data_remove(rstn_data);
-       rstn_value->rules = g_slist_append(rstn_value->rules, rstn_data);
-
        __rstn_add(rstn_data, NULL);
 
+       g_slist_foreach(rstn_value->rules, __rstn_foreach_print, NULL);
+
        return STC_ERROR_NONE;
 }