Change in libosmocore[master]: gprs_bssgp: add IE parser for RIM Routing Information

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

dexter gerrit-no-reply at lists.osmocom.org
Mon Dec 14 22:58:09 UTC 2020


dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/21721 )


Change subject: gprs_bssgp: add IE parser for RIM Routing Information
......................................................................

gprs_bssgp: add IE parser for RIM Routing Information

The RIM Routing Information IE (see also 3GPP TS 48.018, section
11.3.70) is used to control the flow of BSSGP rim messages at the SGSN.

Change-Id: I6f88a9aeeb50a612d32e9efd23040c9740bc4f11
Related: SYS#5103
---
M include/osmocom/gprs/gprs_bssgp.h
M src/gb/gprs_bssgp.c
M src/gb/libosmogb.map
M tests/Makefile.am
M tests/gb/gprs_bssgp_test.c
M tests/gb/gprs_bssgp_test.ok
6 files changed, 190 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/21/21721/1

diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h
index dfbd9b7..662685e 100644
--- a/include/osmocom/gprs/gprs_bssgp.h
+++ b/include/osmocom/gprs/gprs_bssgp.h
@@ -175,6 +175,41 @@
 int bssgp_create_cell_id(uint8_t *buf, const struct gprs_ra_id *raid,
 			 uint16_t cid);
 
+enum bssgp_rim_routing_info_discr {
+	BSSGP_RIM_ROUTING_INFO_GERAN,
+	BSSGP_RIM_ROUTING_INFO_UTRAN,
+	BSSGP_RIM_ROUTING_INFO_EUTRAN,
+};
+
+/*! BSSGP RIM Routing information */
+struct bssgp_rim_routing_info {
+	enum bssgp_rim_routing_info_discr discr;
+	union {
+		struct {
+			struct gprs_ra_id raid;
+			uint16_t cid;
+		} geran;
+		struct {
+			struct gprs_ra_id raid;
+			uint16_t rncid;
+		} utran;
+		struct {
+			struct {
+				uint16_t mcc;
+				uint16_t mnc;
+				bool mnc_3_digits;
+				uint16_t tac;
+			} tai;
+			/* See also 3GPP TS 36.413 9.2.1.37 */
+			uint8_t global_enb_id[8];
+			uint8_t global_enb_id_len;
+		} eutran;
+	};
+};
+
+int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf,
+		       unsigned int len);
+
 /* Wrapper around TLV parser to parse BSSGP IEs */
 static inline int bssgp_tlv_parse(struct tlv_parsed *tp, const uint8_t *buf, int len)
 {
diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c
index 696c451..d73696c 100644
--- a/src/gb/gprs_bssgp.c
+++ b/src/gb/gprs_bssgp.c
@@ -326,6 +326,59 @@
 	return 8;
 }
 
+/*! Parse a RIM Routing information IE (3GPP TS 48.018, chapter 11.3.70).
+ *  \param[out] ri user provided memory to store the parsed results.
+ *  \param[in] buf input buffer of the value part of the IE.
+ *  \returns length of parsed octets, -EINVAL on error. */
+int bssgp_parse_rim_ri(struct bssgp_rim_routing_info *ri, const uint8_t *buf,
+		       unsigned int len)
+{
+	struct gprs_ra_id raid_temp;
+
+	memset(ri, 0, sizeof(*ri));
+	if (len < 2)
+		return 0;
+
+	ri->discr = buf[0] & 0x0f;
+
+	switch (ri->discr) {
+	case BSSGP_RIM_ROUTING_INFO_GERAN:
+		if (len < 9)
+			return -1;
+		ri->geran.cid = bssgp_parse_cell_id(&ri->geran.raid, buf + 1);
+		return 9;
+		break;
+	case BSSGP_RIM_ROUTING_INFO_UTRAN:
+		if (len < 9)
+			return -1;
+		gsm48_parse_ra(&ri->utran.raid, buf + 1);
+		ri->utran.rncid = osmo_load16be(buf + 7);
+		return 9;
+		break;
+	case BSSGP_RIM_ROUTING_INFO_EUTRAN:
+		if (len < 7)
+			return -1;
+		if (len > 15)
+			return -1;
+		/* Note: 3GPP TS 24.301 Figure 9.9.3.32.1 and 3GPP TS 24.008
+		 * Figure 10.5.130 specify MCC/MNC encoding in the same way,
+		 * so we can re-use gsm48_parse_ra() for that. */
+		gsm48_parse_ra(&raid_temp, buf + 1);
+		ri->eutran.tai.mcc = raid_temp.mcc;
+		ri->eutran.tai.mnc = raid_temp.mnc;
+		ri->eutran.tai.mnc_3_digits = raid_temp.mnc_3_digits;
+		ri->eutran.tai.tac = osmo_load16be(buf + 4);
+		memcpy(ri->eutran.global_enb_id, buf + 6, len - 6);
+		ri->eutran.global_enb_id_len = len - 6;
+		return len;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 /* Chapter 8.4 BVC-Reset Procedure */
 static int bssgp_rx_bvc_reset(struct msgb *msg, struct tlv_parsed *tp,
 			      uint16_t ns_bvci)
diff --git a/src/gb/libosmogb.map b/src/gb/libosmogb.map
index f8ad901..48d8371 100644
--- a/src/gb/libosmogb.map
+++ b/src/gb/libosmogb.map
@@ -13,6 +13,7 @@
 bssgp_msgb_tlli_put;
 bssgp_msgb_ra_put;
 bssgp_parse_cell_id;
+bssgp_parse_rim_ri;
 bssgp_set_bssgp_callback;
 bssgp_tx_bvc_block;
 bssgp_tx_bvc_reset;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ed87aca..cb683f7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -172,7 +172,8 @@
 gb_gprs_bssgp_test_SOURCES = gb/gprs_bssgp_test.c
 gb_gprs_bssgp_test_LDADD = $(LDADD) $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DLSYM) \
 			   $(top_builddir)/src/vty/libosmovty.la \
-			   $(top_builddir)/src/gsm/libosmogsm.la
+			   $(top_builddir)/src/gsm/libosmogsm.la \
+			   $(top_builddir)/src/gb/libosmogb.la
 
 gb_gprs_ns_test_SOURCES = gb/gprs_ns_test.c
 gb_gprs_ns_test_LDADD = $(LDADD) $(top_builddir)/src/gb/libosmogb.la $(LIBRARY_DLSYM) \
diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c
index 52e986e..9f0f87f 100644
--- a/tests/gb/gprs_bssgp_test.c
+++ b/tests/gb/gprs_bssgp_test.c
@@ -289,6 +289,76 @@
 	printf("----- %s END\n", __func__);
 }
 
+void dump_rim_ri(struct bssgp_rim_routing_info *ri)
+{
+	switch (ri->discr) {
+	case BSSGP_RIM_ROUTING_INFO_GERAN:
+		printf("GERAN cell identifier\n");
+		printf(" * mcc: %u\n", ri->geran.raid.mcc);
+		printf("   mnc: %u\n", ri->geran.raid.mnc);
+		printf("   mnc 3 digits: %u\n", ri->geran.raid.mnc_3_digits);
+		printf("   lac: %u\n", ri->geran.raid.lac);
+		printf("   rac: %u\n", ri->geran.raid.rac);
+		printf(" * cell id: %04x\n", ri->geran.cid);
+		break;
+	case BSSGP_RIM_ROUTING_INFO_UTRAN:
+		printf("UTRAN RNC identifier\n");
+		printf(" * mcc: %u\n", ri->utran.raid.mcc);
+		printf("   mnc: %u\n", ri->utran.raid.mnc);
+		printf("   mnc 3 digits: %u\n", ri->utran.raid.mnc_3_digits);
+		printf("   lac: %u\n", ri->utran.raid.lac);
+		printf("   rac: %u\n", ri->utran.raid.rac);
+		printf(" * rnc id: %04x\n", ri->utran.rncid);
+		break;
+	case BSSGP_RIM_ROUTING_INFO_EUTRAN:
+		printf("EUTRAN eNB identifier\n");
+		printf(" * mcc: %u\n", ri->eutran.tai.mcc);
+		printf("   mnc: %u\n", ri->eutran.tai.mnc);
+		printf("   mnc 3 digits: %u\n", ri->eutran.tai.mnc_3_digits);
+		printf("   tac: %u\n", ri->eutran.tai.tac);
+		printf(" * global_enb_id: %s\n",
+		       osmo_hexdump_nospc(ri->eutran.global_enb_id,
+					  ri->eutran.global_enb_id_len));
+		break;
+	default:
+		OSMO_ASSERT(false);
+	}
+}
+
+static void test_bssgp_parse_rim_ri()
+{
+	int rc;
+	struct bssgp_rim_routing_info result;
+	uint8_t testvec_geran[] =
+	    { 0x00, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
+	uint8_t testvec_utran[] =
+	    { 0x01, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
+	uint8_t testvec_eutran[] =
+	    { 0x02, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
+
+	printf("----- %s START\n", __func__);
+
+	rc = bssgp_parse_rim_ri(&result, testvec_geran,
+				sizeof(testvec_geran));
+	printf("rc=%u\n", rc);
+	dump_rim_ri(&result);
+	printf("\n");
+
+	rc = bssgp_parse_rim_ri(&result, testvec_utran,
+				sizeof(testvec_utran));
+	printf("rc=%u\n", rc);
+	dump_rim_ri(&result);
+	printf("\n");
+
+	rc = bssgp_parse_rim_ri(&result, testvec_eutran,
+				sizeof(testvec_eutran));
+	printf("rc=%u\n", rc);
+	dump_rim_ri(&result);
+	printf("\n");
+
+	printf("----- %s END\n", __func__);
+}
+
 static struct log_info info = {};
 
 int main(int argc, char **argv)
@@ -317,6 +387,7 @@
 	test_bssgp_bad_reset();
 	test_bssgp_flow_control_bvc();
 	test_bssgp_msgb_copy();
+	test_bssgp_parse_rim_ri();
 	printf("===== BSSGP test END\n\n");
 
 	exit(EXIT_SUCCESS);
diff --git a/tests/gb/gprs_bssgp_test.ok b/tests/gb/gprs_bssgp_test.ok
index c5b3e7d..40b8dfe 100644
--- a/tests/gb/gprs_bssgp_test.ok
+++ b/tests/gb/gprs_bssgp_test.ok
@@ -17,5 +17,33 @@
 Old msgb: [L3]> 22 04 82 00 02 07 81 08 
 New msgb: [L3]> 22 04 82 00 02 07 81 08 
 ----- test_bssgp_msgb_copy END
+----- test_bssgp_parse_rim_ri START
+rc=9
+GERAN cell identifier
+ * mcc: 262
+   mnc: 42
+   mnc 3 digits: 0
+   lac: 13200
+   rac: 0
+ * cell id: 51e1
+
+rc=9
+UTRAN RNC identifier
+ * mcc: 262
+   mnc: 42
+   mnc 3 digits: 0
+   lac: 13200
+   rac: 0
+ * rnc id: 51e1
+
+rc=9
+EUTRAN eNB identifier
+ * mcc: 262
+   mnc: 42
+   mnc 3 digits: 0
+   tac: 13200
+ * global_enb_id: 0051e1
+
+----- test_bssgp_parse_rim_ri END
 ===== BSSGP test END
 

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/21721
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I6f88a9aeeb50a612d32e9efd23040c9740bc4f11
Gerrit-Change-Number: 21721
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pmaier at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201214/8f8339ea/attachment.htm>


More information about the gerrit-log mailing list