[STC Manager] Added logic to add and remove iptable rule of restriction.
[platform/core/connectivity/stc-manager.git] / src / monitor / stc-monitor.c
index 896e437..32d2a8a 100755 (executable)
@@ -402,6 +402,32 @@ static void __process_restriction(enum traffic_restriction_type rst_type,
 
        switch (rst_type) {
        case RST_SET:
+               if (effective_data_limit <= 0) {
+                       char *default_ifname = stc_default_connection_get_ifname();
+                       struct nfacct_rule counter;
+                       stc_s *stc = stc_get_manager();
+
+                       if (!stc->carg) {
+                               stc->carg = MALLOC0(counter_arg_s, 1);
+                               stc->carg->sock =
+                                       stc_monitor_get_counter_socket();
+                       }
+
+                       counter.carg = stc->carg;
+                       counter.classid = rstn_value->classid;
+                       counter.intend = NFACCT_BLOCK;
+                       counter.iftype = STC_IFACE_UNKNOWN;
+                       g_strlcpy(counter.ifname, default_ifname,
+                                 MAX_IFACE_LENGTH);
+
+                       generate_counter_name(&counter);
+                       g_free(default_ifname);
+
+                       /* iptables rule */
+                       __add_iptables_in(&counter);
+                       __add_iptables_out(&counter);
+               }
+
                rstn_value->rst_state = STC_RESTRICTION_ACTIVATED;
                rstn_value->data_limit_reached = FALSE;
                break;
@@ -409,8 +435,34 @@ static void __process_restriction(enum traffic_restriction_type rst_type,
                ;//Do Nothing
                break;
        case RST_UNSET:
-               rstn_value->rst_state = STC_RESTRICTION_REMOVED;
-               rstn_value->data_limit_reached = FALSE;
+               {
+                       char *default_ifname = stc_default_connection_get_ifname();
+                       struct nfacct_rule counter;
+                       stc_s *stc = stc_get_manager();
+
+                       if (!stc->carg) {
+                               stc->carg = MALLOC0(counter_arg_s, 1);
+                               stc->carg->sock =
+                                       stc_monitor_get_counter_socket();
+                       }
+
+                       counter.carg = stc->carg;
+                       counter.classid = rstn_value->classid;
+                       counter.intend = NFACCT_BLOCK;
+                       counter.iftype = STC_IFACE_UNKNOWN;
+                       g_strlcpy(counter.ifname, default_ifname,
+                                 MAX_IFACE_LENGTH);
+
+                       generate_counter_name(&counter);
+                       g_free(default_ifname);
+
+                       /* iptables rule */
+                       __del_iptables_in(&counter);
+                       __del_iptables_out(&counter);
+
+                       rstn_value->rst_state = STC_RESTRICTION_REMOVED;
+                       rstn_value->data_limit_reached = FALSE;
+               }
                break;
        default:
                ;//Do Nothing