From: Daniel Wagner <[email protected]>
When starting a ethernet device the sequence of the
device state (UP, LOWER_UP) from RTNL is different then
by a WiFi device.
For an ethernet device the entering UP and LOWER_UP
arrives together. Whereas for WiFi device we get
a entering UP and leaving LOWER_UP. This results in
a call on lower_down first.
Unfortunatly, the stats_start and stats_stop should
be called in the right order. This fix tracks the
statistics enabled/disabled state.
---
src/service.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/src/service.c b/src/service.c
index c76a9ee..af8f2c4 100644
--- a/src/service.c
+++ b/src/service.c
@@ -38,6 +38,7 @@ static GHashTable *service_hash = NULL;
struct connman_stats {
connman_bool_t valid;
+ connman_bool_t enabled;
unsigned int rx_packets_last;
unsigned int tx_packets_last;
unsigned int rx_packets;
@@ -380,6 +381,8 @@ static void __connman_service_stats_start(struct
connman_service *service)
if (service->stats.timer == NULL)
return;
+ service->stats.enabled = TRUE;
+
service->stats.time_start = service->stats.time;
g_timer_start(service->stats.timer);
@@ -396,12 +399,17 @@ static void __connman_service_stats_stop(struct
connman_service *service)
if (service->stats.timer == NULL)
return;
+ if (service->stats.enabled == FALSE)
+ return;
+
__connman_counter_remove_service(service);
g_timer_stop(service->stats.timer);
seconds = g_timer_elapsed(service->stats.timer, NULL);
service->stats.time = service->stats.time_start + seconds;
+
+ service->stats.enabled = FALSE;
}
static int __connman_service_stats_load(struct connman_service *service,
@@ -1843,6 +1851,7 @@ static void __connman_service_initialize(struct
connman_service *service)
service->order = 0;
service->stats.valid = FALSE;
+ service->stats.enabled = FALSE;
service->stats.timer = g_timer_new();
}
--
1.7.1.1
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman