diff options
-rw-r--r-- | src/bts.cpp | 15 | ||||
-rw-r--r-- | tests/tbf/TbfTest.cpp | 5 |
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; |