<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21863">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
laforge: Looks good to me, but someone else must approve
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bssgp_rim: move bssgp_parse_rim_ri and bssgp_create_rim_ri to gprs_bssgp_rim<br><br>The function bssgp_parse_rim_ri() and bssgp_create_rim_ri() are located<br>in gprs_bssgp.c, since there is now a gprs_bssgp_rim.c module it makes<br>more sense to put them there. Also adjust the code a bit so that its<br>more intuitive to read.<br><br>Change-Id: Icd667f41d5735de56cd9fb257670337c679dd258<br>Related: SYS#5103<br>---<br>M include/osmocom/gprs/gprs_bssgp.h<br>M include/osmocom/gprs/gprs_bssgp_rim.h<br>M src/gb/gprs_bssgp.c<br>M src/gb/gprs_bssgp_rim.c<br>M tests/gb/gprs_bssgp_rim_test.c<br>M tests/gb/gprs_bssgp_rim_test.ok<br>M tests/gb/gprs_bssgp_test.c<br>M tests/gb/gprs_bssgp_test.ok<br>8 files changed, 312 insertions(+), 311 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h</span><br><span>index d228c53..9255661 100644</span><br><span>--- a/include/osmocom/gprs/gprs_bssgp.h</span><br><span>+++ b/include/osmocom/gprs/gprs_bssgp.h</span><br><span>@@ -178,37 +178,6 @@</span><br><span> int bssgp_create_cell_id(uint8_t *buf, const struct gprs_ra_id *raid,</span><br><span> uint16_t cid);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum bssgp_rim_routing_info_discr {</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP_RIM_ROUTING_INFO_GERAN,</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP_RIM_ROUTING_INFO_UTRAN,</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP_RIM_ROUTING_INFO_EUTRAN,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! BSSGP RIM Routing information, see also 3GPP TS 48.018, section 11.3.70 */</span><br><span style="color: hsl(0, 100%, 40%);">-struct bssgp_rim_routing_info {</span><br><span style="color: hsl(0, 100%, 40%);">- enum bssgp_rim_routing_info_discr discr;</span><br><span style="color: hsl(0, 100%, 40%);">- union {</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t cid;</span><br><span style="color: hsl(0, 100%, 40%);">- } geran;</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ra_id raid;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t rncid;</span><br><span style="color: hsl(0, 100%, 40%);">- } utran;</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_eutran_tai tai;</span><br><span style="color: hsl(0, 100%, 40%);">- /* See also 3GPP TS 36.413 9.2.1.37 and 3GPP TS 36.401 */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t global_enb_id[8];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t global_enb_id_len;</span><br><span style="color: hsl(0, 100%, 40%);">- } eutran;</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int len);</span><br><span style="color: hsl(0, 100%, 40%);">-int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Wrapper around TLV parser to parse BSSGP IEs */</span><br><span> static inline int bssgp_tlv_parse(struct tlv_parsed *tp, const uint8_t *buf, int len)</span><br><span> {</span><br><span>diff --git a/include/osmocom/gprs/gprs_bssgp_rim.h b/include/osmocom/gprs/gprs_bssgp_rim.h</span><br><span>index 0612a91..7f3a0e4 100644</span><br><span>--- a/include/osmocom/gprs/gprs_bssgp_rim.h</span><br><span>+++ b/include/osmocom/gprs/gprs_bssgp_rim.h</span><br><span>@@ -27,6 +27,36 @@</span><br><span> </span><br><span> #include <osmocom/gprs/protocol/gsm_08_18.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum bssgp_rim_routing_info_discr {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP_RIM_ROUTING_INFO_GERAN,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP_RIM_ROUTING_INFO_UTRAN,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP_RIM_ROUTING_INFO_EUTRAN,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BSSGP RIM Routing information, see also 3GPP TS 48.018, section 11.3.70 */</span><br><span style="color: hsl(120, 100%, 40%);">+struct bssgp_rim_routing_info {</span><br><span style="color: hsl(120, 100%, 40%);">+ enum bssgp_rim_routing_info_discr discr;</span><br><span style="color: hsl(120, 100%, 40%);">+ union {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ra_id raid;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t cid;</span><br><span style="color: hsl(120, 100%, 40%);">+ } geran;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ra_id raid;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t rncid;</span><br><span style="color: hsl(120, 100%, 40%);">+ } utran;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_eutran_tai tai;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* See also 3GPP TS 36.413 9.2.1.37 and 3GPP TS 36.401 */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t global_enb_id[8];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t global_enb_id_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ } eutran;</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf, unsigned int len);</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* 3GPP TS 48.018, table 11.3.63.1.1: RAN-INFORMATION-REQUEST Application Container coding for NACC */</span><br><span> struct bssgp_ran_inf_req_app_cont_nacc {</span><br><span> struct osmo_cell_global_id_ps reprt_cell;</span><br><span>diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c</span><br><span>index 530c702..4551427 100644</span><br><span>--- a/src/gb/gprs_bssgp.c</span><br><span>+++ b/src/gb/gprs_bssgp.c</span><br><span>@@ -326,97 +326,6 @@</span><br><span> return 8;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Parse a RIM Routing information IE (3GPP TS 48.018, chapter 11.3.70).</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[out] ri user provided memory to store the parsed results.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] buf input buffer of the value part of the IE.</span><br><span style="color: hsl(0, 100%, 40%);">- * \returns length of parsed octets, -EINVAL on error. */</span><br><span style="color: hsl(0, 100%, 40%);">-int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ra_id raid_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(ri, 0, sizeof(*ri));</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 2)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ri->discr = buf[0] & 0x0f;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (ri->discr) {</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 9)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- ri->geran.cid = bssgp_parse_cell_id(&ri->geran.raid, buf + 1);</span><br><span style="color: hsl(0, 100%, 40%);">- return 9;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 9)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_parse_ra(&ri->utran.raid, buf + 1);</span><br><span style="color: hsl(0, 100%, 40%);">- ri->utran.rncid = osmo_load16be(buf + 7);</span><br><span style="color: hsl(0, 100%, 40%);">- return 9;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 7 || len > 14)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Note: 3GPP TS 24.301 Figure 9.9.3.32.1 and 3GPP TS 24.008</span><br><span style="color: hsl(0, 100%, 40%);">- * Figure 10.5.130 specify MCC/MNC encoding in the same way,</span><br><span style="color: hsl(0, 100%, 40%);">- * so we can re-use gsm48_parse_ra() for that. */</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_parse_ra(&raid_temp, buf + 1);</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.tai.mcc = raid_temp.mcc;</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.tai.mnc = raid_temp.mnc;</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.tai.mnc_3_digits = raid_temp.mnc_3_digits;</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.tai.tac = osmo_load16be(buf + 4);</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(ri->eutran.global_enb_id, buf + 6, len - 6);</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.global_enb_id_len = len - 6;</span><br><span style="color: hsl(0, 100%, 40%);">- return len;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! Encode a RIM Routing information IE (3GPP TS 48.018, chapter 11.3.70).</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[out] buf user provided memory (at least 14 byte) for the generated value part of the IE.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] ri user provided input data struct.</span><br><span style="color: hsl(0, 100%, 40%);">- * \returns length of encoded octets, -EINVAL on error. */</span><br><span style="color: hsl(0, 100%, 40%);">-int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ra_id raid_temp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- buf[0] = ri->discr & 0x0f;</span><br><span style="color: hsl(0, 100%, 40%);">- buf++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (ri->discr) {</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_create_cell_id(buf, &ri->geran.raid, ri->geran.cid);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- return rc + 1;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_encode_ra((struct gsm48_ra_id *)buf, &ri->utran.raid);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_store16be(ri->utran.rncid, buf + 6);</span><br><span style="color: hsl(0, 100%, 40%);">- return 9;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Note: 3GPP TS 24.301 Figure 9.9.3.32.1 and 3GPP TS 24.008</span><br><span style="color: hsl(0, 100%, 40%);">- * Figure 10.5.130 specify MCC/MNC encoding in the same way,</span><br><span style="color: hsl(0, 100%, 40%);">- * so we can re-use gsm48_encode_ra() for that. */</span><br><span style="color: hsl(0, 100%, 40%);">- raid_temp = (struct gprs_ra_id) {</span><br><span style="color: hsl(0, 100%, 40%);">- .mcc = ri->eutran.tai.mcc,</span><br><span style="color: hsl(0, 100%, 40%);">- .mnc = ri->eutran.tai.mnc,</span><br><span style="color: hsl(0, 100%, 40%);">- .mnc_3_digits = ri->eutran.tai.mnc_3_digits,</span><br><span style="color: hsl(0, 100%, 40%);">- /* TAC is encoded in the same way as LAC */</span><br><span style="color: hsl(0, 100%, 40%);">- .lac = ri->eutran.tai.tac,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_encode_ra((struct gsm48_ra_id *)buf, &raid_temp);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(ri->eutran.global_enb_id_len <=</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(ri->eutran.global_enb_id));</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(buf + 5, ri->eutran.global_enb_id,</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.global_enb_id_len);</span><br><span style="color: hsl(0, 100%, 40%);">- return ri->eutran.global_enb_id_len + 6;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Chapter 8.4 BVC-Reset Procedure */</span><br><span> static int bssgp_rx_bvc_reset(struct msgb *msg, struct tlv_parsed *tp,</span><br><span> uint16_t ns_bvci)</span><br><span>diff --git a/src/gb/gprs_bssgp_rim.c b/src/gb/gprs_bssgp_rim.c</span><br><span>index 3ac405e..0dc6d21 100644</span><br><span>--- a/src/gb/gprs_bssgp_rim.c</span><br><span>+++ b/src/gb/gprs_bssgp_rim.c</span><br><span>@@ -41,6 +41,97 @@</span><br><span> * (3GPP TS 48.018, sub-clause 11.3.9) but without IE and length octets. */</span><br><span> #define REP_CELL_ID_LEN 8</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Parse a RIM Routing information IE (3GPP TS 48.018, chapter 11.3.70).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] ri user provided memory to store the parsed results.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] buf input buffer of the value part of the IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns length of parsed octets, -EINVAL on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf,</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ra_id raid_temp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(ri, 0, sizeof(*ri));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < 2)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->discr = buf[0] & 0x0f;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (ri->discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < 9)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->geran.cid = bssgp_parse_cell_id(&ri->geran.raid, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 9;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < 9)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_parse_ra(&ri->utran.raid, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->utran.rncid = osmo_load16be(buf + 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 9;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < 7 || len > 14)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Note: 3GPP TS 24.301 Figure 9.9.3.32.1 and 3GPP TS 24.008</span><br><span style="color: hsl(120, 100%, 40%);">+ * Figure 10.5.130 specify MCC/MNC encoding in the same way,</span><br><span style="color: hsl(120, 100%, 40%);">+ * so we can re-use gsm48_parse_ra() for that. */</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_parse_ra(&raid_temp, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.tai.mcc = raid_temp.mcc;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.tai.mnc = raid_temp.mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.tai.mnc_3_digits = raid_temp.mnc_3_digits;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.tai.tac = osmo_load16be(buf + 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(ri->eutran.global_enb_id, buf + 5, len - 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.global_enb_id_len = len - 6;</span><br><span style="color: hsl(120, 100%, 40%);">+ return len;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Encode a RIM Routing information IE (3GPP TS 48.018, chapter 11.3.70).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] buf user provided memory (at least 14 byte) for the generated value part of the IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] ri user provided input data struct.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns length of encoded octets, -EINVAL on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_create_rim_ri(uint8_t *buf, const struct bssgp_rim_routing_info *ri)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ra_id raid_temp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[0] = ri->discr & 0x0f;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (ri->discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_create_cell_id(buf, &ri->geran.raid, ri->geran.cid);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_encode_ra((struct gsm48_ra_id *)buf, &ri->utran.raid);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_store16be(ri->utran.rncid, buf + 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 9;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Note: 3GPP TS 24.301 Figure 9.9.3.32.1 and 3GPP TS 24.008</span><br><span style="color: hsl(120, 100%, 40%);">+ * Figure 10.5.130 specify MCC/MNC encoding in the same way,</span><br><span style="color: hsl(120, 100%, 40%);">+ * so we can re-use gsm48_encode_ra() for that. */</span><br><span style="color: hsl(120, 100%, 40%);">+ raid_temp = (struct gprs_ra_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+ .mcc = ri->eutran.tai.mcc,</span><br><span style="color: hsl(120, 100%, 40%);">+ .mnc = ri->eutran.tai.mnc,</span><br><span style="color: hsl(120, 100%, 40%);">+ .mnc_3_digits = ri->eutran.tai.mnc_3_digits,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_encode_ra((struct gsm48_ra_id *)buf, &raid_temp);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_store16be(ri->eutran.tai.tac, buf + 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ri->eutran.global_enb_id_len <=</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(ri->eutran.global_enb_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(buf + 5, ri->eutran.global_enb_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.global_enb_id_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ri->eutran.global_enb_id_len + 6;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Decode a RAN Information Request Application Container for NACC (3GPP TS 48.018, section 11.3.63.1.1).</span><br><span> * \param[out] user provided memory for decoded data struct.</span><br><span> * \param[in] buf user provided memory with the encoded value data of the IE.</span><br><span>diff --git a/tests/gb/gprs_bssgp_rim_test.c b/tests/gb/gprs_bssgp_rim_test.c</span><br><span>index 8c6a00d..d08421b 100644</span><br><span>--- a/tests/gb/gprs_bssgp_rim_test.c</span><br><span>+++ b/tests/gb/gprs_bssgp_rim_test.c</span><br><span>@@ -24,6 +24,137 @@</span><br><span> #include <string.h></span><br><span> #include <unistd.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void dump_rim_ri(struct bssgp_rim_routing_info *ri)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (ri->discr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("GERAN cell identifier\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * mcc: %u\n", ri->geran.raid.mcc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc: %u\n", ri->geran.raid.mnc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc 3 digits: %u\n", ri->geran.raid.mnc_3_digits);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" lac: %u\n", ri->geran.raid.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" rac: %u\n", ri->geran.raid.rac);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * cell id: %04x\n", ri->geran.cid);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("UTRAN RNC identifier\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * mcc: %u\n", ri->utran.raid.mcc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc: %u\n", ri->utran.raid.mnc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc 3 digits: %u\n", ri->utran.raid.mnc_3_digits);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" lac: %u\n", ri->utran.raid.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" rac: %u\n", ri->utran.raid.rac);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * rnc id: %04x\n", ri->utran.rncid);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("EUTRAN eNB identifier\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * mcc: %u\n", ri->eutran.tai.mcc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc: %u\n", ri->eutran.tai.mnc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" mnc 3 digits: %u\n", ri->eutran.tai.mnc_3_digits);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" tac: %u\n", ri->eutran.tai.tac);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * global_enb_id: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump_nospc(ri->eutran.global_enb_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ ri->eutran.global_enb_id_len));</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_bssgp_parse_rim_ri()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bssgp_rim_routing_info result;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t testvec_geran[] =</span><br><span style="color: hsl(120, 100%, 40%);">+ { 0x00, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t testvec_utran[] =</span><br><span style="color: hsl(120, 100%, 40%);">+ { 0x01, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t testvec_eutran[] =</span><br><span style="color: hsl(120, 100%, 40%);">+ { 0x02, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("----- %s START\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_parse_rim_ri(&result, testvec_geran,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(testvec_geran));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&result);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_parse_rim_ri(&result, testvec_utran,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(testvec_utran));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&result);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_parse_rim_ri(&result, testvec_eutran,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(testvec_eutran));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&result);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("----- %s END\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_bssgp_create_rim_ri()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bssgp_rim_routing_info ri;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t result[15];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("----- %s START\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(result, 0, sizeof(result));</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.discr = BSSGP_RIM_ROUTING_INFO_GERAN;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.raid.mcc = 262;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.raid.mnc = 42;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.raid.mnc_3_digits = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.raid.lac = 13200;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.raid.rac = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.geran.cid = 0x51e1;</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d, ", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(result, 0, sizeof(result));</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.discr = BSSGP_RIM_ROUTING_INFO_UTRAN;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.raid.mcc = 262;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.raid.mnc = 42;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.raid.mnc_3_digits = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.raid.lac = 13200;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.raid.rac = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.utran.rncid = 0x51e1;</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d, ", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(result, 0, sizeof(result));</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.discr = BSSGP_RIM_ROUTING_INFO_EUTRAN;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.tai.mcc = 262;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.tai.mnc = 42;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.tai.mnc_3_digits = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.tai.tac = 13200;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.global_enb_id[0] = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.global_enb_id[1] = 0x51;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.global_enb_id[2] = 0xe1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ri.eutran.global_enb_id_len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_rim_ri(&ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("rc=%d, ", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("----- %s END\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void dump_bssgp_ran_inf_req_app_cont_nacc(struct bssgp_ran_inf_req_app_cont_nacc *app_cont)</span><br><span> {</span><br><span> printf(" app_cont: bssgp_ran_inf_req_app_cont_nacc:\n");</span><br><span>@@ -636,6 +767,10 @@</span><br><span> {</span><br><span> printf("===== BSSGP RIM test START\n");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* RIM routing information */</span><br><span style="color: hsl(120, 100%, 40%);">+ test_bssgp_parse_rim_ri();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_bssgp_create_rim_ri();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* RIM containers */</span><br><span> test_bssgp_dec_ran_inf_req_rim_cont_nacc();</span><br><span> test_bssgp_enc_ran_inf_req_rim_cont_nacc();</span><br><span>diff --git a/tests/gb/gprs_bssgp_rim_test.ok b/tests/gb/gprs_bssgp_rim_test.ok</span><br><span>index d075ca3..df5a41d 100644</span><br><span>--- a/tests/gb/gprs_bssgp_rim_test.ok</span><br><span>+++ b/tests/gb/gprs_bssgp_rim_test.ok</span><br><span>@@ -1,4 +1,60 @@</span><br><span> ===== BSSGP RIM test START</span><br><span style="color: hsl(120, 100%, 40%);">+----- test_bssgp_parse_rim_ri START</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+GERAN cell identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ lac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ rac: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * cell id: 51e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+UTRAN RNC identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ lac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ rac: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * rnc id: 51e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+EUTRAN eNB identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ tac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ * global_enb_id: 0051e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+----- test_bssgp_parse_rim_ri END</span><br><span style="color: hsl(120, 100%, 40%);">+----- test_bssgp_create_rim_ri START</span><br><span style="color: hsl(120, 100%, 40%);">+GERAN cell identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ lac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ rac: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * cell id: 51e1</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9, result=0062f22433900051e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+UTRAN RNC identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ lac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ rac: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * rnc id: 51e1</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9, result=0162f22433900051e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EUTRAN eNB identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ * mcc: 262</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc: 42</span><br><span style="color: hsl(120, 100%, 40%);">+ mnc 3 digits: 0</span><br><span style="color: hsl(120, 100%, 40%);">+ tac: 13200</span><br><span style="color: hsl(120, 100%, 40%);">+ * global_enb_id: 0051e1</span><br><span style="color: hsl(120, 100%, 40%);">+rc=9, result=0262f22433900051e1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+----- test_bssgp_create_rim_ri END</span><br><span> ----- test_bssgp_dec_ran_inf_req_rim_cont_nacc START</span><br><span> rc=0, bssgp_ran_inf_req_rim_cont:</span><br><span> app_id = 01</span><br><span>diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c</span><br><span>index e1c920a..52e986e 100644</span><br><span>--- a/tests/gb/gprs_bssgp_test.c</span><br><span>+++ b/tests/gb/gprs_bssgp_test.c</span><br><span>@@ -289,137 +289,6 @@</span><br><span> printf("----- %s END\n", __func__);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void dump_rim_ri(struct bssgp_rim_routing_info *ri)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- switch (ri->discr) {</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_GERAN:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("GERAN cell identifier\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * mcc: %u\n", ri->geran.raid.mcc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc: %u\n", ri->geran.raid.mnc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc 3 digits: %u\n", ri->geran.raid.mnc_3_digits);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" lac: %u\n", ri->geran.raid.lac);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" rac: %u\n", ri->geran.raid.rac);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * cell id: %04x\n", ri->geran.cid);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_UTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("UTRAN RNC identifier\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * mcc: %u\n", ri->utran.raid.mcc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc: %u\n", ri->utran.raid.mnc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc 3 digits: %u\n", ri->utran.raid.mnc_3_digits);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" lac: %u\n", ri->utran.raid.lac);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" rac: %u\n", ri->utran.raid.rac);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * rnc id: %04x\n", ri->utran.rncid);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case BSSGP_RIM_ROUTING_INFO_EUTRAN:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("EUTRAN eNB identifier\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * mcc: %u\n", ri->eutran.tai.mcc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc: %u\n", ri->eutran.tai.mnc);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" mnc 3 digits: %u\n", ri->eutran.tai.mnc_3_digits);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" tac: %u\n", ri->eutran.tai.tac);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" * global_enb_id: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump_nospc(ri->eutran.global_enb_id,</span><br><span style="color: hsl(0, 100%, 40%);">- ri->eutran.global_enb_id_len));</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(false);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_bssgp_parse_rim_ri()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bssgp_rim_routing_info result;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t testvec_geran[] =</span><br><span style="color: hsl(0, 100%, 40%);">- { 0x00, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t testvec_utran[] =</span><br><span style="color: hsl(0, 100%, 40%);">- { 0x01, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t testvec_eutran[] =</span><br><span style="color: hsl(0, 100%, 40%);">- { 0x02, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("----- %s START\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_parse_rim_ri(&result, testvec_geran,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(testvec_geran));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&result);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_parse_rim_ri(&result, testvec_utran,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(testvec_utran));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&result);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_parse_rim_ri(&result, testvec_eutran,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(testvec_eutran));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&result);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("----- %s END\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_bssgp_create_rim_ri()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bssgp_rim_routing_info ri;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t result[15];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("----- %s START\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">- memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(0, 100%, 40%);">- memset(result, 0, sizeof(result));</span><br><span style="color: hsl(0, 100%, 40%);">- ri.discr = BSSGP_RIM_ROUTING_INFO_GERAN;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.raid.mcc = 262;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.raid.mnc = 42;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.raid.mnc_3_digits = false;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.raid.lac = 13200;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.raid.rac = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.geran.cid = 0x51e1;</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&ri);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d, ", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc > 0)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(0, 100%, 40%);">- memset(result, 0, sizeof(result));</span><br><span style="color: hsl(0, 100%, 40%);">- ri.discr = BSSGP_RIM_ROUTING_INFO_UTRAN;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.raid.mcc = 262;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.raid.mnc = 42;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.raid.mnc_3_digits = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.raid.lac = 13200;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.raid.rac = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.utran.rncid = 0x51e1;</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&ri);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d, ", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc > 0)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(&ri, 0, sizeof(ri));</span><br><span style="color: hsl(0, 100%, 40%);">- memset(result, 0, sizeof(result));</span><br><span style="color: hsl(0, 100%, 40%);">- ri.discr = BSSGP_RIM_ROUTING_INFO_EUTRAN;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.tai.mcc = 262;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.tai.mnc = 42;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.tai.mnc_3_digits = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.tai.tac = 13200;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.global_enb_id[0] = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.global_enb_id[1] = 0x51;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.global_enb_id[2] = 0xe1;</span><br><span style="color: hsl(0, 100%, 40%);">- ri.eutran.global_enb_id_len = 3;</span><br><span style="color: hsl(0, 100%, 40%);">- dump_rim_ri(&ri);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_create_rim_ri(result, &ri);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("rc=%d, ", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc > 0)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("result=%s", osmo_hexdump_nospc(result, rc));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("----- %s END\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static struct log_info info = {};</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>@@ -448,8 +317,6 @@</span><br><span> test_bssgp_bad_reset();</span><br><span> test_bssgp_flow_control_bvc();</span><br><span> test_bssgp_msgb_copy();</span><br><span style="color: hsl(0, 100%, 40%);">- test_bssgp_parse_rim_ri();</span><br><span style="color: hsl(0, 100%, 40%);">- test_bssgp_create_rim_ri();</span><br><span> printf("===== BSSGP test END\n\n");</span><br><span> </span><br><span> exit(EXIT_SUCCESS);</span><br><span>diff --git a/tests/gb/gprs_bssgp_test.ok b/tests/gb/gprs_bssgp_test.ok</span><br><span>index 744f1a7..c5b3e7d 100644</span><br><span>--- a/tests/gb/gprs_bssgp_test.ok</span><br><span>+++ b/tests/gb/gprs_bssgp_test.ok</span><br><span>@@ -17,61 +17,5 @@</span><br><span> Old msgb: [L3]> 22 04 82 00 02 07 81 08 </span><br><span> New msgb: [L3]> 22 04 82 00 02 07 81 08 </span><br><span> ----- test_bssgp_msgb_copy END</span><br><span>------ test_bssgp_parse_rim_ri START</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9</span><br><span style="color: hsl(0, 100%, 40%);">-GERAN cell identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- lac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- rac: 0</span><br><span style="color: hsl(0, 100%, 40%);">- * cell id: 51e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9</span><br><span style="color: hsl(0, 100%, 40%);">-UTRAN RNC identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- lac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- rac: 0</span><br><span style="color: hsl(0, 100%, 40%);">- * rnc id: 51e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9</span><br><span style="color: hsl(0, 100%, 40%);">-EUTRAN eNB identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- tac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- * global_enb_id: 0051e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>------ test_bssgp_parse_rim_ri END</span><br><span>------ test_bssgp_create_rim_ri START</span><br><span style="color: hsl(0, 100%, 40%);">-GERAN cell identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- lac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- rac: 0</span><br><span style="color: hsl(0, 100%, 40%);">- * cell id: 51e1</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9, result=0062f22433900051e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-UTRAN RNC identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- lac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- rac: 0</span><br><span style="color: hsl(0, 100%, 40%);">- * rnc id: 51e1</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9, result=0162f22433900051e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-EUTRAN eNB identifier</span><br><span style="color: hsl(0, 100%, 40%);">- * mcc: 262</span><br><span style="color: hsl(0, 100%, 40%);">- mnc: 42</span><br><span style="color: hsl(0, 100%, 40%);">- mnc 3 digits: 0</span><br><span style="color: hsl(0, 100%, 40%);">- tac: 13200</span><br><span style="color: hsl(0, 100%, 40%);">- * global_enb_id: 0051e1</span><br><span style="color: hsl(0, 100%, 40%);">-rc=9, result=0262f22433900051e1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>------ test_bssgp_create_rim_ri END</span><br><span> ===== BSSGP test END</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21863">change 21863</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/21863"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Icd667f41d5735de56cd9fb257670337c679dd258 </div>
<div style="display:none"> Gerrit-Change-Number: 21863 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>