GSUP: introduce new messages for SS/USSD payloads

In order to be able to transfer SS/USSD messages via GSUP,
this change introduces the following new message types:

  - OSMO_GSUP_MSGT_PROC_SS_*,

and the following new IE:

  - OSMO_GSUP_SS_INFO_IE

which represents an ASN.1 encoded MAP payload coming to/from
the mobile station 'as is', without any transcoding.

Change-Id: Ie17a78043a35fffbdd59e80fd2b2da39cce5e532
Related: OS#1597
This commit is contained in:
Vadim Yanitskiy 2018-03-31 05:23:09 +07:00
parent 72696040df
commit 36c7b33ccc
6 changed files with 87 additions and 1 deletions

View File

@ -9,3 +9,4 @@
#library what description / commit summary line
gsup gsup.h the 'osmo_gsup_message' struct extended with
session information => ABI changed
SS/USSD information => ABI changed

View File

@ -85,6 +85,9 @@ enum osmo_gsup_iei {
OSMO_GSUP_SESSION_ID_IE = 0x30,
OSMO_GSUP_SESSION_STATE_IE = 0x31,
/*! Supplementary Services payload */
OSMO_GSUP_SS_INFO_IE = 0x35,
};
/*! GSUP message type */
@ -114,6 +117,10 @@ enum osmo_gsup_message_type {
OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST = 0b00011100,
OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR = 0b00011101,
OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT = 0b00011110,
OSMO_GSUP_MSGT_PROC_SS_REQUEST = 0b00100000,
OSMO_GSUP_MSGT_PROC_SS_ERROR = 0b00100001,
OSMO_GSUP_MSGT_PROC_SS_RESULT = 0b00100010,
};
#define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)
@ -197,6 +204,10 @@ struct osmo_gsup_message {
/*! Unique session identifier and origination flag.
* Encoded only when \ref session_state != 0x00 */
uint32_t session_id;
/*! ASN.1 encoded MAP payload for Supplementary Services */
uint8_t *ss_info;
size_t ss_info_len;
};
int osmo_gsup_decode(const uint8_t *data, size_t data_len,

View File

@ -62,6 +62,11 @@ const struct value_string osmo_gsup_message_type_names[] = {
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_REQUEST),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_ERROR),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_RESULT),
{ 0, NULL }
};
@ -393,6 +398,11 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len,
gsup_msg->session_state = *value;
break;
case OSMO_GSUP_SS_INFO_IE:
gsup_msg->ss_info = value;
gsup_msg->ss_info_len = value_len;
break;
default:
LOGP(DLGSUP, LOGL_NOTICE,
"GSUP IE type %d unknown\n", iei);
@ -580,6 +590,11 @@ int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg)
msgb_tlv_put(msg, OSMO_GSUP_SESSION_STATE_IE, sizeof(u8), &u8);
}
if (gsup_msg->ss_info) {
msgb_tlv_put(msg, OSMO_GSUP_SS_INFO_IE,
gsup_msg->ss_info_len, gsup_msg->ss_info);
}
return 0;
}

View File

@ -180,6 +180,43 @@ static void test_gsup_messages_dec_enc(void)
0x31, 0x01, 0x01,
};
static const uint8_t send_ussd_req[] = {
0x20, /* OSMO_GSUP_MSGT_PROC_SS_REQUEST */
TEST_IMSI_IE,
/* Session ID and state */
0x30, 0x04, 0xde, 0xad, 0xbe, 0xef,
0x31, 0x01, 0x01,
/* SS/USSD information IE */
0x35, 0x14,
/* ASN.1 encoded MAP payload */
0xa1, 0x12,
0x02, 0x01, /* Component: invoke */
0x01, /* invokeID = 1 */
/* opCode: processUnstructuredSS-Request */
0x02, 0x01, 0x3b, 0x30, 0x0a, 0x04, 0x01, 0x0f,
0x04, 0x05, 0xaa, 0x18, 0x0c, 0x36, 0x02,
};
static const uint8_t send_ussd_res[] = {
0x22, /* OSMO_GSUP_MSGT_PROC_SS_RESULT */
TEST_IMSI_IE,
/* Session ID and state */
0x30, 0x04, 0xde, 0xad, 0xbe, 0xef,
0x31, 0x01, 0x03,
/* SS/USSD information IE */
0x35, 0x08,
/* ASN.1 encoded MAP payload */
0xa3, 0x06,
0x02, 0x01, /* Component: returnError */
0x01, /* invokeID = 1 */
/* localValue: unknownAlphabet */
0x02, 0x01, 0x47,
};
static const struct test {
char *name;
const uint8_t *data;
@ -215,6 +252,10 @@ static void test_gsup_messages_dec_enc(void)
send_auth_info_req_auts, sizeof(send_auth_info_req_auts)},
{"Dummy message with session IEs",
dummy_session_ies, sizeof(dummy_session_ies)},
{"SS/USSD processUnstructuredSS-Request / Invoke",
send_ussd_req, sizeof(send_ussd_req)},
{"SS/USSD processUnstructuredSS-Request / ReturnResult",
send_ussd_res, sizeof(send_ussd_res)},
};
printf("Test GSUP message decoding/encoding\n");
@ -278,7 +319,11 @@ static void test_gsup_messages_dec_enc(void)
osmo_hexdump(t->data + j, ie_end - j));
OSMO_ASSERT(j <= ie_end - 2);
OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SESSION_STATE_IE);
/**
* FIXME: share the maximal IE value somehow
* in order to avoid manual updating of this
*/
OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SS_INFO_IE);
OSMO_ASSERT(t->data[j+1] <= ie_end - j - 2);
ie_end = j;

View File

@ -43,6 +43,12 @@
generated message: 2b 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01
original message: 2b 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01
IMSI: 123456789012345
generated message: 20 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 35 14 a1 12 02 01 01 02 01 3b 30 0a 04 01 0f 04 05 aa 18 0c 36 02
original message: 20 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 35 14 a1 12 02 01 01 02 01 3b 30 0a 04 01 0f 04 05 aa 18 0c 36 02
IMSI: 123456789012345
generated message: 22 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 35 08 a3 06 02 01 01 02 01 47
original message: 22 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 35 08 a3 06 02 01 01 02 01 47
IMSI: 123456789012345
message 0: tested 11 truncations, 11 parse failures
message 1: tested 14 truncations, 13 parse failures
message 2: tested 83 truncations, 81 parse failures
@ -58,6 +64,8 @@
message 12: tested 211 truncations, 209 parse failures
message 13: tested 45 truncations, 43 parse failures
message 14: tested 20 truncations, 18 parse failures
message 15: tested 42 truncations, 39 parse failures
message 16: tested 30 truncations, 27 parse failures
DLGSUP Stopping DLGSUP logging
message 0: tested 2816 modifications, 510 parse failures
message 1: tested 3584 modifications, 768 parse failures
@ -74,3 +82,5 @@ DLGSUP Stopping DLGSUP logging
message 12: tested 54016 modifications, 4622 parse failures
message 13: tested 11520 modifications, 1026 parse failures
message 14: tested 5120 modifications, 1026 parse failures
message 15: tested 10752 modifications, 1256 parse failures
message 16: tested 7680 modifications, 1265 parse failures

View File

@ -29,4 +29,8 @@ Test GSUP message decoding/encoding
Send Authentication Info Request with AUTS and RAND (UMTS) OK
Testing Dummy message with session IEs
Dummy message with session IEs OK
Testing SS/USSD processUnstructuredSS-Request / Invoke
SS/USSD processUnstructuredSS-Request / Invoke OK
Testing SS/USSD processUnstructuredSS-Request / ReturnResult
SS/USSD processUnstructuredSS-Request / ReturnResult OK
Done.