[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_PAGING

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
Thu Mar 30 16:44:55 UTC 2017


Review at  https://gerrit.osmocom.org/2183

gsm0808: Add create functions for BSS_MAP_MSG_PAGING

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_PAGING messages. These
messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_paging() function, that generates an A/AoiP
BSS_MAP_MSG_PAGING message.

Change-Id: I9afecf0109305ca5153bf081bb29cd94071dd2b7
---
M include/osmocom/gsm/gsm0808.h
M src/gsm/gsm0808.c
M src/gsm/libosmogsm.map
M tests/gsm0808/gsm0808_test.c
M tests/gsm0808/gsm0808_test.ok
5 files changed, 110 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/83/2183/1

diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index 44ce763..6cd933b 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -59,6 +59,9 @@
 						    struct llist_head *scl);
 struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause);
 struct msgb *gsm0808_create_clear_rqst(uint8_t cause);
+struct msgb *gsm0808_create_paging(char *imsi, uint32_t *tmsi,
+				   struct gsm0808_cell_id_list *cil,
+				   uint8_t *chan_needed);
 
 struct msgb *gsm0808_create_dtap(struct msgb *msg, uint8_t link_id);
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id);
diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index 7e91df8..b6ae0fa 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -410,6 +410,67 @@
 	return msg;
 }
 
+struct msgb *gsm0808_create_paging(char *imsi, uint32_t *tmsi,
+				   struct gsm0808_cell_id_list *cil,
+				   uint8_t *chan_needed)
+{
+	struct msgb *msg;
+	struct msgb *cil_encoded;
+	uint8_t mid_buf[GSM48_MI_SIZE + 2];
+	int mid_len;
+	uint32_t tmsi_sw;
+
+	/* Mandatory emelents! */
+	OSMO_ASSERT(imsi);
+	OSMO_ASSERT(cil);
+
+	/* Malformed IMSI */
+	OSMO_ASSERT(strlen(imsi) <= GSM48_MI_SIZE);
+
+	msg =
+	    msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "paging");
+	if (!msg)
+		return NULL;
+
+	/* Message Type 3.2.2.1 */
+	msgb_v_put(msg, BSS_MAP_MSG_PAGING);
+
+	/* IMSI 3.2.2.6 */
+	mid_len = gsm48_generate_mid_from_imsi(mid_buf, imsi);
+	msgb_tlv_put(msg, GSM0808_IE_IMSI, mid_len - 2, mid_buf + 2);
+
+	/* TMSI 3.2.2.7 */
+	if (tmsi) {
+		tmsi_sw = htonl(*tmsi);
+		msgb_tlv_put(msg, GSM0808_IE_TMSI, sizeof(*tmsi),
+			     (uint8_t *) & tmsi_sw);
+	}
+
+	/* Cell Identifier List 3.2.2.27 */
+	if (cil) {
+		cil_encoded = gsm0808_enc_cell_id_list(cil);
+		if (!cil_encoded) {
+			msgb_free(msg);
+			return NULL;
+		}
+		msgb_tlv_put(msg, GSM0808_IE_CELL_IDENTIFIER_LIST,
+			     cil_encoded->len, cil_encoded->data);
+		msgb_free(cil_encoded);
+	}
+
+	/* Channel Needed 3.2.2.36 */
+	if (chan_needed) {
+		msgb_tv_put(msg, GSM0808_IE_CHANNEL_NEEDED,
+			    (*chan_needed) & 0x03);
+	}
+
+	/* pre-pend the header */
+	msg->l3h =
+	    msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+	return msg;
+}
+
 void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id)
 {
 	uint8_t *hh = msgb_push(msg, 3);
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 2826cd8..fb06bff 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -135,6 +135,7 @@
 gsm0808_create_clear_command;
 gsm0808_create_clear_complete;
 gsm0808_create_clear_rqst;
+gsm0808_create_paging;
 gsm0808_create_dtap;
 gsm0808_create_layer3;
 gsm0808_create_layer3_aoip;
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index b3f1f40..4743658 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -21,6 +21,7 @@
 #include <osmocom/gsm/gsm0808.h>
 #include <osmocom/gsm/gsm0808_utils.h>
 #include <osmocom/gsm/protocol/gsm_08_08.h>
+#include <osmocom/gsm/protocol/gsm_08_58.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -388,6 +389,48 @@
 	printf("Testing creating Clear Request\n");
 	msg = gsm0808_create_clear_rqst(0x23);
 	VERIFY(msg, res, ARRAY_SIZE(res));
+	msgb_free(msg);
+}
+
+static void test_create_paging()
+{
+	static const uint8_t res[] =
+	    { 0x00, 0x10, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
+	      0x21, 0x43, 0x1a, 0x03, 0x05, 0x23, 0x42 };
+	static const uint8_t res2[] =
+	    { 0x00, 0x16, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
+	      0x21, 0x43, GSM0808_IE_TMSI, 0x04, 0x12, 0x34, 0x56, 0x78, 0x1a,
+	      0x03, 0x05, 0x23, 0x42 };
+	static const uint8_t res3[] =
+	    { 0x00, 0x18, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
+	      0x21, 0x43, GSM0808_IE_TMSI, 0x04, 0x12, 0x34, 0x56, 0x78, 0x1a,
+	      0x03, 0x05, 0x23, 0x42, GSM0808_IE_CHANNEL_NEEDED,
+	      RSL_CHANNEED_TCH_ForH };
+
+	struct msgb *msg;
+	struct gsm0808_cell_id_lac lac_enc;
+	struct gsm0808_cell_id_list cil;
+	uint32_t tmsi = 0x12345678;
+	uint8_t chan_needed = RSL_CHANNEED_TCH_ForH;
+
+	char imsi[] = "001010000001234";
+
+	cil.id_discr = CELL_IDENT_LAC;
+	INIT_LLIST_HEAD(&cil.id_list);
+	lac_enc.lac = 0x2342;
+	llist_add(&lac_enc.list, &cil.id_list);
+
+	printf("Testing creating Paging Request\n");
+	msg = gsm0808_create_paging(imsi, NULL, &cil, NULL);
+	VERIFY(msg, res, ARRAY_SIZE(res));
+	msgb_free(msg);
+
+	msg = gsm0808_create_paging(imsi, &tmsi, &cil, NULL);
+	VERIFY(msg, res2, ARRAY_SIZE(res2));
+	msgb_free(msg);
+
+	msg = gsm0808_create_paging(imsi, &tmsi, &cil, &chan_needed);
+	VERIFY(msg, res3, ARRAY_SIZE(res3));
 	msgb_free(msg);
 }
 
@@ -801,6 +844,7 @@
 	test_create_ass_fail();
 	test_create_ass_fail_aoip(ctx);
 	test_create_clear_rqst();
+	test_create_paging();
 	test_create_dtap();
 	test_prepend_dtap();
 	test_enc_dec_aoip_trasp_addr_v4(ctx);
diff --git a/tests/gsm0808/gsm0808_test.ok b/tests/gsm0808/gsm0808_test.ok
index 8e2087d..6170a7a 100644
--- a/tests/gsm0808/gsm0808_test.ok
+++ b/tests/gsm0808/gsm0808_test.ok
@@ -14,6 +14,7 @@
 Testing creating Assignment Failure
 Testing creating Assignment Failure (AoIP)
 Testing creating Clear Request
+Testing creating Paging Request
 Testing creating DTAP
 Testing prepend DTAP
 Done

-- 
To view, visit https://gerrit.osmocom.org/2183
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9afecf0109305ca5153bf081bb29cd94071dd2b7
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: dexter <pmaier at sysmocom.de>



More information about the gerrit-log mailing list