diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-09-21 15:57:26 +0200 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2019-01-28 23:58:53 +0000 |
commit | d01ef75ab876d79c9a0a73cdefb4ccfc60bb47f8 (patch) | |
tree | a70dd6e1dd5096f822c3b1bf9a2e6b5c201994e8 /src/gsm/gsm23003.c | |
parent | 2033be8902f5540f4f0e28bf1b32fb7df0367c66 (diff) |
gsm0808: add BSSMAP Cell Identifier matching API
Add
* osmo_lai_cmp() (to use in gsm0808_cell_id_u_matches())
* osmo_cgi_cmp() (to use in gsm0808_cell_id_u_matches())
* gsm0808_cell_id_u_match() (to re-use for single IDs and lists)
* gsm0808_cell_ids_match()
* gsm0808_cell_id_matches_list()
* Unit tests in gsm0808_test.c
Rationale:
For inter-BSC handover, it is interesting to find matches between *differing*
Cell Identity kinds. For example, if a cell as CGI 23-42-3-5, and a HO for
LAC-CI 3-5 should be handled, we need to see the match.
This is most interesting for osmo-msc, i.e. to direct the BSSMAP Handover
Request towards the correct BSC or MSC.
It is also interesting for osmo-bsc's VTY interface, to be able to manage
cells' neighbors and to trigger manual handovers by various Cell Identity
handles, as the user would expect them.
Change-Id: I5535f0d149c2173294538df75764dd181b023312
Diffstat (limited to 'src/gsm/gsm23003.c')
-rw-r--r-- | src/gsm/gsm23003.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/gsm/gsm23003.c b/src/gsm/gsm23003.c index 1d9cefe6..95fca91a 100644 --- a/src/gsm/gsm23003.c +++ b/src/gsm/gsm23003.c @@ -324,6 +324,40 @@ int osmo_plmn_cmp(const struct osmo_plmn_id *a, const struct osmo_plmn_id *b) return osmo_mnc_cmp(a->mnc, a->mnc_3_digits, b->mnc, b->mnc_3_digits); } +/* Compare two LAI. + * The order of comparison is MCC, MNC, LAC. See also osmo_plmn_cmp(). + * \param a[in] "Left" side LAI. + * \param b[in] "Right" side LAI. + * \returns 0 if the LAI are equal, -1 if a < b, 1 if a > b. */ +int osmo_lai_cmp(const struct osmo_location_area_id *a, const struct osmo_location_area_id *b) +{ + int rc = osmo_plmn_cmp(&a->plmn, &b->plmn); + if (rc) + return rc; + if (a->lac < b->lac) + return -1; + if (a->lac > b->lac) + return 1; + return 0; +} + +/* Compare two CGI. + * The order of comparison is MCC, MNC, LAC, CI. See also osmo_lai_cmp(). + * \param a[in] "Left" side CGI. + * \param b[in] "Right" side CGI. + * \returns 0 if the CGI are equal, -1 if a < b, 1 if a > b. */ +int osmo_cgi_cmp(const struct osmo_cell_global_id *a, const struct osmo_cell_global_id *b) +{ + int rc = osmo_lai_cmp(&a->lai, &b->lai); + if (rc) + return rc; + if (a->cell_identity < b->cell_identity) + return -1; + if (a->cell_identity > b->cell_identity) + return 1; + return 0; +} + /*! Generate TS 23.003 Section 19.2 Home Network Realm/Domain (text form) * \param out[out] caller-provided output buffer, at least 33 bytes long * \param plmn[in] Osmocom representation of PLMN ID (MCC + MNC) |