summaryrefslogtreecommitdiff
path: root/src/counter.c
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2010-08-18 17:56:06 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-08-18 19:08:54 +0200
commitb16225a6267520a19417059076fc3dff8e35a718 (patch)
tree6fbceb730e3fc1dceaaae7db5f4be1d8f289671f /src/counter.c
parentce5e47bd96e821e44ba29c4e747cd5b923e0d426 (diff)
downloadconnman-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.c93
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);