From f9ee8da0cda6a8989c706e618915d09c9cffd0f4 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Tue, 13 Nov 2018 02:06:15 +0700 Subject: [PATCH] GSUP/SMS: introduce READY-FOR-SM message According to 3GPP TS 29.002, section 12.4, MAP-READY-FOR-SM is used between the MSC and VLR as well as between the VLR and the HLR to indicate that a subscriber has memory available for SMS. This change replicates this service in GSUP as READY_FOR_SM_*. The only mandatory IE for this service (excluding Invoke ID) is 'Alert Reason' that is replicated by OSMO_GSUP_SM_ALERT_RSN_IE. Change-Id: Ic37f3b2114b8095cfce22977e67133b9103942e3 Related Change-Id: (docs) I549b6c8840a1e86caac09e77fb8bc5042d939e62 Related Change-Id: (TTCN) If2256607527ecfcb10285583332fb8b0515d7c78 Related: OS#3587 --- include/osmocom/gsm/gsup.h | 7 +++++++ include/osmocom/gsm/gsup_sms.h | 7 +++++++ src/gsm/gsup.c | 13 +++++++++++++ tests/gsup/gsup_test.c | 13 ++++++++++++- tests/gsup/gsup_test.err | 5 +++++ tests/gsup/gsup_test.ok | 2 ++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h index 192b877b1..51871e447 100644 --- a/include/osmocom/gsm/gsup.h +++ b/include/osmocom/gsm/gsup.h @@ -97,6 +97,7 @@ enum osmo_gsup_iei { OSMO_GSUP_SM_RP_UI_IE = 0x43, OSMO_GSUP_SM_RP_CAUSE_IE = 0x44, OSMO_GSUP_SM_RP_MMS_IE = 0x45, + OSMO_GSUP_SM_ALERT_RSN_IE = 0x46, }; /*! GSUP message type */ @@ -138,6 +139,10 @@ enum osmo_gsup_message_type { OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST = 0b00101000, OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR = 0b00101001, OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT = 0b00101010, + + OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST = 0b00101100, + OSMO_GSUP_MSGT_READY_FOR_SM_ERROR = 0b00101101, + OSMO_GSUP_MSGT_READY_FOR_SM_RESULT = 0b00101110, }; #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00) @@ -250,6 +255,8 @@ struct osmo_gsup_message { const uint8_t *sm_rp_cause; /*! SM-RP-MMS (More Messages to Send), section 7.6.8.7 */ const uint8_t *sm_rp_mms; + /*! Alert reason (see 3GPP TS 29.002, 7.6.8.8) */ + enum osmo_gsup_sms_sm_alert_rsn_t sm_alert_rsn; }; int osmo_gsup_decode(const uint8_t *data, size_t data_len, diff --git a/include/osmocom/gsm/gsup_sms.h b/include/osmocom/gsm/gsup_sms.h index 521412d62..480971e6d 100644 --- a/include/osmocom/gsm/gsup_sms.h +++ b/include/osmocom/gsm/gsup_sms.h @@ -22,6 +22,13 @@ enum osmo_gsup_sms_sm_rp_oda_t { OSMO_GSUP_SMS_SM_RP_ODA_NULL = 0xff, }; +/*! Alert reason values, see 7.6.8.8 */ +enum osmo_gsup_sms_sm_alert_rsn_t { + OSMO_GSUP_SMS_SM_ALERT_RSN_NONE = 0x00, + OSMO_GSUP_SMS_SM_ALERT_RSN_MS_PRESENT = 0x01, + OSMO_GSUP_SMS_SM_ALERT_RSN_MEM_AVAIL = 0x02, +}; + struct osmo_gsup_message; struct msgb; diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c index e43399710..c1c999236 100644 --- a/src/gsm/gsup.c +++ b/src/gsm/gsup.c @@ -75,6 +75,10 @@ const struct value_string osmo_gsup_message_type_names[] = { OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR), OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_READY_FOR_SM_ERROR), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_READY_FOR_SM_RESULT), + { 0, NULL } }; @@ -471,6 +475,10 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, gsup_msg->sm_rp_cause = value; break; + case OSMO_GSUP_SM_ALERT_RSN_IE: + gsup_msg->sm_alert_rsn = *value; + break; + default: LOGP(DLGSUP, LOGL_NOTICE, "GSUP IE type %d unknown\n", iei); @@ -699,6 +707,11 @@ int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg) sizeof(*gsup_msg->sm_rp_cause), gsup_msg->sm_rp_cause); } + if ((u8 = gsup_msg->sm_alert_rsn)) { + msgb_tlv_put(msg, OSMO_GSUP_SM_ALERT_RSN_IE, + sizeof(u8), &u8); + } + return 0; } diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c index 093689333..b3a8c772e 100644 --- a/tests/gsup/gsup_test.c +++ b/tests/gsup/gsup_test.c @@ -280,6 +280,15 @@ static void test_gsup_messages_dec_enc(void) 0xde, 0xad, 0xbe, 0xef, }; + static const uint8_t send_ready_for_sm_ind[] = { + 0x2c, /* OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST */ + TEST_IMSI_IE, + + /* SM related IEs */ + 0x46, 0x01, /* Alert reason */ + 0x02, /* Memory Available (SMMA) */ + }; + static const struct test { char *name; const uint8_t *data; @@ -327,6 +336,8 @@ static void test_gsup_messages_dec_enc(void) send_mo_mt_forward_sm_rsp, sizeof(send_mo_mt_forward_sm_rsp)}, {"MO-/MT-ForwardSM Error", send_mo_mt_forward_sm_err, sizeof(send_mo_mt_forward_sm_err)}, + {"ReadyForSM (MSC -> SMSC) Indication", + send_ready_for_sm_ind, sizeof(send_ready_for_sm_ind)}, }; printf("Test GSUP message decoding/encoding\n"); @@ -394,7 +405,7 @@ static void test_gsup_messages_dec_enc(void) * FIXME: share the maximal IE value somehow * in order to avoid manual updating of this */ - OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SM_RP_MMS_IE); + OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SM_ALERT_RSN_IE); OSMO_ASSERT(t->data[j+1] <= ie_end - j - 2); ie_end = j; diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err index 4a1357c44..236c38a9f 100644 --- a/tests/gsup/gsup_test.err +++ b/tests/gsup/gsup_test.err @@ -61,6 +61,9 @@ generated message: 25 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 40 01 fa 44 01 af original message: 25 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 40 01 fa 44 01 af IMSI: 123456789012345 + generated message: 2c 01 08 21 43 65 87 09 21 43 f5 46 01 02 + original message: 2c 01 08 21 43 65 87 09 21 43 f5 46 01 02 + 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 @@ -82,6 +85,7 @@ message 18: tested 44 truncations, 39 parse failures message 19: tested 20 truncations, 18 parse failures message 20: tested 26 truncations, 22 parse failures + message 21: tested 14 truncations, 13 parse failures DLGSUP Stopping DLGSUP logging message 0: tested 2816 modifications, 510 parse failures message 1: tested 3584 modifications, 770 parse failures @@ -104,3 +108,4 @@ DLGSUP Stopping DLGSUP logging message 18: tested 11264 modifications, 2307 parse failures message 19: tested 5120 modifications, 1031 parse failures message 20: tested 6656 modifications, 1546 parse failures + message 21: tested 3584 modifications, 771 parse failures diff --git a/tests/gsup/gsup_test.ok b/tests/gsup/gsup_test.ok index 7a9455db7..36e35c8bc 100644 --- a/tests/gsup/gsup_test.ok +++ b/tests/gsup/gsup_test.ok @@ -41,4 +41,6 @@ Test GSUP message decoding/encoding MO-/MT-ForwardSM Response OK Testing MO-/MT-ForwardSM Error MO-/MT-ForwardSM Error OK + Testing ReadyForSM (MSC -> SMSC) Indication + ReadyForSM (MSC -> SMSC) Indication OK Done.