<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21721">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_bssgp: add IE parser/generator for RIM Routing Information<br><br>The RIM Routing Information IE (see also 3GPP TS 48.018, section<br>11.3.70) is used to control the flow of BSSGP rim messages at the SGSN.<br><br>Change-Id: I6f88a9aeeb50a612d32e9efd23040c9740bc4f11<br>Related: SYS#5103<br>---<br>M include/Makefile.am<br>M include/osmocom/gprs/gprs_bssgp.h<br>A include/osmocom/gprs/protocol/gsm_24_301.h<br>M src/gb/gprs_bssgp.c<br>M src/gb/libosmogb.map<br>M tests/Makefile.am<br>M tests/gb/gprs_bssgp_test.c<br>M tests/gb/gprs_bssgp_test.ok<br>8 files changed, 324 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/Makefile.am b/include/Makefile.am</span><br><span>index 0cb9cd2..842b872 100644</span><br><span>--- a/include/Makefile.am</span><br><span>+++ b/include/Makefile.am</span><br><span>@@ -76,6 +76,7 @@</span><br><span>                        osmocom/gprs/protocol/gsm_04_60.h \</span><br><span>                        osmocom/gprs/protocol/gsm_08_16.h \</span><br><span>                        osmocom/gprs/protocol/gsm_08_18.h \</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmocom/gprs/protocol/gsm_24_301.h \</span><br><span>                        osmocom/gsm/a5.h \</span><br><span>                        osmocom/gsm/abis_nm.h \</span><br><span>                        osmocom/gsm/apn.h \</span><br><span>diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h</span><br><span>index dfbd9b7..7077044 100644</span><br><span>--- a/include/osmocom/gprs/gprs_bssgp.h</span><br><span>+++ b/include/osmocom/gprs/gprs_bssgp.h</span><br><span>@@ -10,6 +10,7 @@</span><br><span> #include <osmocom/gsm/prim.h></span><br><span> </span><br><span> #include <osmocom/gprs/protocol/gsm_08_18.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/protocol/gsm_24_301.h></span><br><span> </span><br><span> /* gprs_bssgp_util.c */</span><br><span> </span><br><span>@@ -175,6 +176,37 @@</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(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,</span><br><span style="color: hsl(120, 100%, 40%);">+                      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> /* 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/protocol/gsm_24_301.h b/include/osmocom/gprs/protocol/gsm_24_301.h</span><br><span>new file mode 100644</span><br><span>index 0000000..d4bcd87</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/gprs/protocol/gsm_24_301.h</span><br><span>@@ -0,0 +1,11 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \file gsm_24_301.h */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Tracking area TS 24.301, section 9.9.3.32 */</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_eutran_tai {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t mcc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool mnc_3_digits;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t tac;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c</span><br><span>index 696c451..09f6373 100644</span><br><span>--- a/src/gb/gprs_bssgp.c</span><br><span>+++ b/src/gb/gprs_bssgp.c</span><br><span>@@ -326,6 +326,93 @@</span><br><span>    return 8;</span><br><span> }</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%);">+</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 + 1);</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 + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+              ri->utran.rncid = osmo_load16be(buf + 7);</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 + 1);</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 + 4);</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(ri->eutran.global_enb_id, buf + 6, 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.mcc = ri->eutran.tai.mcc;</span><br><span style="color: hsl(120, 100%, 40%);">+                raid_temp.mnc = ri->eutran.tai.mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+                raid_temp.mnc_3_digits = ri->eutran.tai.mnc_3_digits;</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> /* 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/libosmogb.map b/src/gb/libosmogb.map</span><br><span>index 59405b0..8f638ff 100644</span><br><span>--- a/src/gb/libosmogb.map</span><br><span>+++ b/src/gb/libosmogb.map</span><br><span>@@ -2,6 +2,7 @@</span><br><span> global:</span><br><span> bssgp_cause_str;</span><br><span> bssgp_create_cell_id;</span><br><span style="color: hsl(120, 100%, 40%);">+bssgp_create_rim_ri;</span><br><span> bssgp_pdu_str;</span><br><span> bssgp_fc_in;</span><br><span> bssgp_fc_init;</span><br><span>@@ -13,6 +14,7 @@</span><br><span> bssgp_msgb_tlli_put;</span><br><span> bssgp_msgb_ra_put;</span><br><span> bssgp_parse_cell_id;</span><br><span style="color: hsl(120, 100%, 40%);">+bssgp_parse_rim_ri;</span><br><span> bssgp_set_bssgp_callback;</span><br><span> bssgp_tx_bvc_block;</span><br><span> bssgp_tx_bvc_reset;</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index ed87aca..cb683f7 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -172,7 +172,8 @@</span><br><span> gb_gprs_bssgp_test_SOURCES = gb/gprs_bssgp_test.c</span><br><span> gb_gprs_bssgp_test_LDADD = $(LDADD) $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DLSYM) \</span><br><span>                            $(top_builddir)/src/vty/libosmovty.la \</span><br><span style="color: hsl(0, 100%, 40%);">-                         $(top_builddir)/src/gsm/libosmogsm.la</span><br><span style="color: hsl(120, 100%, 40%);">+                         $(top_builddir)/src/gsm/libosmogsm.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(top_builddir)/src/gb/libosmogb.la</span><br><span> </span><br><span> gb_gprs_ns_test_SOURCES = gb/gprs_ns_test.c</span><br><span> gb_gprs_ns_test_LDADD = $(LDADD) $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DLSYM) \</span><br><span>diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c</span><br><span>index 52e986e..e1c920a 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,6 +289,137 @@</span><br><span>    printf("----- %s END\n", __func__);</span><br><span> }</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> static struct log_info info = {};</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>@@ -317,6 +448,8 @@</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(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>  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 c5b3e7d..744f1a7 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,5 +17,61 @@</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 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> ===== BSSGP test END</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21721">change 21721</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/+/21721"/><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: I6f88a9aeeb50a612d32e9efd23040c9740bc4f11 </div>
<div style="display:none"> Gerrit-Change-Number: 21721 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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>