diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-08-21 18:07:47 +0200 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-08-21 19:02:18 +0200 |
commit | 257b630216f0dc702013ecc51ac680b5296ae898 (patch) | |
tree | d5bdd36e3fd70855074623d7d0f3532920a75c01 /src/llc.cpp | |
parent | e91bd3babd5c04a154f296607b401a5050dcba31 (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.cpp | 53 |
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) |