Added WarnThresholdCrossed signal on restriction interface. 91/130491/1
authorNishant Chaprana <n.chaprana@samsung.com>
Mon, 22 May 2017 11:29:59 +0000 (16:59 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Mon, 22 May 2017 11:29:59 +0000 (16:59 +0530)
Change-Id: I0cee09ac57abe21b64454968ef3e7644f12fe7dc
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
include/stc-manager-gdbus.h
interfaces/stcmanager-iface-restriction.xml
packaging/stc-manager.spec
src/monitor/include/stc-monitor.h
src/monitor/stc-monitor.c
src/stc-manager-gdbus.c

index c253c18..cafca77 100755 (executable)
@@ -21,6 +21,7 @@
 #include "generated-code.h"
 
 #define STC_DBUS_SERVICE                   "net.stc"
+#define STC_DBUS_INTERFACE_RESTRICTION     STC_DBUS_SERVICE ".restriction"
 #define STC_DBUS_SERVICE_PATH              "/net/stc"
 #define STC_DBUS_SERVICE_STATISTICS_PATH   "/net/stc/statistics"
 #define STC_DBUS_SERVICE_RESTRICTION_PATH  "/net/stc/restriction"
@@ -82,5 +83,10 @@ void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
                                          guint subscription_id);
 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
                                    void *user_data);
+gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
+                                     const gchar *object_path,
+                                     const gchar *interface_name,
+                                     const gchar *signal_name,
+                                     GVariant *parameters);
 
 #endif /* __STC_MANAGER_GDBUS_H__ */
index b765431..6dba33d 100644 (file)
@@ -38,5 +38,9 @@
                        <arg type='y' name='status'/>
                        <arg type='i' name='reason'/>
                </signal>
+
+               <signal name='WarnThresholdCrossed'>
+                       <arg type='s' name='app_id'/>
+               </signal>
        </interface>
 </node>
index 074ac00..c50f783 100644 (file)
@@ -1,6 +1,6 @@
 Name:       stc-manager
 Summary:    STC(Smart Traffic Control) manager
-Version:    0.0.9
+Version:    0.0.10
 Release:    0
 Group:      Network & Connectivity/Other
 License:    Apache-2.0
index c3d2db9..eaf3530 100644 (file)
@@ -86,6 +86,7 @@ typedef struct {
        stc_data_counter_s counter;
        gboolean in_limit_reached;
        gboolean out_limit_reached;
+       gboolean warn_limit_crossed_notified;
 } stc_rstn_value_s;
 
 /**
index 8633c84..ff5803a 100755 (executable)
@@ -550,6 +550,21 @@ static gboolean __rstn_counter_update_foreach_classid(gpointer key,
        case NFACCT_COUNTER_IN:
                rstn_value->counter.in_bytes += context->bytes;
 
+               if (rstn_value->counter.in_bytes >= rstn_value->warn_limit.in_bytes
+                   && rstn_value->warn_limit_crossed_notified == FALSE) {
+                       gboolean rv = FALSE;
+                       stc_s *stc = (stc_s *)stc_get_manager();
+                       ret_value_msg_if(stc == NULL, FALSE, "failed to get stc data");
+
+                       rv = stc_manager_dbus_emit_signal(stc->connection,
+                                                         STC_DBUS_SERVICE_RESTRICTION_PATH,
+                                                         STC_DBUS_INTERFACE_RESTRICTION,
+                                                         "WarnThresholdCrossed",
+                                                         g_variant_new("(s)", rstn_key->app_id));
+                       if (rv == TRUE)
+                               rstn_value->warn_limit_crossed_notified = TRUE;
+               }
+
                /* block immediately */
                if (rstn_value->counter.in_bytes >= rstn_value->limit.in_bytes) {
                        __del_iptables_in(context->counter);
@@ -564,6 +579,21 @@ static gboolean __rstn_counter_update_foreach_classid(gpointer key,
        case NFACCT_COUNTER_OUT:
                rstn_value->counter.out_bytes += context->bytes;
 
+               if (rstn_value->counter.out_bytes >= rstn_value->limit.out_bytes
+                   && rstn_value->warn_limit_crossed_notified == FALSE) {
+                       gboolean rv = FALSE;
+                       stc_s *stc = (stc_s *)stc_get_manager();
+                       ret_value_msg_if(stc == NULL, FALSE, "failed to get stc data");
+
+                       rv = stc_manager_dbus_emit_signal(stc->connection,
+                                                         STC_DBUS_SERVICE_RESTRICTION_PATH,
+                                                         STC_DBUS_INTERFACE_RESTRICTION,
+                                                         "WarnThresholdCrossed",
+                                                         g_variant_new("(s)", rstn_key->app_id));
+                       if (rv == TRUE)
+                               rstn_value->warn_limit_crossed_notified = TRUE;
+               }
+
                /* block immediately */
                if (rstn_value->counter.out_bytes >= rstn_value->limit.out_bytes) {
                        __del_iptables_out(context->counter);
@@ -1007,6 +1037,7 @@ static stc_error_e __rstn_tree_add(stc_rstn_key_s *key,
        rstn_value->warn_limit.out_bytes = value->warn_limit.out_bytes;
        rstn_value->counter.in_bytes = 0;
        rstn_value->counter.out_bytes = 0;
+       rstn_value->warn_limit_crossed_notified = FALSE;
 
        if (debug == TRUE)
                __add_restriction_debug(key, rstn_value, NULL);
index 42f7697..5b3cc71 100755 (executable)
@@ -302,3 +302,38 @@ void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
 
        __STC_LOG_FUNC_EXIT__;
 }
+
+gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
+                                     const gchar *object_path,
+                                     const gchar *interface_name,
+                                     const gchar *signal_name,
+                                     GVariant *parameters)
+{
+       gboolean rv = FALSE;
+       GError *error = NULL;
+
+       if (connection == NULL) {
+               STC_LOGE("GDBusconnection is NULL");
+               return 0;
+       }
+
+       DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
+
+       rv = g_dbus_connection_emit_signal(connection,
+                                          NULL,
+                                          object_path,
+                                          interface_name,
+                                          signal_name,
+                                          parameters,
+                                          &error);
+       if (rv != TRUE) {
+               STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]",
+                        signal_name, interface_name, error->message);
+               g_error_free(error);
+       } else {
+               STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
+                        interface_name);
+       }
+
+       return rv;
+}