Vadim Yanitskiy has uploaded this change for review. ( 
https://gerrit.osmocom.org/11062


Change subject: library/GSUP_Types.ttcn: add MO/MT FORWARD_SM messages
......................................................................

library/GSUP_Types.ttcn: add 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 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, in particular using the
GSUP_SESSION_ID_IE. The session state IE isn't used due to
the 'REQ-RSP' nature of this message.

Change-Id: Ibf49474a81235096c032ea21f217170f523bd94e
---
M library/GSUP_Types.ttcn
1 file changed, 310 insertions(+), 3 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks 
refs/changes/62/11062/1

diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
index fed13bf..a7c4732 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -48,7 +48,10 @@
        /* SM related IEs (see 3GPP TS 29.002, section 7.6.8) */
        OSMO_GSUP_SMSC_ADDR_IE          ('40'O),
        OSMO_GSUP_NODE_ADDR_IE          ('41'O),
-       OSMO_GSUP_SM_RP_RPI_IE          ('42'O)
+       OSMO_GSUP_SM_RP_RPI_IE          ('42'O),
+       OSMO_GSUP_SM_RP_DA_IE           ('43'O),
+       OSMO_GSUP_SM_RP_OA_IE           ('44'O),
+       OSMO_GSUP_SM_RP_UI_IE           ('45'O)
 } with { variant "FIELDLENGTH(8)" };

 type enumerated GSUP_MessageType {
@@ -85,7 +88,15 @@
        /* FIXME: 0b001001? any ideas? */
        OSMO_GSUP_MSGT_SRI_FOR_SM_REQUEST       ('00100100'B),
        OSMO_GSUP_MSGT_SRI_FOR_SM_ERROR         ('00100101'B),
-       OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT        ('00100110'B)
+       OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT        ('00100110'B),
+
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST    ('00101000'B),
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR      ('00101001'B),
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT     ('00101010'B),
+
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST    ('00110000'B),
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR      ('00110001'B),
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT     ('00110010'B)
 } with { variant "FIELDLENGTH(8)" };

 type enumerated GSUP_CancelType {
@@ -141,6 +152,9 @@
                                 smsc_addr, tag = OSMO_GSUP_SMSC_ADDR_IE;
                                 node_addr, tag = OSMO_GSUP_NODE_ADDR_IE;
                                 sm_rp_rpi, tag = OSMO_GSUP_SM_RP_RPI_IE;
+                                sm_rp_da, tag = OSMO_GSUP_SM_RP_DA_IE;
+                                sm_rp_oa, tag = OSMO_GSUP_SM_RP_OA_IE;
+                                sm_rp_ui, tag = OSMO_GSUP_SM_RP_UI_IE;
                        )"
 };

@@ -178,7 +192,10 @@
        /* Short Message Service */
        octetstring             smsc_addr, /* FIXME: octetstring? */
        octetstring             node_addr, /* FIXME: octetstring? */
-       boolean                 sm_rp_rpi /* FIXME: boolean? */
+       boolean                 sm_rp_rpi, /* FIXME: boolean? */
+       GSUP_SM_RP_DA           sm_rp_da,
+       GSUP_SM_RP_OA           sm_rp_oa,
+       octetstring             sm_rp_ui
 };

 type record GSUP_PDU {
@@ -655,6 +672,140 @@
        }
 }

+/**
+ * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
+ * It can be either of the following:
+ *  - IMSI
+ *  - LMSI (not implemented)
+ *  - MSISDN
+ *  - roaming number (not implemented)
+ *  - service centre address
+ */
+type union GSUP_SM_RP_DA_IeValue {
+       hexstring       imsi,
+       hexstring       msisdn,
+       octetstring     smsc_addr
+};
+
+type record GSUP_SM_RP_DA {
+       GSUP_IEI                tag,
+       GSUP_SM_RP_DA_IeValue   val
+} with { variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
+                                msisdn, tag = OSMO_GSUP_MSISDN_IE;
+                                smsc_addr, tag = OSMO_GSUP_SMSC_ADDR_IE;
+                       )"
+};
+
+template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
+       tag := OSMO_GSUP_IMSI_IE,
+       val := { imsi := imsi }
+}
+template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
+       tag := OSMO_GSUP_IMSI_IE,
+       val := { imsi := imsi }
+}
+
+template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(hexstring msisdn) := {
+       tag := OSMO_GSUP_MSISDN_IE,
+       val := { msisdn := msisdn }
+}
+template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template hexstring msisdn) := {
+       tag := OSMO_GSUP_MSISDN_IE,
+       val := { msisdn := msisdn }
+}
+
+template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(octetstring 
smsc_addr) := {
+       tag := OSMO_GSUP_SMSC_ADDR_IE,
+       val := { smsc_addr := smsc_addr }
+}
+template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template octetstring 
smsc_addr) := {
+       tag := OSMO_GSUP_SMSC_ADDR_IE,
+       val := { smsc_addr := smsc_addr }
+}
+
+template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
+       tag := OSMO_GSUP_SM_RP_DA_IE,
+       len := 0, /* overwritten */
+       val := {
+               sm_rp_da := val
+       }
+}
+template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
+       tag := OSMO_GSUP_SM_RP_DA_IE,
+       len := ?,
+       val := {
+               sm_rp_da := val
+       }
+}
+
+/**
+ * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
+ * It can be either of the following:
+ *  - MSISDN
+ *  - service centre address
+ */
+type union GSUP_SM_RP_OA_IeValue {
+       hexstring       msisdn,
+       octetstring     smsc_addr
+};
+
+type record GSUP_SM_RP_OA {
+       GSUP_IEI                tag,
+       GSUP_SM_RP_OA_IeValue   val
+} with { variant (val) "CROSSTAG(msisdn, tag = OSMO_GSUP_MSISDN_IE;
+                                smsc_addr, tag = OSMO_GSUP_SMSC_ADDR_IE;
+                       )"
+};
+
+template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(hexstring msisdn) := {
+       tag := OSMO_GSUP_MSISDN_IE,
+       val := { msisdn := msisdn }
+}
+template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template hexstring msisdn) := {
+       tag := OSMO_GSUP_MSISDN_IE,
+       val := { msisdn := msisdn }
+}
+
+template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(octetstring 
smsc_addr) := {
+       tag := OSMO_GSUP_SMSC_ADDR_IE,
+       val := { smsc_addr := smsc_addr }
+}
+template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template octetstring 
smsc_addr) := {
+       tag := OSMO_GSUP_SMSC_ADDR_IE,
+       val := { smsc_addr := smsc_addr }
+}
+
+template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
+       tag := OSMO_GSUP_SM_RP_OA_IE,
+       len := 0, /* overwritten */
+       val := {
+               sm_rp_oa := val
+       }
+}
+template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
+       tag := OSMO_GSUP_SM_RP_OA_IE,
+       len := ?,
+       val := {
+               sm_rp_oa := val
+       }
+}
+
+/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
+template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
+       tag := OSMO_GSUP_SM_RP_UI_IE,
+       len := 0, /* overwritten */
+       val := {
+               sm_rp_ui := val
+       }
+}
+template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
+       tag := OSMO_GSUP_SM_RP_UI_IE,
+       len := ?,
+       val := {
+               sm_rp_ui := val
+       }
+}
+
 template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
        tag := OSMO_GSUP_SS_INFO_IE,
        len := 0, /* overwritten */
@@ -853,6 +1004,162 @@
        }
 );

+template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
+       OCT4 sid, /* TCAP TransactionID */
+       GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
+       GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
+       octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
+       {
+               /* TODO: optional IMSI */
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
+               valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
+               valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
+       }
+);
+template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
+       template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
+       template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
+       {
+               /* TODO: optional IMSI */
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_SM_RP_DA(sm_rp_da),
+               tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
+               tr_GSUP_IE_SM_RP_UI(sm_rp_ui)
+       }
+);
+
+template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
+       OCT4 sid, /* TCAP TransactionID */
+       octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
+       {
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
+       }
+);
+template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
+       {
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_SM_RP_UI(sm_rp_ui)
+       }
+);
+
+template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
+       OCT4 sid, /* TCAP TransactionID */
+       integer cause /* User error, see 12.2.3 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
+       {
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_Cause(cause))
+       }
+);
+template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template integer cause := ? /* User error, see 12.2.3 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
+       {
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_Cause(cause)
+       }
+);
+
+template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
+       OCT4 sid, /* TCAP TransactionID */
+       GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
+       GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
+       octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
+       {
+               /**
+                * TODO: add MT-specific fields (and IEs):
+                *  - moreMessagesToSend
+                *  - smDeliveryTimer
+                *  - smDeliveryStartTime
+                */
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
+               valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
+               valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
+       }
+);
+template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
+       template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
+       template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
+       {
+               /**
+                * TODO: add MT-specific fields (and IEs):
+                *  - moreMessagesToSend
+                *  - smDeliveryTimer
+                *  - smDeliveryStartTime
+                */
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_SM_RP_DA(sm_rp_da),
+               tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
+               tr_GSUP_IE_SM_RP_UI(sm_rp_ui)
+       }
+);
+
+template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
+       OCT4 sid, /* TCAP TransactionID */
+       octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
+       {
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
+       }
+);
+template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
+       {
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_SM_RP_UI(sm_rp_ui)
+       }
+);
+
+template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
+       OCT4 sid, /* TCAP TransactionID */
+       integer cause /* User error, see 12.9.3 */
+) := ts_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
+       {
+               valueof(ts_GSUP_IE_SessionId(sid)),
+               valueof(ts_GSUP_IE_Cause(cause))
+       }
+);
+template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
+       template OCT4 sid := ?, /* TCAP TransactionID */
+       template integer cause := ? /* User error, see 12.9.3 */
+) := tr_GSUP(
+       OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
+       {
+               tr_GSUP_IE_SessionId(sid),
+               tr_GSUP_IE_Cause(cause)
+       }
+);
+
 function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) 
return boolean {
        for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
                if (msg.ies[i].tag == iei) {

--
To view, visit https://gerrit.osmocom.org/11062
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibf49474a81235096c032ea21f217170f523bd94e
Gerrit-Change-Number: 11062
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <[email protected]>

Reply via email to