This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Vadim Yanitskiy gerrit-no-reply at lists.osmocom.orgVadim Yanitskiy has uploaded this change for review. ( https://gerrit.osmocom.org/11069
Change subject: GSUP/SM: (WIP) introduce MO/MT FORWARD_SM messages
......................................................................
GSUP/SM: (WIP) introduce MO/MT FORWARD_SM messages
According to 3GPP TS 29.002, sections 12.2 and 12.9 the FORWARD_SM
messages (a.k.a MAP-*-FORWARD-SHORT-MESSAGE) are used to forward
MO/MT SMS messages.
Please note that only the 'must-have' fields of of both message
types are introduced by this change, in particular:
- OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_REQUEST (MAP Request)
- OSMO_GSUP_SM_RP_DA_IE
- OSMO_GSUP_SM_RP_OA_IE
- OSMO_GSUP_SM_RP_UI_IE
- OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_RESULT (MAP ACK)
- OSMO_GSUP_SM_RP_UI_IE
- OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_ERROR (MAP Response)
- GSUP_CAUSE_IE (MAP User Error, see 7.6.1)
Since there is no TCAP layer in GSUP, the context is emulated
using the session management IEs (see GSUP_SESSION_*_IE).
Change-Id: Ibe325c64ae2d6c626b232533bb4cbc65fc2b5d71
---
M include/osmocom/gsm/gsup.h
M src/gsm/gsup.c
M tests/gsup/gsup_test.err
3 files changed, 96 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/69/11069/1
diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h
index bed61ae..3f9a3f9 100644
--- a/include/osmocom/gsm/gsup.h
+++ b/include/osmocom/gsm/gsup.h
@@ -93,6 +93,9 @@
OSMO_GSUP_SMSC_ADDR_IE = 0x40,
OSMO_GSUP_NODE_ADDR_IE = 0x41,
OSMO_GSUP_SM_RP_RPI_IE = 0x42,
+ OSMO_GSUP_SM_RP_DA_IE = 0x43,
+ OSMO_GSUP_SM_RP_OA_IE = 0x44,
+ OSMO_GSUP_SM_RP_UI_IE = 0x45,
};
/*! GSUP message type */
@@ -131,6 +134,14 @@
OSMO_GSUP_MSGT_SRI_FOR_SM_REQUEST = 0b00100100,
OSMO_GSUP_MSGT_SRI_FOR_SM_ERROR = 0b00100101,
OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT = 0b00100110,
+
+ OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST = 0b00101000,
+ OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR = 0b00101001,
+ OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT = 0b00101010,
+
+ OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST = 0b00110000,
+ OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR = 0b00110001,
+ OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT = 0b00110010,
};
#define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)
@@ -231,6 +242,25 @@
size_t node_addr_len;
/*! HACK: SM-RP-RPI is (<0 / 0 / >0) => (false / omited / true) */
int sm_rp_rpi;
+
+ /*! SM Destination Address, see 7.6.8.1. It can be of the following:
+ ** IMSI, LMSI, MSISDN, roaming number, or service centre address.
+ ** The values from 'osmo_gsup_iei' enum are used for 'sm_rp_da_type'.
+ ** NOTE: LMSI, roaming number are not implemented */
+ const uint8_t *sm_rp_da;
+ uint8_t sm_rp_da_type;
+ size_t sm_rp_da_len;
+
+ /*! SM Originating Address, see 7.6.8.2. It can be of the following:
+ ** MSISDN or service centre address. ** The values from 'osmo_gsup_iei'
+ ** enum are used for 'sm_rp_da_type'. */
+ const uint8_t *sm_rp_oa;
+ uint8_t sm_rp_oa_type;
+ size_t sm_rp_oa_len;
+
+ /*! SM TPDU (Transport Protocol Data Unit), see 7.6.8.4 */
+ const uint8_t *sm_rp_ui;
+ size_t sm_rp_ui_len;
};
int osmo_gsup_decode(const uint8_t *data, size_t data_len,
diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c
index 22e26f1..752cfca 100644
--- a/src/gsm/gsup.c
+++ b/src/gsm/gsup.c
@@ -71,6 +71,14 @@
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_SRI_FOR_SM_ERROR),
OSMO_VALUE_STRING(OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT),
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST),
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR),
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT),
+
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST),
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR),
+ OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT),
+
{ 0, NULL }
};
@@ -452,6 +460,37 @@
gsup_msg->sm_rp_rpi = (*value) ? 1 : -1;
break;
+ case OSMO_GSUP_SM_RP_DA_IE:
+ /* First octet contains type of address */
+ if (value_len < 1) {
+ LOGP(DLGSUP, LOGL_ERROR, "Short read of "
+ "SM_RP_DA_IE (missing address type)\n");
+ return -GMM_CAUSE_COND_IE_ERR;
+ }
+
+ gsup_msg->sm_rp_da = value + 1; /* Skip address type */
+ gsup_msg->sm_rp_da_len = value_len - 1;
+ gsup_msg->sm_rp_da_type = value[0];
+ break;
+
+ case OSMO_GSUP_SM_RP_OA_IE:
+ /* First octet contains type of address */
+ if (value_len < 1) {
+ LOGP(DLGSUP, LOGL_ERROR, "Short read of "
+ "SM_RP_OA_IE (missing address type)\n");
+ return -GMM_CAUSE_COND_IE_ERR;
+ }
+
+ gsup_msg->sm_rp_oa = value + 1; /* Skip address type */
+ gsup_msg->sm_rp_oa_len = value_len - 1;
+ gsup_msg->sm_rp_oa_type = value[0];
+ break;
+
+ case OSMO_GSUP_SM_RP_UI_IE:
+ gsup_msg->sm_rp_ui = value;
+ gsup_msg->sm_rp_ui_len = value_len;
+ break;
+
default:
LOGP(DLGSUP, LOGL_NOTICE,
"GSUP IE type %d unknown\n", iei);
@@ -659,6 +698,31 @@
msgb_tlv_put(msg, OSMO_GSUP_SM_RP_RPI_IE, sizeof(u8), &u8);
}
+ if (gsup_msg->sm_rp_da) {
+ /* Compose TLTV manually */
+ uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(gsup_msg->sm_rp_da_len + 1));
+ *buf++ = OSMO_GSUP_SM_RP_DA_IE;
+ *buf++ = gsup_msg->sm_rp_da_len + 1;
+ *buf++ = gsup_msg->sm_rp_da_type;
+ if (gsup_msg->sm_rp_da_len)
+ memcpy(buf, gsup_msg->sm_rp_da, gsup_msg->sm_rp_da_len);
+ }
+
+ if (gsup_msg->sm_rp_oa) {
+ /* Compose TLTV manually */
+ uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(gsup_msg->sm_rp_oa_len + 1));
+ *buf++ = OSMO_GSUP_SM_RP_OA_IE;
+ *buf++ = gsup_msg->sm_rp_oa_len + 1;
+ *buf++ = gsup_msg->sm_rp_oa_type;
+ if (gsup_msg->sm_rp_oa_len)
+ memcpy(buf, gsup_msg->sm_rp_oa, gsup_msg->sm_rp_oa_len);
+ }
+
+ if (gsup_msg->sm_rp_ui) {
+ msgb_tlv_put(msg, OSMO_GSUP_SM_RP_UI_IE,
+ gsup_msg->sm_rp_ui_len, gsup_msg->sm_rp_ui);
+ }
+
return 0;
}
diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err
index ac71ac2..389a721 100644
--- a/tests/gsup/gsup_test.err
+++ b/tests/gsup/gsup_test.err
@@ -72,13 +72,13 @@
message 2: tested 21248 modifications, 2571 parse failures
message 3: tested 2816 modifications, 510 parse failures
message 4: tested 3584 modifications, 768 parse failures
- message 5: tested 20736 modifications, 4010 parse failures
+ message 5: tested 20736 modifications, 4012 parse failures
message 6: tested 3584 modifications, 769 parse failures
message 7: tested 3584 modifications, 768 parse failures
message 8: tested 2816 modifications, 510 parse failures
message 9: tested 2816 modifications, 510 parse failures
message 10: tested 3584 modifications, 768 parse failures
- message 11: tested 3328 modifications, 767 parse failures
+ message 11: tested 3328 modifications, 769 parse failures
message 12: tested 54016 modifications, 4622 parse failures
message 13: tested 11520 modifications, 1026 parse failures
message 14: tested 5120 modifications, 1026 parse failures
--
To view, visit https://gerrit.osmocom.org/11069
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibe325c64ae2d6c626b232533bb4cbc65fc2b5d71
Gerrit-Change-Number: 11069
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180923/df117ef0/attachment.htm>