diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-03-20 14:53:54 +0100 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-03-25 12:12:27 +0100 |
commit | 005ee7f8626d4733e8fa01f3589154287ed163ed (patch) | |
tree | 2750793d56cf9eac54f5e66933f7a716162e7086 /src | |
parent | 2493c660e9cbede4ac43f2584c0a8e6d8625e1dd (diff) |
tbf: Add frames_since_last_poll method
This functions calculates the number of frames that have passed since
the last DL poll (RRBP flag set) has been sent. It returns a value
less than zero (fn_now - fn_sched) if the block has been scheduled but
not yet sent.
If the function is called before the first data block has been sent
it will return -1.
If the function is called before the first DL poll is sent, it
returns the number of frames since the first data block has been
sent.
Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r-- | src/tbf.cpp | 2 | ||||
-rw-r--r-- | src/tbf.h | 2 | ||||
-rw-r--r-- | src/tbf_dl.cpp | 21 |
3 files changed, 25 insertions, 0 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp index 388f82d7..56804c32 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -470,6 +470,8 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, llist_add(&tbf->list.list, &bts->dl_tbfs); tbf->bts->tbf_dl_created(); + tbf->m_last_dl_poll_fn = -1; + gettimeofday(&tbf->m_bw.dl_bw_tv, NULL); gettimeofday(&tbf->m_bw.dl_loss_tv, NULL); @@ -325,6 +325,7 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { void request_dl_ack(); bool need_control_ts() const; bool have_data() const; + int frames_since_last_poll(unsigned fn) const; bool is_control_ts(uint8_t ts) const { return ts == control_ts; @@ -342,6 +343,7 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { int32_t m_tx_counter; /* count all transmitted blocks */ uint8_t m_wait_confirm; /* wait for CCCH IMM.ASS cnf */ bool m_dl_ack_requested; + int32_t m_last_dl_poll_fn; struct { struct timeval dl_bw_tv; /* timestamp for dl bw calculation */ diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index c9ad058c..0630ba17 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -484,6 +484,11 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block( len = m_rlc.block(index)->len; rh = (struct rlc_dl_header *)data; + /* If the TBF has just started, relate frames_since_last_poll to the + * current fn */ + if (m_last_dl_poll_fn < 0) + m_last_dl_poll_fn = fn; + need_poll = state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK); /* Clear Polling, if still set in history buffer */ rh->s_p = 0; @@ -538,6 +543,8 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block( /* set polling in header */ rh->rrbp = 0; /* N+13 */ rh->s_p = 1; /* Polling */ + + m_last_dl_poll_fn = poll_fn; } } @@ -730,3 +737,17 @@ bool gprs_rlcmac_dl_tbf::have_data() const { return m_llc.chunk_size() > 0 || !llist_empty(&m_llc.queue); } + +int gprs_rlcmac_dl_tbf::frames_since_last_poll(unsigned fn) const +{ + unsigned wrapped; + if (m_last_dl_poll_fn < 0) + return -1; + + wrapped = (fn + 2715648 - m_last_dl_poll_fn) % 2715648; + if (wrapped < 2715648/2) + return wrapped; + else + return wrapped - 2715648; +} + |