diff options
author | Max <msuraev@sysmocom.de> | 2017-03-08 12:06:42 +0100 |
---|---|---|
committer | Max <msuraev@sysmocom.de> | 2017-03-13 11:25:14 +0000 |
commit | 5dd8d1bbd89cfaa10d8194502778deb96fe82184 (patch) | |
tree | 38facc7819fbad6d4bf6f50460faffecf42654ea | |
parent | 727295f20611bbc2d2bc5cd7341f73e0536ec46a (diff) |
bts.cpp: Fix overloading ambiguity
Fix error introduced in 1275a3f91a744e011b0dba82b09124d249c7abb5 by
using signed 32 bit integer which is enough for Frame Number in
GSM. Also, mark parameter constraints more explicitly:
- add assert for expected FN values
- don't perform computation for non-relative FN
The error was:
bts.cpp: In member function ‘uint32_t BTS::rfn_to_fn(uint32_t)’:
bts.cpp:554:25: error: call of overloaded ‘abs(uint32_t)’ is ambiguous
if (abs(rfn - m_cur_rfn) > RFN_THRESHOLD) {
^
In file included from /usr/include/c++/6/cstdlib:75:0,
from /usr/include/c++/6/stdlib.h:36,
from /usr/include/osmocom/core/linuxrbtree.h:97,
from /usr/include/osmocom/core/timer.h:35,
from ./bts.h:29,
from bts.cpp:21:
/usr/include/stdlib.h:735:12: note: candidate: int abs(int)
extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
^~~
In file included from /usr/include/c++/6/stdlib.h:36:0,
from /usr/include/osmocom/core/linuxrbtree.h:97,
from /usr/include/osmocom/core/timer.h:35,
from ./bts.h:29,
from bts.cpp:21:
/usr/include/c++/6/cstdlib:185:3: note: candidate: __int128 std::abs(__int128)
abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
^~~
/usr/include/c++/6/cstdlib:180:3: note: candidate: long long int std::abs(long long int)
abs(long long __x) { return __builtin_llabs (__x); }
^~~
/usr/include/c++/6/cstdlib:172:3: note: candidate: long int std::abs(long int)
abs(long __i) { return __builtin_labs(__i); }
Change-Id: Ib6d895a97aa35414f245ea4406c6e78f1b4fb5b8
-rw-r--r-- | src/bts.cpp | 15 | ||||
-rw-r--r-- | src/bts.h | 2 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 548d0009..c36647ec 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -521,11 +521,15 @@ int BTS::rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn) } /* Determine the full frame number from a relative frame number */ -uint32_t BTS::rfn_to_fn(uint32_t rfn) +uint32_t BTS::rfn_to_fn(int32_t rfn) { - uint32_t m_cur_rfn; - uint32_t fn; - uint32_t fn_rounded; + int32_t m_cur_rfn; + int32_t fn; + int32_t fn_rounded; + + /* double-check that relative FN is not negative and fits into int32_t */ + 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. @@ -536,7 +540,8 @@ uint32_t BTS::rfn_to_fn(uint32_t rfn) /* Ensure that all following calculations are performed with the * relative frame number */ - rfn = rfn % 42432; + if (rfn >= RFN_MODULUS) + return rfn; /* Compute an internal relative frame number from the full internal frame number */ @@ -350,7 +350,7 @@ public: uint8_t is_single_block(uint16_t ra, enum ph_burst_type burst_type, uint8_t is_11bit, uint16_t *ms_class, uint16_t *priority); - uint32_t rfn_to_fn(uint32_t rfn); + uint32_t rfn_to_fn(int32_t rfn); int rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit, enum ph_burst_type burst_type); |