From 4ae33b34d91dca201989ee7e6f72a64d93d0af0a Mon Sep 17 00:00:00 2001 From: hyunuktak Date: Tue, 12 Mar 2019 10:22:49 +0900 Subject: [PATCH] Add and remove restriction rule appropriately Change-Id: Icb7d614eb5b4197b05df880e91d59fe21b77b6c5 Signed-off-by: hyunuktak --- plugin/monitor/stc-plugin-monitor-rstn.c | 112 ++++++++++++++++++------------- 1 file changed, 67 insertions(+), 45 deletions(-) diff --git a/plugin/monitor/stc-plugin-monitor-rstn.c b/plugin/monitor/stc-plugin-monitor-rstn.c index 99951a2..365207c 100755 --- a/plugin/monitor/stc-plugin-monitor-rstn.c +++ b/plugin/monitor/stc-plugin-monitor-rstn.c @@ -31,31 +31,33 @@ 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; } -- 2.7.4