summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-04-22 23:09:41 -0400
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-05-05 21:08:00 +0200
commitb927f1c3199b48becb03c0d56926c3b98d6ff5ce (patch)
treecb81e76fdc35d7a16247ec2390f2f7838bad4a83
parent02d8c472bdff0a085cbedd9d902f7ced29e5d712 (diff)
gsup: Extract the new MSISDN string
Extract the new MSISDN IE from the GSUP message and verify that it is read/written to the message.
-rw-r--r--openbsc/include/openbsc/gprs_gsup_messages.h4
-rw-r--r--openbsc/src/gprs/gprs_gsup_messages.c11
-rw-r--r--openbsc/tests/gprs/gprs_test.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gprs_gsup_messages.h b/openbsc/include/openbsc/gprs_gsup_messages.h
index 9857b97..a2d3cc7 100644
--- a/openbsc/include/openbsc/gprs_gsup_messages.h
+++ b/openbsc/include/openbsc/gprs_gsup_messages.h
@@ -29,6 +29,7 @@
#define GPRS_GSUP_MAX_NUM_PDP_INFO 10 /* GSM 09.02 limits this to 50 */
#define GPRS_GSUP_MAX_NUM_AUTH_INFO 5
+#define GPRS_GSUP_MAX_MSISDN_LEN 9
#define GPRS_GSUP_PDP_TYPE_SIZE 2
@@ -40,6 +41,7 @@ enum gprs_gsup_iei {
GPRS_GSUP_PDP_INFO_IE = 0x05,
GPRS_GSUP_CANCEL_TYPE_IE = 0x06,
GPRS_GSUP_FREEZE_PTMSI_IE = 0x07,
+ GPRS_GSUP_MSISDN_IE = 0x08,
GPRS_GSUP_PDP_CONTEXT_ID_IE = 0x10,
GPRS_GSUP_PDP_TYPE_IE = 0x11,
GPRS_GSUP_ACCESS_POINT_NAME_IE = 0x12,
@@ -102,6 +104,8 @@ struct gprs_gsup_message {
size_t num_auth_tuples;
struct gprs_gsup_pdp_info pdp_infos[GPRS_GSUP_MAX_NUM_PDP_INFO];
size_t num_pdp_infos;
+ const uint8_t *msisdn_enc;
+ size_t msisdn_enc_len;
};
int gprs_gsup_decode(const uint8_t *data, size_t data_len,
diff --git a/openbsc/src/gprs/gprs_gsup_messages.c b/openbsc/src/gprs/gprs_gsup_messages.c
index 9d9b6be..56f78fd 100644
--- a/openbsc/src/gprs/gprs_gsup_messages.c
+++ b/openbsc/src/gprs/gprs_gsup_messages.c
@@ -2,6 +2,7 @@
/*
* (C) 2014 by Sysmocom s.f.m.c. GmbH
+ * (C) 2015 by Holger Hans Peter Freyther
* All Rights Reserved
*
* Author: Jacob Erlbeck
@@ -291,6 +292,12 @@ int gprs_gsup_decode(const uint8_t *const_data, size_t data_len,
gsup_msg->auth_tuples[gsup_msg->num_auth_tuples++] =
auth_info;
break;
+
+ case GPRS_GSUP_MSISDN_IE:
+ gsup_msg->msisdn_enc = value;
+ gsup_msg->msisdn_enc_len = value_len;
+ break;
+
default:
LOGP(DGPRS, LOGL_NOTICE,
"GSUP IE type %d unknown\n", iei);
@@ -374,6 +381,10 @@ void gprs_gsup_encode(struct msgb *msg, const struct gprs_gsup_message *gsup_msg
msgb_tlv_put(msg, GPRS_GSUP_IMSI_IE, bcd_len - 1, &bcd_buf[1]);
/* specific parts */
+ if (gsup_msg->msisdn_enc)
+ msgb_tlv_put(msg, GPRS_GSUP_MSISDN_IE,
+ gsup_msg->msisdn_enc_len, gsup_msg->msisdn_enc);
+
if ((u8 = gsup_msg->cause))
msgb_tlv_put(msg, GPRS_GSUP_CAUSE_IE, sizeof(u8), &u8);
diff --git a/openbsc/tests/gprs/gprs_test.c b/openbsc/tests/gprs/gprs_test.c
index 0ae06e7..a7c2401 100644
--- a/openbsc/tests/gprs/gprs_test.c
+++ b/openbsc/tests/gprs/gprs_test.c
@@ -443,6 +443,8 @@ static void test_gsup_messages_dec_enc(void)
static const uint8_t update_location_res[] = {
0x06,
TEST_IMSI_IE,
+ 0x08, 0x07, /* MSISDN of the subscriber */
+ 0x91, 0x94, 0x61, 0x46, 0x32, 0x24, 0x43,
0x04, 0x00, /* PDP info complete */
0x05, 0x12,
0x10, 0x01, 0x01,