diff options
| author | Vadim Yanitskiy <axilirator@gmail.com> | 2018-11-13 02:06:15 +0700 | 
|---|---|---|
| committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-12-18 21:52:06 +0700 | 
| commit | f9ee8da0cda6a8989c706e618915d09c9cffd0f4 (patch) | |
| tree | 8abca8cf5ed4576b2b39b3f4dfe3e338f44e92a1 | |
| parent | c2628317cc3482262c80b93cbfb2cbe960772558 (diff) | |
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
| -rw-r--r-- | include/osmocom/gsm/gsup.h | 7 | ||||
| -rw-r--r-- | include/osmocom/gsm/gsup_sms.h | 7 | ||||
| -rw-r--r-- | src/gsm/gsup.c | 13 | ||||
| -rw-r--r-- | tests/gsup/gsup_test.c | 13 | ||||
| -rw-r--r-- | tests/gsup/gsup_test.err | 5 | ||||
| -rw-r--r-- | tests/gsup/gsup_test.ok | 2 | 
6 files changed, 46 insertions, 1 deletions
diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h index 192b877b..51871e44 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 521412d6..480971e6 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 e4339971..c1c99923 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 09368933..b3a8c772 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 4a1357c4..236c38a9 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 7a9455db..36e35c8b 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.  | 
