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