<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21721">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_bssgp: add IE parser 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/osmocom/gprs/gprs_bssgp.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>6 files changed, 190 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/21/21721/1</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 dfbd9b7..662685e 100644</span><br><span>--- a/include/osmocom/gprs/gprs_bssgp.h</span><br><span>+++ b/include/osmocom/gprs/gprs_bssgp.h</span><br><span>@@ -175,6 +175,41 @@</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 */</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 {</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%);">+                 } tai;</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* See also 3GPP TS 36.413 9.2.1.37 */</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%);">+</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/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c</span><br><span>index 696c451..d73696c 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,59 @@</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 0;</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 -1;</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%);">+             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%);">+            if (len < 9)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -1;</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%);">+             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%);">+           if (len < 7)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (len > 15)</span><br><span style="color: hsl(120, 100%, 40%);">+                      return -1;</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%);">+           break;</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%);">+   return 0;</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 f8ad901..48d8371 100644</span><br><span>--- a/src/gb/libosmogb.map</span><br><span>+++ b/src/gb/libosmogb.map</span><br><span>@@ -13,6 +13,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..9f0f87f 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,76 @@</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=%u\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=%u\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=%u\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> static struct log_info info = {};</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>@@ -317,6 +387,7 @@</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>   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..40b8dfe 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,33 @@</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> ===== 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: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>