mirror of https://gerrit.osmocom.org/libosmocore
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:
parent
72696040df
commit
36c7b33ccc
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue