diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2010-08-18 17:56:06 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-08-18 19:08:54 +0200 |
commit | b16225a6267520a19417059076fc3dff8e35a718 (patch) | |
tree | 6fbceb730e3fc1dceaaae7db5f4be1d8f289671f /src/counter.c | |
parent | ce5e47bd96e821e44ba29c4e747cd5b923e0d426 (diff) | |
download | connman-b16225a6267520a19417059076fc3dff8e35a718.tar.gz connman-b16225a6267520a19417059076fc3dff8e35a718.tar.bz2 connman-b16225a6267520a19417059076fc3dff8e35a718.zip |
Add support for roaming/home network statistic
Currently connman only has one set of counters for
collecting statistics on online time and
the amount of transfered bytes.
For 3G connections we should destinguish between
home network and roaming. This patch introduces
two sets of counter values for home network
and roaming network.
Changing from Home to Roaming counters relies on
connman_network_set_roaming being called. Currently,
this is only done in the ofono plugin. Getting Wifi
'Hot-Spot Provider' Roaming (e.g. T-Mobile Germany
to T-Mobile USA) is not yet working.
Diffstat (limited to 'src/counter.c')
-rw-r--r-- | src/counter.c | 93 |
1 files changed, 13 insertions, 80 deletions
diff --git a/src/counter.c b/src/counter.c index 27898c52..19171e5a 100644 --- a/src/counter.c +++ b/src/counter.c @@ -38,10 +38,6 @@ struct connman_counter { char *path; unsigned int interval; guint watch; -}; - -struct counter_data { - struct connman_service *service; connman_bool_t first_update; }; @@ -61,13 +57,6 @@ static void remove_counter(gpointer user_data) g_free(counter); } -static void remove_data(gpointer user_data) -{ - struct counter_data *data = user_data; - - g_free(data); -} - static void owner_disconnect(DBusConnection *connection, void *user_data) { struct connman_counter *counter = user_data; @@ -95,6 +84,7 @@ int __connman_counter_register(const char *owner, const char *path, counter->owner = g_strdup(owner); counter->path = g_strdup(path); + counter->first_update = TRUE; g_hash_table_replace(counter_table, counter->path, counter); g_hash_table_replace(owner_mapping, counter->owner, counter); @@ -131,17 +121,7 @@ static void send_usage(struct connman_counter *counter, struct connman_service *service) { DBusMessage *message; - DBusMessageIter array, dict; const char *service_path; - unsigned long rx_packets; - unsigned long tx_packets; - unsigned long rx_bytes; - unsigned long tx_bytes; - unsigned long rx_errors; - unsigned long tx_errors; - unsigned long rx_dropped; - unsigned long tx_dropped; - unsigned long time; message = dbus_message_new_method_call(counter->owner, counter->path, CONNMAN_COUNTER_INTERFACE, "Usage"); @@ -154,46 +134,9 @@ static void send_usage(struct connman_counter *counter, dbus_message_append_args(message, DBUS_TYPE_OBJECT_PATH, &service_path, DBUS_TYPE_INVALID); - dbus_message_iter_init_append(message, &array); - - /* home counter */ - connman_dbus_dict_open(&array, &dict); - - rx_packets = __connman_service_stats_get_rx_packets(service); - tx_packets = __connman_service_stats_get_tx_packets(service); - rx_bytes = __connman_service_stats_get_rx_bytes(service); - tx_bytes = __connman_service_stats_get_tx_bytes(service); - rx_errors = __connman_service_stats_get_rx_errors(service); - tx_errors = __connman_service_stats_get_tx_errors(service); - rx_dropped = __connman_service_stats_get_rx_dropped(service); - tx_dropped = __connman_service_stats_get_tx_dropped(service); - time = __connman_service_stats_get_time(service); - - connman_dbus_dict_append_basic(&dict, "RX.Packets", DBUS_TYPE_UINT32, - &rx_packets); - connman_dbus_dict_append_basic(&dict, "TX.Packets", DBUS_TYPE_UINT32, - &tx_packets); - 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, "RX.Errors", DBUS_TYPE_UINT32, - &rx_errors); - connman_dbus_dict_append_basic(&dict, "TX.Errors", DBUS_TYPE_UINT32, - &tx_errors); - connman_dbus_dict_append_basic(&dict, "RX.Dropped", DBUS_TYPE_UINT32, - &rx_dropped); - connman_dbus_dict_append_basic(&dict, "TX.Dropped", DBUS_TYPE_UINT32, - &tx_dropped); - connman_dbus_dict_append_basic(&dict, "Time", DBUS_TYPE_UINT32, - &time); - - connman_dbus_dict_close(&array, &dict); - - /* roaming counter */ - connman_dbus_dict_open(&array, &dict); - - connman_dbus_dict_close(&array, &dict); + __connman_service_stats_append(service, message, counter->first_update); + + counter->first_update = FALSE; g_dbus_send_message(connection, message); } @@ -204,22 +147,20 @@ void __connman_counter_notify(struct connman_ipconfig *config, unsigned int rx_errors, unsigned int tx_errors, unsigned int rx_dropped, unsigned int tx_dropped) { - struct counter_data *data; + struct connman_service *service; GHashTableIter iter; gpointer key, value; - data = g_hash_table_lookup(stats_table, config); - if (data == NULL) + service = g_hash_table_lookup(stats_table, config); + if (service == NULL) return; - __connman_service_stats_update(data->service, + if (__connman_service_stats_update(service, rx_packets, tx_packets, rx_bytes, tx_bytes, rx_errors, tx_errors, - rx_dropped, tx_dropped); - - if (data->first_update == TRUE) { - data->first_update = FALSE; + rx_dropped, tx_dropped) == FALSE) { + /* first update, counters are now initialized */ return; } @@ -227,7 +168,7 @@ void __connman_counter_notify(struct connman_ipconfig *config, while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { struct connman_counter *counter = value; - send_usage(counter, data->service); + send_usage(counter, service); } } @@ -251,17 +192,9 @@ static void release_counter(gpointer key, gpointer value, gpointer user_data) int __connman_counter_add_service(struct connman_service *service) { struct connman_ipconfig *config; - struct counter_data *data; - - data = g_try_new0(struct counter_data, 1); - if (data == NULL) - return -ENOMEM; - - data->service = service; - data->first_update = TRUE; config = __connman_service_get_ipconfig(service); - g_hash_table_replace(stats_table, config, data); + g_hash_table_replace(stats_table, config, service); /* * Trigger a first update to intialize the offset counters @@ -289,7 +222,7 @@ int __connman_counter_init(void) return -1; stats_table = g_hash_table_new_full(g_direct_hash, g_str_equal, - NULL, remove_data); + NULL, NULL); counter_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, remove_counter); |