diff options
Diffstat (limited to 'libosmocore/src/gsm48.c')
-rw-r--r-- | libosmocore/src/gsm48.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libosmocore/src/gsm48.c b/libosmocore/src/gsm48.c index 783ff6a5d..7e510664b 100644 --- a/libosmocore/src/gsm48.c +++ b/libosmocore/src/gsm48.c @@ -305,3 +305,24 @@ int gsm48_mi_to_string(char *string, const int str_len, const uint8_t *mi, return str_cur - string; } + +void gsm48_parse_ra(struct gprs_ra_id *raid, const uint8_t *buf) +{ + raid->mcc = (buf[0] & 0xf) * 100; + raid->mcc += (buf[0] >> 4) * 10; + raid->mcc += (buf[1] & 0xf) * 1; + + /* I wonder who came up with the stupidity of encoding the MNC + * differently depending on how many digits its decimal number has! */ + if ((buf[1] >> 4) == 0xf) { + raid->mnc = (buf[2] & 0xf) * 10; + raid->mnc += (buf[2] >> 4) * 1; + } else { + raid->mnc = (buf[2] & 0xf) * 100; + raid->mnc += (buf[2] >> 4) * 10; + raid->mnc += (buf[1] >> 4) * 1; + } + + raid->lac = ntohs(*(uint16_t *)(buf + 3)); + raid->rac = buf[5]; +} |