diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/llc.cpp | 26 | ||||
-rw-r--r-- | src/llc.h | 1 | ||||
-rw-r--r-- | src/tbf.cpp | 5 |
3 files changed, 28 insertions, 4 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; } @@ -55,6 +55,7 @@ struct gprs_llc { uint16_t m_length; /* len of current DL LLC_frame, 0 == no frame */ struct llist_head queue; /* queued LLC DL data */ + uint32_t m_avg_queue_delay; /* Average delay of data going through the queue */ size_t m_queue_size; }; diff --git a/src/tbf.cpp b/src/tbf.cpp index 4c0e845a..5d7e4efb 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -100,12 +100,14 @@ int gprs_rlcmac_tbf::append_data(const uint8_t ms_class, /* the TBF exists, so we must write it in the queue * we prepend lifetime in front of PDU */ struct timeval *tv; - struct msgb *llc_msg = msgb_alloc(len + sizeof(*tv), + struct msgb *llc_msg = msgb_alloc(len + sizeof(*tv) * 2, "llc_pdu_queue"); if (!llc_msg) return -ENOMEM; tv = (struct timeval *)msgb_put(llc_msg, sizeof(*tv)); gprs_llc::calc_pdu_lifetime(bts, pdu_delay_csec, tv); + tv = (struct timeval *)msgb_put(llc_msg, sizeof(*tv)); + gettimeofday(tv, NULL); memcpy(msgb_put(llc_msg, len), data, len); m_llc.enqueue(llc_msg); tbf_update_ms_class(this, ms_class); @@ -633,6 +635,7 @@ struct msgb *gprs_rlcmac_tbf::llc_dequeue(bssgp_bvc_ctx *bctx) while ((msg = m_llc.dequeue())) { tv = (struct timeval *)msg->data; msgb_pull(msg, sizeof(*tv)); + msgb_pull(msg, sizeof(*tv)); if (gprs_llc::is_frame_expired(&tv_now, tv)) { LOGP(DRLCMACDL, LOGL_NOTICE, "%s Discarding LLC PDU " |