aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bts.cpp15
-rw-r--r--tests/tbf/TbfTest.cpp5
2 files changed, 19 insertions, 1 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 25cbc60f..e1c6dccf 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -536,6 +536,21 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit,
if (is_11bit)
rach_frame_11bit();
+ /* Note: If a BTS is sending in a rach request it will be fully aware
+ * of the frame number. If the PCU is used in a BSC-co-located setup.
+ * The BSC will forward the incoming RACH request. The RACH request
+ * only contains the relative frame number (Fn % 42432) in its request
+ * reference. This PCU implementation has to fit both secenarious, so
+ * we need to assume that Fn is a relative frame number. */
+
+ /* Ensure that all following calculations are performed with the
+ * relative frame number */
+ Fn = Fn % 42432;
+
+ /* Restore the full frame number
+ * (See also 3GPP TS 44.018, section 10.5.2.38) */
+ Fn = Fn + m_cur_fn - m_cur_fn % 42432;
+
LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF on RACH, "
"so we provide one \n"
"ra=0x%02x Fn=%u qta=%d is_11bit=%d:\n", ra, Fn, qta, is_11bit);
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index aec6ef88..e367ce6c 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -42,6 +42,8 @@ extern "C" {
#include <errno.h>
+#define DUMMY_FN 2654167
+
void *tall_pcu_ctx;
int16_t spoof_mnc = 0, spoof_mcc = 0;
@@ -166,6 +168,7 @@ static void setup_bts(BTS *the_bts, uint8_t ts_no, uint8_t cs = 1)
trx = &bts->trx[0];
trx->pdch[ts_no].enable();
+ the_bts->set_current_frame_number(DUMMY_FN);
}
static gprs_rlcmac_dl_tbf *create_dl_tbf(BTS *the_bts, uint8_t ms_class,
@@ -1692,7 +1695,7 @@ static void test_tbf_single_phase()
{
BTS the_bts;
int ts_no = 7;
- uint32_t fn = 2654167; /* 17,25,9 */
+ uint32_t fn = DUMMY_FN; /* 17,25,9 */
uint32_t tlli = 0xf1223344;
const char *imsi = "0011223344";
uint16_t qta = 31;