aboutsummaryrefslogtreecommitdiffstats
path: root/src/llc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llc.cpp')
-rw-r--r--src/llc.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/llc.cpp b/src/llc.cpp
index c557584c..2d295f86 100644
--- a/src/llc.cpp
+++ b/src/llc.cpp
@@ -78,14 +78,34 @@ void gprs_llc::init()
{
INIT_LLIST_HEAD(&queue);
m_queue_size = 0;
+ m_avg_queue_delay = 0;
reset();
}
+#define ALPHA 0.5f
+
struct msgb *gprs_llc::dequeue()
{
- if (m_queue_size > 0)
- m_queue_size -= 1;
- return msgb_dequeue(&queue);
+ struct msgb *msg;
+ struct timeval *tv, tv_now, tv_result;
+ uint32_t lifetime;
+
+
+ msg = msgb_dequeue(&queue);
+ if (!msg)
+ return NULL;
+
+ m_queue_size -= 1;
+
+ /* take the second time */
+ gettimeofday(&tv_now, NULL);
+ tv = (struct timeval *)&msg->data[sizeof(*tv)];
+ timersub(&tv_now, tv, &tv_result);
+
+ lifetime = tv_result.tv_sec*1000 + tv_result.tv_usec/1000;
+ m_avg_queue_delay = m_avg_queue_delay * ALPHA + lifetime * (1-ALPHA);
+
+ return msg;
}