<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>