diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2023-01-05 12:04:55 +0100 |
---|---|---|
committer | Philipp Maier <pmaier@sysmocom.de> | 2023-01-05 16:58:20 +0100 |
commit | a42521dfbbe59cfc7bbcec7b562e7a71bf3c7232 (patch) | |
tree | 8cda106adc4a8d8c5d79e9b79ddd7497b00f2280 | |
parent | 39f5e274121f2c822b1ac8d543db6eb343da0886 (diff) |
bts: use GSM_TDMA_FN_ macros and uint32_t in bts_rfn_to_fn
The function bts_rfn_to_fn() uses int32_t for its internal variables and
the input parameter rfn while the callers and everything outside uses
uint32_t to store frame numbers. Lets convert this to uint32_t and use
GSM_TDMA_FN_ macros wherever possible.
Change-Id: Iedd493bb30dd1c342dec031883060c545432e740
Related: OS#5198
-rw-r--r-- | src/bts.cpp | 23 | ||||
-rw-r--r-- | src/bts.h | 2 |
2 files changed, 11 insertions, 14 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 650d4a37..d5d814db 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -716,15 +716,14 @@ int bts_rcv_imm_ass_cnf(struct gprs_rlcmac_bts *bts, const uint8_t *data, uint32 } /* Determine the full frame number from a relative frame number */ -uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn) +uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, uint32_t rfn) { - int32_t m_cur_rfn; - int32_t fn; - int32_t fn_rounded; + uint32_t m_cur_rfn; + uint32_t fn_rounded; - /* double-check that relative FN is not negative and fits into int32_t */ + /* make sure RFN does not exceed the maximum possible value of a valid + * GSM frame number. */ OSMO_ASSERT(rfn < GSM_MAX_FN); - OSMO_ASSERT(rfn >= 0); /* 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. @@ -744,13 +743,13 @@ uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn) /* Compute a "rounded" version of the internal frame number, which * exactly fits in the RFN_MODULUS raster */ - fn_rounded = bts->cur_fn - m_cur_rfn; + fn_rounded = GSM_TDMA_FN_SUB(bts->cur_fn, m_cur_rfn); /* If the delta between the internal and the external relative frame * number exceeds a certain limit, we need to assume that the incoming * rach request belongs to a the previous rfn period. To correct this, * we roll back the rounded frame number by one RFN_MODULUS */ - if (abs(rfn - m_cur_rfn) > RFN_THRESHOLD) { + if (GSM_TDMA_FN_DIFF(rfn, m_cur_rfn) > RFN_THRESHOLD) { LOGP(DRLCMAC, LOGL_DEBUG, "Race condition between rfn (%u) and m_cur_fn (%u) detected: rfn belongs to the previous modulus %u cycle, wrapping...\n", rfn, bts->cur_fn, RFN_MODULUS); @@ -758,17 +757,15 @@ uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn) LOGP(DRLCMAC, LOGL_DEBUG, "Cornercase detected: wrapping crosses %u border\n", GSM_MAX_FN); - fn_rounded = GSM_MAX_FN - (RFN_MODULUS - fn_rounded); + fn_rounded = GSM_TDMA_FN_SUB(GSM_MAX_FN, (GSM_TDMA_FN_SUB(RFN_MODULUS, fn_rounded))); } else - fn_rounded -= RFN_MODULUS; + fn_rounded = GSM_TDMA_FN_SUB(fn_rounded, RFN_MODULUS); } /* The real frame number is the sum of the rounded frame number and the * relative framenumber computed via RACH */ - fn = fn_rounded + rfn; - - return fn; + return GSM_TDMA_FN_SUM(fn_rounded, rfn); } /* 3GPP TS 44.060: @@ -296,7 +296,7 @@ struct paging_req_cs { struct GprsMs *bts_alloc_ms(struct gprs_rlcmac_bts *bts, uint8_t ms_class, uint8_t egprs_ms_class); int bts_add_paging(struct gprs_rlcmac_bts *bts, const struct paging_req_cs *req, struct GprsMs *ms); -uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn); +uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, uint32_t rfn); struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts); struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts); |