aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-01-22 17:58:17 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-08 00:45:38 +0100
commit8eb17143f2b3ab5d96c46d698722de9dc83ac5f4 (patch)
tree7324884088fcd6dab85b32787e2f99c538f91ee8 /src
parent81a04f7d79ab290028074cfa626498abfdb09937 (diff)
tbf: Add and use tbf->poll_ts
Currently tbf->control_ts is used to look up an incoming poll response. Since that may eventually change, poll timeouts could theoretically happen in that case. Store the real poll TS in tbf->poll_ts at all places where tbf->poll_fn is set. Do not use tbf->control_ts to look up outstanding polls. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp4
-rw-r--r--src/tbf.cpp15
-rw-r--r--src/tbf.h1
-rw-r--r--src/tbf_dl.cpp3
-rw-r--r--src/tbf_ul.cpp1
5 files changed, 15 insertions, 9 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 61dfc87..0356718 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -307,7 +307,7 @@ gprs_rlcmac_dl_tbf *BTS::dl_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts)
if (tbf->state_is_not(GPRS_RLCMAC_RELEASING)
&& tbf->poll_state == GPRS_RLCMAC_POLL_SCHED
&& tbf->poll_fn == fn && tbf->trx->trx_no == trx
- && tbf->control_ts == ts) {
+ && tbf->poll_ts == ts) {
return tbf;
}
}
@@ -325,7 +325,7 @@ gprs_rlcmac_ul_tbf *BTS::ul_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts)
if (tbf->state_is_not(GPRS_RLCMAC_RELEASING)
&& tbf->poll_state == GPRS_RLCMAC_POLL_SCHED
&& tbf->poll_fn == fn && tbf->trx->trx_no == trx
- && tbf->control_ts == ts) {
+ && tbf->poll_ts == ts) {
return tbf;
}
}
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 35a004c..6e51628 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -61,6 +61,7 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) :
ul_ack_state(GPRS_RLCMAC_UL_ACK_NONE),
poll_state(GPRS_RLCMAC_POLL_NONE),
poll_fn(0),
+ poll_ts(0),
n3105(0),
T(0),
num_T_exp(0),
@@ -436,8 +437,8 @@ void gprs_rlcmac_tbf::stop_timer()
void gprs_rlcmac_tbf::poll_timeout()
{
- LOGP(DRLCMAC, LOGL_NOTICE, "%s poll timeout for FN=%d (curr FN %d)\n",
- tbf_name(this), poll_fn, bts->current_frame_number());
+ LOGP(DRLCMAC, LOGL_NOTICE, "%s poll timeout for FN=%d, TS=%d (curr FN %d)\n",
+ tbf_name(this), poll_fn, poll_ts, bts->current_frame_number());
poll_state = GPRS_RLCMAC_POLL_NONE;
@@ -935,10 +936,11 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn, uint8_t ts)
if (poll_ass_dl) {
poll_state = GPRS_RLCMAC_POLL_SCHED;
poll_fn = (fn + 13) % 2715648;
+ poll_ts = ts;
dl_ass_state = GPRS_RLCMAC_DL_ASS_WAIT_ACK;
LOGP(DRLCMACDL, LOGL_INFO,
- "%s Scheduled DL Assignment polling on FN=%d\n",
- name(), poll_fn);
+ "%s Scheduled DL Assignment polling on FN=%d, TS=%d\n",
+ name(), poll_fn, poll_ts);
} else {
dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;
new_dl_tbf->set_state(GPRS_RLCMAC_FLOW);
@@ -1004,10 +1006,11 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn, uint8_t ts)
poll_state = GPRS_RLCMAC_POLL_SCHED;
poll_fn = (fn + 13) % 2715648;
+ poll_ts = ts;
ul_ass_state = GPRS_RLCMAC_UL_ASS_WAIT_ACK;
LOGP(DRLCMACDL, LOGL_INFO,
- "%s Scheduled UL Assignment polling on FN=%d\n",
- name(), poll_fn);
+ "%s Scheduled UL Assignment polling on FN=%d, TS=%d\n",
+ name(), poll_fn, poll_ts);
return msg;
}
diff --git a/src/tbf.h b/src/tbf.h
index f3487c6..d23cf93 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -177,6 +177,7 @@ struct gprs_rlcmac_tbf {
enum gprs_rlcmac_tbf_poll_state poll_state;
uint32_t poll_fn; /* frame number to poll */
+ uint8_t poll_ts; /* TS to poll */
gprs_rlc m_rlc;
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 21a042e..10b376f 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -594,6 +594,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
/* schedule polling */
poll_state = GPRS_RLCMAC_POLL_SCHED;
poll_fn = (fn + 13) % 2715648;
+ poll_ts = ts;
/* Clear poll timeout flag */
state_flags &= ~(1 << GPRS_RLCMAC_FLAG_TO_DL_ACK);
@@ -609,7 +610,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
LOGP(DRLCMACDL, LOGL_INFO,
"%s Scheduled Ack/Nack polling on FN=%d, TS=%d\n",
- name(), poll_fn, ts);
+ name(), poll_fn, poll_ts);
}
}
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 1ccfa27..4754e11 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -127,6 +127,7 @@ struct msgb *gprs_rlcmac_ul_tbf::create_ul_ack(uint32_t fn, uint8_t ts)
if (final) {
poll_state = GPRS_RLCMAC_POLL_SCHED;
poll_fn = (fn + 13) % 2715648;
+ poll_ts = ts;
/* waiting for final acknowledge */
ul_ack_state = GPRS_RLCMAC_UL_ACK_WAIT_ACK;
m_final_ack_sent = 1;