aboutsummaryrefslogtreecommitdiffstats
path: root/src/llc.cpp
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-08-21 18:07:47 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-08-21 19:02:18 +0200
commit257b630216f0dc702013ecc51ac680b5296ae898 (patch)
treed5bdd36e3fd70855074623d7d0f3532920a75c01 /src/llc.cpp
parente91bd3babd5c04a154f296607b401a5050dcba31 (diff)
llc: Add move_and_merge method to llc_queue
This methods takes all LLC frames from the old LLC queue and moves them into the current. If both queues are ordered chronologically (recv_time), the resulting queue is also ordered. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/llc.cpp')
-rw-r--r--src/llc.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/llc.cpp b/src/llc.cpp
index c071d0a1..79afc377 100644
--- a/src/llc.cpp
+++ b/src/llc.cpp
@@ -134,6 +134,59 @@ void gprs_llc_queue::clear(BTS *bts)
m_queue_octets = 0;
}
+void gprs_llc_queue::move_and_merge(gprs_llc_queue *o)
+{
+ struct msgb *msg, *msg1 = NULL, *msg2 = NULL;
+ struct llist_head new_queue;
+ size_t queue_size = 0;
+ size_t queue_octets = 0;
+ INIT_LLIST_HEAD(&new_queue);
+
+ while (1) {
+ if (msg1 == NULL)
+ msg1 = msgb_dequeue(&m_queue);
+
+ if (msg2 == NULL)
+ msg2 = msgb_dequeue(&o->m_queue);
+
+ if (msg1 == NULL && msg2 == NULL)
+ break;
+
+ if (msg1 == NULL) {
+ msg = msg2;
+ msg2 = NULL;
+ } else if (msg2 == NULL) {
+ msg = msg1;
+ msg1 = NULL;
+ } else {
+ const MetaInfo *mi1 = (MetaInfo *)&msg1->cb[0];
+ const MetaInfo *mi2 = (MetaInfo *)&msg2->cb[0];
+
+ if (timercmp(&mi2->recv_time, &mi1->recv_time, >)) {
+ msg = msg1;
+ msg1 = NULL;
+ } else {
+ msg = msg2;
+ msg2 = NULL;
+ }
+ }
+
+ msgb_enqueue(&new_queue, msg);
+ queue_size += 1;
+ queue_octets += msgb_length(msg);
+ }
+
+ OSMO_ASSERT(llist_empty(&m_queue));
+ OSMO_ASSERT(llist_empty(&o->m_queue));
+
+ o->m_queue_size = 0;
+ o->m_queue_octets = 0;
+
+ llist_splice_init(&new_queue, &m_queue);
+ m_queue_size = queue_size;
+ m_queue_octets = queue_octets;
+}
+
#define ALPHA 0.5f
struct msgb *gprs_llc_queue::dequeue(const MetaInfo **info)