mirror of https://gerrit.osmocom.org/libosmocore
GSUP: implement TCAP-like session management
Unlike TCAP/MAP, GSUP is just a transport layer without the dialogue/context. This prevents us from having session based communication, required e.g. for USSD. But we can emulate TCAP dialogue by adding additional IEs, which would allow to relate each message to a particular session. This change introduces the following IEs: - OSMO_GSUP_SESSION_ID_IE, - OSMO_GSUP_SESSION_STATE_IE, which optionally can be used to indicate that the message is related to a session with given ID, and to manage session state, i.e. initiate, continue, and finish. Change-Id: I1cee271fed0284a134ffed103c0d4bebbcfde2a8 Related: OS#1597
This commit is contained in:
parent
64e807c4bc
commit
72696040df
|
@ -7,3 +7,5 @@
|
||||||
# If any interfaces have been added since the last public release: c:r:a + 1.
|
# If any interfaces have been added since the last public release: c:r:a + 1.
|
||||||
# If any interfaces have been removed or changed since the last public release: c:r:0.
|
# If any interfaces have been removed or changed since the last public release: c:r:0.
|
||||||
#library what description / commit summary line
|
#library what description / commit summary line
|
||||||
|
gsup gsup.h the 'osmo_gsup_message' struct extended with
|
||||||
|
session information => ABI changed
|
||||||
|
|
|
@ -82,6 +82,9 @@ enum osmo_gsup_iei {
|
||||||
OSMO_GSUP_AUTS_IE = 0x26,
|
OSMO_GSUP_AUTS_IE = 0x26,
|
||||||
OSMO_GSUP_RES_IE = 0x27,
|
OSMO_GSUP_RES_IE = 0x27,
|
||||||
OSMO_GSUP_CN_DOMAIN_IE = 0x28,
|
OSMO_GSUP_CN_DOMAIN_IE = 0x28,
|
||||||
|
|
||||||
|
OSMO_GSUP_SESSION_ID_IE = 0x30,
|
||||||
|
OSMO_GSUP_SESSION_STATE_IE = 0x31,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! GSUP message type */
|
/*! GSUP message type */
|
||||||
|
@ -132,6 +135,18 @@ enum osmo_gsup_cn_domain {
|
||||||
OSMO_GSUP_CN_DOMAIN_CS = 2,
|
OSMO_GSUP_CN_DOMAIN_CS = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*! TCAP-like session state */
|
||||||
|
enum osmo_gsup_session_state {
|
||||||
|
/*! Undefined session state */
|
||||||
|
OSMO_GSUP_SESSION_STATE_NONE = 0x00,
|
||||||
|
/*! Initiation of a new session */
|
||||||
|
OSMO_GSUP_SESSION_STATE_BEGIN = 0x01,
|
||||||
|
/*! Communication of an existing session */
|
||||||
|
OSMO_GSUP_SESSION_STATE_CONTINUE = 0x02,
|
||||||
|
/*! Indication of the session end */
|
||||||
|
OSMO_GSUP_SESSION_STATE_END = 0x03,
|
||||||
|
};
|
||||||
|
|
||||||
/*! parsed/decoded PDP context information */
|
/*! parsed/decoded PDP context information */
|
||||||
struct osmo_gsup_pdp_info {
|
struct osmo_gsup_pdp_info {
|
||||||
unsigned int context_id;
|
unsigned int context_id;
|
||||||
|
@ -176,6 +191,12 @@ struct osmo_gsup_message {
|
||||||
enum osmo_gsup_cn_domain cn_domain;
|
enum osmo_gsup_cn_domain cn_domain;
|
||||||
const uint8_t *pdp_charg_enc;
|
const uint8_t *pdp_charg_enc;
|
||||||
size_t pdp_charg_enc_len;
|
size_t pdp_charg_enc_len;
|
||||||
|
|
||||||
|
/*! Session state \ref osmo_gsup_session_state */
|
||||||
|
enum osmo_gsup_session_state session_state;
|
||||||
|
/*! Unique session identifier and origination flag.
|
||||||
|
* Encoded only when \ref session_state != 0x00 */
|
||||||
|
uint32_t session_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
int osmo_gsup_decode(const uint8_t *data, size_t data_len,
|
int osmo_gsup_decode(const uint8_t *data, size_t data_len,
|
||||||
|
|
|
@ -385,6 +385,14 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len,
|
||||||
gsup_msg->pdp_charg_enc_len = value_len;
|
gsup_msg->pdp_charg_enc_len = value_len;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OSMO_GSUP_SESSION_ID_IE:
|
||||||
|
gsup_msg->session_id = osmo_decode_big_endian(value, value_len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OSMO_GSUP_SESSION_STATE_IE:
|
||||||
|
gsup_msg->session_state = *value;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOGP(DLGSUP, LOGL_NOTICE,
|
LOGP(DLGSUP, LOGL_NOTICE,
|
||||||
"GSUP IE type %d unknown\n", iei);
|
"GSUP IE type %d unknown\n", iei);
|
||||||
|
@ -564,6 +572,14 @@ int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg)
|
||||||
gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc);
|
gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((u8 = gsup_msg->session_state)) {
|
||||||
|
size_t len = sizeof(gsup_msg->session_id);
|
||||||
|
uint8_t *sid = osmo_encode_big_endian(gsup_msg->session_id, len);
|
||||||
|
|
||||||
|
msgb_tlv_put(msg, OSMO_GSUP_SESSION_ID_IE, len, sid);
|
||||||
|
msgb_tlv_put(msg, OSMO_GSUP_SESSION_STATE_IE, sizeof(u8), &u8);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,6 +171,15 @@ static void test_gsup_messages_dec_enc(void)
|
||||||
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
|
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const uint8_t dummy_session_ies[] = {
|
||||||
|
0x2b, /* Dummy value, we only interested in IE coding */
|
||||||
|
TEST_IMSI_IE,
|
||||||
|
|
||||||
|
/* Session ID and state */
|
||||||
|
0x30, 0x04, 0xde, 0xad, 0xbe, 0xef,
|
||||||
|
0x31, 0x01, 0x01,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct test {
|
static const struct test {
|
||||||
char *name;
|
char *name;
|
||||||
const uint8_t *data;
|
const uint8_t *data;
|
||||||
|
@ -204,6 +213,8 @@ static void test_gsup_messages_dec_enc(void)
|
||||||
send_auth_info_res_umts, sizeof(send_auth_info_res_umts)},
|
send_auth_info_res_umts, sizeof(send_auth_info_res_umts)},
|
||||||
{"Send Authentication Info Request with AUTS and RAND (UMTS)",
|
{"Send Authentication Info Request with AUTS and RAND (UMTS)",
|
||||||
send_auth_info_req_auts, sizeof(send_auth_info_req_auts)},
|
send_auth_info_req_auts, sizeof(send_auth_info_req_auts)},
|
||||||
|
{"Dummy message with session IEs",
|
||||||
|
dummy_session_ies, sizeof(dummy_session_ies)},
|
||||||
};
|
};
|
||||||
|
|
||||||
printf("Test GSUP message decoding/encoding\n");
|
printf("Test GSUP message decoding/encoding\n");
|
||||||
|
@ -267,7 +278,7 @@ static void test_gsup_messages_dec_enc(void)
|
||||||
osmo_hexdump(t->data + j, ie_end - j));
|
osmo_hexdump(t->data + j, ie_end - j));
|
||||||
|
|
||||||
OSMO_ASSERT(j <= ie_end - 2);
|
OSMO_ASSERT(j <= ie_end - 2);
|
||||||
OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_CN_DOMAIN_IE);
|
OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SESSION_STATE_IE);
|
||||||
OSMO_ASSERT(t->data[j+1] <= ie_end - j - 2);
|
OSMO_ASSERT(t->data[j+1] <= ie_end - j - 2);
|
||||||
|
|
||||||
ie_end = j;
|
ie_end = j;
|
||||||
|
|
|
@ -40,6 +40,9 @@
|
||||||
generated message: 08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
|
generated message: 08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
|
||||||
original message: 08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
|
original message: 08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
|
||||||
IMSI: 123456789012345
|
IMSI: 123456789012345
|
||||||
|
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
|
||||||
message 0: tested 11 truncations, 11 parse failures
|
message 0: tested 11 truncations, 11 parse failures
|
||||||
message 1: tested 14 truncations, 13 parse failures
|
message 1: tested 14 truncations, 13 parse failures
|
||||||
message 2: tested 83 truncations, 81 parse failures
|
message 2: tested 83 truncations, 81 parse failures
|
||||||
|
@ -54,6 +57,7 @@
|
||||||
message 11: tested 13 truncations, 12 parse failures
|
message 11: tested 13 truncations, 12 parse failures
|
||||||
message 12: tested 211 truncations, 209 parse failures
|
message 12: tested 211 truncations, 209 parse failures
|
||||||
message 13: tested 45 truncations, 43 parse failures
|
message 13: tested 45 truncations, 43 parse failures
|
||||||
|
message 14: tested 20 truncations, 18 parse failures
|
||||||
DLGSUP Stopping DLGSUP logging
|
DLGSUP Stopping DLGSUP logging
|
||||||
message 0: tested 2816 modifications, 510 parse failures
|
message 0: tested 2816 modifications, 510 parse failures
|
||||||
message 1: tested 3584 modifications, 768 parse failures
|
message 1: tested 3584 modifications, 768 parse failures
|
||||||
|
@ -69,3 +73,4 @@ DLGSUP Stopping DLGSUP logging
|
||||||
message 11: tested 3328 modifications, 767 parse failures
|
message 11: tested 3328 modifications, 767 parse failures
|
||||||
message 12: tested 54016 modifications, 4622 parse failures
|
message 12: tested 54016 modifications, 4622 parse failures
|
||||||
message 13: tested 11520 modifications, 1026 parse failures
|
message 13: tested 11520 modifications, 1026 parse failures
|
||||||
|
message 14: tested 5120 modifications, 1026 parse failures
|
||||||
|
|
|
@ -27,4 +27,6 @@ Test GSUP message decoding/encoding
|
||||||
Send Authentication Info Result with IK, CK, AUTN and RES (UMTS) OK
|
Send Authentication Info Result with IK, CK, AUTN and RES (UMTS) OK
|
||||||
Testing Send Authentication Info Request with AUTS and RAND (UMTS)
|
Testing Send Authentication Info Request with AUTS and RAND (UMTS)
|
||||||
Send Authentication Info Request with AUTS and RAND (UMTS) OK
|
Send Authentication Info Request with AUTS and RAND (UMTS) OK
|
||||||
|
Testing Dummy message with session IEs
|
||||||
|
Dummy message with session IEs OK
|
||||||
Done.
|
Done.
|
||||||
|
|
Loading…
Reference in New Issue