aboutsummaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-04-09 18:19:24 +0200
committerHarald Welte <laforge@gnumonks.org>2018-04-09 22:53:49 +0200
commitf45efeb15e77a7a0f651379aca1b89fb4a721aee (patch)
tree16933dd281dc01e342e66eec8eac1cd31521025b /library
parentb9e86fa815725b2f9fcdae47b1edeac290477f45 (diff)
msc: Initial SMS testing (MO + MT SMS, successful case, no SMPP)
Diffstat (limited to 'library')
-rw-r--r--library/L3_Templates.ttcn284
1 files changed, 282 insertions, 2 deletions
diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
index 3203b0ed..33046622 100644
--- a/library/L3_Templates.ttcn
+++ b/library/L3_Templates.ttcn
@@ -2,7 +2,7 @@ module L3_Templates {
/* L3 Templates, building on top of MobileL3*_Types from Ericsson.
*
- * (C) 2017 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2017-2018 by Harald Welte <laforge@gnumonks.org>
* All rights reserved.
*
* Released under the terms of GNU General Public License, Version 2 or
@@ -17,7 +17,7 @@ import from MobileL3_MM_Types all;
import from MobileL3_RRM_Types all;
import from MobileL3_CC_Types all;
import from MobileL3_GMM_SM_Types all;
-//import from MobileL3_SMS_Types all;
+import from MobileL3_SMS_Types all;
/* TS 24.007 Table 11.3 TI Flag */
const BIT1 c_TIF_ORIG := '0'B;
@@ -2168,4 +2168,284 @@ external function enc_MobileIdentityLV(in MobileIdentityLV si) return octetstrin
with { extension "prototype(convert) encode(RAW)" };
+
+/* SMS TPDU Layer */
+
+template (value) TPDU_RP_DATA_MS_SGSN ts_SMS_SUBMIT(OCT1 msg_ref, template (value) TP_DA dst_addr,
+ template (value) OCT1 pid, template (value) OCT1 dcs,
+ integer length_ind, octetstring user_data) := {
+ sMS_SUBMIT := {
+ tP_MTI := '01'B, /* SUBMIT */
+ tP_RD := '1'B, /* reject duplicates */
+ tP_VPF := '00'B, /* not present */
+ tP_SRR := '0'B, /* no status report requested */
+ tP_UDHI := '0'B, /* no user data header in UD */
+ tP_RP := '0'B, /* no reply path */
+ tP_MR := msg_ref,
+ tP_DA := dst_addr,
+ tP_PID := pid,
+ tP_DCS := dcs,
+ tP_VP := omit,
+ tP_UDL_UD := {
+ tP_LengthIndicator := length_ind,
+ tP_UD := user_data
+ }
+ }
+}
+
+template TPDU_RP_DATA_SGSN_MS tr_SMS_DELIVER(template TP_OA src_addr := ?,
+ template octetstring user_data := ?,
+ template OCT1 pid := ?, template OCT1 dcs := ?,
+ template BIT1 mms := ?
+ ) := {
+ sMS_DELIVER := {
+ tP_MTI := '00'B, /* DELIVER */
+ tP_MMS := mms, /* more messages to send */
+ tP_LP := ?, /* ?!? */
+ tP_Spare := '0'B,
+ tP_SRI := '0'B, /* status report indication */
+ tP_UDHI := '0'B, /* no user data header in UD */
+ tP_RP := '0'B, /* no reply path */
+ tP_OA := src_addr,
+ tP_PID := pid,
+ tP_DCS := dcs,
+ tP_SCTS := ?,
+ tP_UDL_UD := {
+ tP_LengthIndicator := ?,
+ tP_UD := user_data
+ }
+ }
+}
+
+/* RP Layer */
+
+private function ts_RpOrig(template (omit) RP_NumberingPlan_and_NumberDigits rp_orig)
+return RP_OriginatorAddressLV {
+ var RP_OriginatorAddressLV ret;
+ if (istemplatekind(rp_orig, "omit")) {
+ ret := { 0, omit };
+ } else {
+ ret := { 0, valueof(rp_orig) };
+ }
+ return ret;
+}
+
+private function ts_RpDst(template (omit) RP_NumberingPlan_and_NumberDigits rp_dst)
+return RP_DestinationAddressLV {
+ var RP_DestinationAddressLV ret;
+ if (istemplatekind(rp_dst, "omit")) {
+ ret := { 0, omit };
+ } else {
+ ret := { 0, valueof(rp_dst) };
+ }
+ return ret;
+}
+
+template (value) RPDU_MS_SGSN ts_RP_DATA_MO(OCT1 msg_ref,
+ template (omit) RP_NumberingPlan_and_NumberDigits rp_orig,
+ template (omit) RP_NumberingPlan_and_NumberDigits rp_dst,
+ template (value) TPDU_RP_DATA_MS_SGSN tpdu) := {
+ rP_DATA_MS_SGSN := {
+ rP_MTI := '000'B,
+ rP_Spare := '00000'B,
+ rP_MessageReference := msg_ref,
+ rP_OriginatorAddress := ts_RpOrig(rp_orig),
+ rP_DestinationAddress := ts_RpDst(rp_dst),
+ rP_User_Data := {
+ rP_LengthIndicator := 0, /* overwritten */
+ rP_TPDU := tpdu
+ }
+ }
+}
+
+template RPDU_SGSN_MS tr_RP_DATA_MT(template OCT1 msg_ref,
+ template RP_NumberingPlan_and_NumberDigits rp_orig,
+ template RP_NumberingPlan_and_NumberDigits rp_dst,
+ template TPDU_RP_DATA_SGSN_MS tpdu) := {
+ rP_DATA_SGSN_MS := {
+ rP_MTI := '001'B,
+ rP_Spare := '00000'B,
+ rP_MessageReference := msg_ref,
+ rP_OriginatorAddress := { ?, rp_orig },
+ rP_DestinationAddress := { ?, rp_dst },
+ rP_User_Data := {
+ rP_LengthIndicator := ?,
+ rP_TPDU := tpdu
+ }
+
+ }
+}
+
+template (value) RPDU_MS_SGSN ts_RP_ACK_MO(OCT1 msg_ref) := {
+ rP_ACK_MS_SGSN := {
+ rP_MTI := '010'B,
+ rP_Spare := '00000'B,
+ rP_MessageReference := msg_ref,
+ rP_User_Data := omit /* FIXME: report */
+ }
+}
+
+template RPDU_SGSN_MS tr_RP_ACK_MT(template OCT1 msg_ref) := {
+ rP_ACK_SGSN_MS := {
+ rP_MTI := '011'B,
+ rP_Spare := '00000'B,
+ rP_MessageReference := msg_ref,
+ rP_User_Data := omit /* FIXME: report */
+ }
+}
+
+template (value) RPDU_MS_SGSN ts_RP_ERROR_MO(OCT1 msg_ref, uint7_t cause) := {
+ rP_ERROR_MS_SGSN := {
+ rP_MTI := '100'B,
+ rP_Spare := '00000'B,
+ rP_Message_Reference := msg_ref,
+ rP_CauseLV := {
+ rP_LengthIndicator := 0, /* overwritten */
+ rP_CauseV := {
+ causeValue := int2bit(cause, 7),
+ ext := '0'B
+ },
+ rP_diagnisticField := omit
+ },
+ rP_User_Data := omit /* FIXME: report */
+ }
+}
+
+private function f_cause_or_wc(template uint7_t cause) return template BIT7 {
+ if (istemplatekind(cause, "?")) {
+ return ?;
+ } else if (istemplatekind(cause, "*")) {
+ return *;
+ } else {
+ return int2bit(valueof(cause), 7);
+ }
+}
+
+template RPDU_SGSN_MS tr_RP_ERROR_MT(template OCT1 msg_ref, template uint7_t cause) := {
+ rP_ERROR_SGSN_MS := {
+ rP_MTI := '101'B,
+ rP_Spare := '00000'B,
+ rP_Message_Reference := msg_ref,
+ rP_CauseLV := {
+ rP_LengthIndicator := 0, /* overwritten */
+ rP_CauseV := {
+ causeValue := f_cause_or_wc(cause),
+ ext := '0'B
+ },
+ rP_diagnisticField := omit
+ },
+ rP_User_Data := omit /* FIXME: report */
+ }
+}
+
+
+template (value) RPDU_MS_SGSN ts_RP_SMMA_MO(OCT1 msg_ref) := {
+ rP_SMMA := {
+ rP_MTI := '110'B,
+ rP_Spare := '00000'B,
+ rP_MessageReference := msg_ref
+ }
+}
+
+
+
+
+/* CP Layer */
+
+template (value) L3_SMS_MS_SGSN ts_CP_DATA_MO(template (value) RPDU_MS_SGSN rpdu) := {
+ cP_DATA := {
+ cP_messageType := '00000001'B,
+ cP_User_Data := {
+ lengthIndicator := 0, /* overwritten */
+ cP_RPDU := rpdu
+ }
+ }
+}
+
+template (value) L3_SMS_MS_SGSN ts_CP_ACK_MO := {
+ cP_ACK := {
+ cP_messageType := '00000100'B
+ }
+}
+
+template (value) L3_SMS_MS_SGSN ts_CP_ERROR_MO(OCT1 cause) := {
+ cP_ERROR := {
+ cP_messageType := '00010000'B,
+ cP_Cause := {
+ causeValue := cause
+ }
+ }
+}
+
+template L3_SMS_SGSN_MS tr_CP_DATA_MT(template RPDU_SGSN_MS rpdu) := {
+ cP_DATA := {
+ cP_messageType := '00000001'B,
+ cP_User_Data := {
+ lengthIndicator := ?,
+ cP_RPDU := rpdu
+ }
+ }
+}
+
+template L3_SMS_SGSN_MS tr_CP_ACK_MT := {
+ cP_ACK := {
+ cP_messageType := '00000100'B
+ }
+}
+
+template L3_SMS_SGSN_MS tr_CP_ERROR_MT(template OCT1 cause) := {
+ cP_ERROR := {
+ cP_messageType := '00010000'B,
+ cP_Cause := {
+ causeValue := cause
+ }
+ }
+}
+
+/* L3 Wrapper */
+
+template (value) PDU_ML3_MS_NW ts_ML3_MO_SMS(uint3_t tid, BIT1 ti_flag,
+ template (value) L3_SMS_MS_SGSN sms_mo) := {
+ discriminator := '1001'B,
+ tiOrSkip := {
+ transactionId := {
+ tio := int2bit(tid, 3),
+ tiFlag := ti_flag,
+ tIExtension := omit
+ }
+ },
+ msgs := {
+ sms := sms_mo
+ }
+}
+
+private function f_tid_or_wc(template uint3_t tid) return template BIT3 {
+ var template BIT3 ret;
+ if (istemplatekind(tid, "*")) {
+ return *;
+ } else if (istemplatekind(tid, "?")) {
+ return ?;
+ } else {
+ return int2bit(valueof(tid), 3);
+ }
+}
+
+template PDU_ML3_NW_MS tr_ML3_MT_SMS(template uint3_t tid, template BIT1 ti_flag,
+ template L3_SMS_SGSN_MS sms_mt) := {
+ discriminator := '1001'B,
+ tiOrSkip := {
+ transactionId := {
+ tio := f_tid_or_wc(tid),
+ tiFlag := ti_flag,
+ tIExtension := omit
+ }
+ },
+ msgs := {
+ sms := sms_mt
+ }
+}
+
+
+
+
}