diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/connman.h | 9 | ||||
-rw-r--r-- | src/counter.c | 88 | ||||
-rw-r--r-- | src/ipconfig.c | 2 | ||||
-rw-r--r-- | src/service.c | 4 |
4 files changed, 57 insertions, 46 deletions
diff --git a/src/connman.h b/src/connman.h index 81eda658..1fdada37 100644 --- a/src/connman.h +++ b/src/connman.h @@ -66,17 +66,22 @@ void __connman_agent_cleanup(void); int __connman_agent_register(const char *sender, const char *path); int __connman_agent_unregister(const char *sender, const char *path); +struct connman_service; +struct connman_ipconfig; + int __connman_counter_register(const char *owner, const char *path, unsigned int interval); int __connman_counter_unregister(const char *owner, const char *path); -void __connman_counter_notify(const char *interface, +void __connman_counter_notify(struct connman_ipconfig *config, unsigned int rx_bytes, unsigned int tx_bytes); +int __connman_counter_add_service(struct connman_service *service); +void __connman_counter_remove_service(struct connman_service *service); + int __connman_counter_init(void); void __connman_counter_cleanup(void); -struct connman_service; typedef void (* passphrase_cb_t) (struct connman_service *service, const char *passphrase, void *user_data); diff --git a/src/counter.c b/src/counter.c index bf9da902..f290179f 100644 --- a/src/counter.c +++ b/src/counter.c @@ -33,12 +33,6 @@ static GHashTable *stats_table; static GHashTable *counter_table; static GHashTable *owner_mapping; -struct connman_stats { - char *interface; - unsigned int rx_bytes; - unsigned int tx_bytes; -}; - struct connman_counter { char *owner; char *path; @@ -46,14 +40,6 @@ struct connman_counter { guint watch; }; -static void remove_stats(gpointer user_data) -{ - struct connman_stats *stats = user_data; - - g_free(stats->interface); - g_free(stats); -} - static void remove_counter(gpointer user_data) { struct connman_counter *counter = user_data; @@ -130,10 +116,14 @@ int __connman_counter_unregister(const char *owner, const char *path) } static void send_usage(struct connman_counter *counter, - struct connman_stats *stats) + struct connman_service *service) { DBusMessage *message; DBusMessageIter array, dict; + const char *service_path; + unsigned long rx_bytes; + unsigned long tx_bytes; + unsigned long time; message = dbus_message_new_method_call(counter->owner, counter->path, CONNMAN_COUNTER_INTERFACE, "Usage"); @@ -142,54 +132,48 @@ static void send_usage(struct connman_counter *counter, dbus_message_set_no_reply(message, TRUE); + service_path = __connman_service_get_path(service); + dbus_message_append_args(message, DBUS_TYPE_OBJECT_PATH, + &service_path, DBUS_TYPE_INVALID); + dbus_message_iter_init_append(message, &array); connman_dbus_dict_open(&array, &dict); - connman_dbus_dict_append_basic(&dict, "Interface", - DBUS_TYPE_STRING, &stats->interface); - connman_dbus_dict_append_basic(&dict, "RX.Bytes", - DBUS_TYPE_UINT32, &stats->rx_bytes); - connman_dbus_dict_append_basic(&dict, "TX.Bytes", - DBUS_TYPE_UINT32, &stats->tx_bytes); + rx_bytes = __connman_service_stats_get_rx_bytes(service); + tx_bytes = __connman_service_stats_get_tx_bytes(service); + time = __connman_service_stats_get_time(service); + + connman_dbus_dict_append_basic(&dict, "RX.Bytes", DBUS_TYPE_UINT32, + &rx_bytes); + connman_dbus_dict_append_basic(&dict, "TX.Bytes", DBUS_TYPE_UINT32, + &tx_bytes); + connman_dbus_dict_append_basic(&dict, "Time", DBUS_TYPE_UINT32, + &time); connman_dbus_dict_close(&array, &dict); g_dbus_send_message(connection, message); } -void __connman_counter_notify(const char *interface, +void __connman_counter_notify(struct connman_ipconfig *config, unsigned int rx_bytes, unsigned int tx_bytes) { - struct connman_stats *stats; + struct connman_service *service; GHashTableIter iter; gpointer key, value; - stats = g_hash_table_lookup(stats_table, interface); - if (stats != NULL) - goto update; - - stats = g_try_new0(struct connman_stats, 1); - if (stats == NULL) - return; - - stats->interface = g_strdup(interface); - - g_hash_table_replace(stats_table, stats->interface, stats); - -update: - if (stats->rx_bytes == rx_bytes && stats->tx_bytes == tx_bytes) + service = g_hash_table_lookup(stats_table, config); + if (service == NULL) return; - stats->rx_bytes = rx_bytes; - stats->tx_bytes = tx_bytes; + __connman_service_stats_update(service, rx_bytes, tx_bytes); g_hash_table_iter_init(&iter, counter_table); - while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { struct connman_counter *counter = value; - send_usage(counter, stats); + send_usage(counter, service); } } @@ -210,6 +194,24 @@ static void release_counter(gpointer key, gpointer value, gpointer user_data) g_dbus_send_message(connection, message); } +int __connman_counter_add_service(struct connman_service *service) +{ + struct connman_ipconfig *config; + + config = __connman_service_get_ipconfig(service); + g_hash_table_replace(stats_table, config, service); + + return 0; +} + +void __connman_counter_remove_service(struct connman_service *service) +{ + struct connman_ipconfig *config; + + config = __connman_service_get_ipconfig(service); + g_hash_table_remove(stats_table, config); +} + int __connman_counter_init(void) { DBG(""); @@ -218,8 +220,8 @@ int __connman_counter_init(void) if (connection == NULL) return -1; - stats_table = g_hash_table_new_full(g_str_hash, g_str_equal, - NULL, remove_stats); + stats_table = g_hash_table_new_full(g_direct_hash, g_str_equal, + NULL, NULL); counter_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, remove_counter); diff --git a/src/ipconfig.c b/src/ipconfig.c index ac26203c..51c4619f 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -367,7 +367,7 @@ static void update_stats(struct connman_ipdevice *ipdevice, ipdevice->rx_bytes = stats->rx_bytes; ipdevice->tx_bytes = stats->tx_bytes; - __connman_counter_notify(ipdevice->ifname, + __connman_counter_notify(ipdevice->config, ipdevice->rx_bytes, ipdevice->tx_bytes); } diff --git a/src/service.c b/src/service.c index ff3e8c86..fd694e80 100644 --- a/src/service.c +++ b/src/service.c @@ -371,6 +371,8 @@ static void __connman_service_stats_start(struct connman_service *service) service->stats.time_start = service->stats.time; g_timer_start(service->stats.timer); + + __connman_counter_add_service(service); } static void __connman_service_stats_stop(struct connman_service *service) @@ -382,6 +384,8 @@ static void __connman_service_stats_stop(struct connman_service *service) if (service->stats.timer == NULL) return; + __connman_counter_remove_service(service); + g_timer_stop(service->stats.timer); seconds = g_timer_elapsed(service->stats.timer, NULL); |