diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-11-13 11:56:05 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-11-13 11:56:05 +0100 |
commit | b40a38ff46c1c6bfd8434ae346b892df3bd07efc (patch) | |
tree | bfc696abd07991464006c493e040057151b19249 /openbsc | |
parent | 5bde51b91ead6aee798f6194320ac9d1ec3b9a70 (diff) |
[ip.access] Parse cell global ID as part of BCCH info
Diffstat (limited to 'openbsc')
-rw-r--r-- | openbsc/include/openbsc/abis_nm.h | 11 | ||||
-rwxr-xr-x | openbsc/src/abis_nm.c | 23 |
2 files changed, 31 insertions, 3 deletions
diff --git a/openbsc/include/openbsc/abis_nm.h b/openbsc/include/openbsc/abis_nm.h index a9bfceee0..56f8e525a 100644 --- a/openbsc/include/openbsc/abis_nm.h +++ b/openbsc/include/openbsc/abis_nm.h @@ -684,9 +684,18 @@ enum ipac_bcch_info_type { IPAC_BINF_CELL_ALLOC = (1 << 2), }; +struct cell_global_id { + u_int16_t mcc; + u_int16_t mnc; + u_int16_t lac; + u_int16_t ci; +}; + /* The BCCH info from an ip.access test, in host byte order * and already parsed... */ struct ipac_bcch_info { + struct llist_head list; + u_int16_t info_type; u_int8_t freq_qual; u_int16_t arfcn; @@ -696,7 +705,7 @@ struct ipac_bcch_info { u_int16_t frame_offset; u_int32_t frame_nr_offset; u_int8_t bsic; - u_int8_t cgi[7]; + struct cell_global_id cgi; u_int8_t ba_list_si2[16]; u_int8_t ba_list_si2bis[16]; u_int8_t ba_list_si2ter[16]; diff --git a/openbsc/src/abis_nm.c b/openbsc/src/abis_nm.c index 3f4fabb4a..63fda92e0 100755 --- a/openbsc/src/abis_nm.c +++ b/openbsc/src/abis_nm.c @@ -2702,6 +2702,25 @@ const char *ipacc_testres_name(u_int8_t res) return "unknown"; } +void ipac_parse_cgi(struct cell_global_id *cid, const u_int8_t *buf) +{ + cid->mcc = (buf[0] & 0xf) * 100; + cid->mcc += (buf[0] >> 4) * 10; + cid->mcc += (buf[1] & 0xf) * 1; + + if (buf[1] >> 4 == 0xf) { + cid->mnc = (buf[2] & 0xf) * 10; + cid->mnc += (buf[2] >> 4) * 1; + } else { + cid->mnc = (buf[2] & 0xf) * 100; + cid->mnc += (buf[2] >> 4) * 10; + cid->mnc += (buf[1] >> 4) * 1; + } + + cid->lac = ntohs(buf+3); + cid->ci = ntohs(buf+5); +} + /* parse BCCH information IEI from wire format to struct ipac_bcch_info */ int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf) { @@ -2750,8 +2769,8 @@ int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf) binf->bsic = *cur++ & 0x3f; cur++; - memcpy(binf->cgi, cur, sizeof(binf->cgi)); - cur += sizeof(binf->cgi); + ipac_parse_cgi(&binf->cgi, cur); + cur += 7; if (binf->info_type & IPAC_BINF_NEIGH_BA_SI2) { memcpy(binf->ba_list_si2, cur, sizeof(binf->ba_list_si2)); |