ipa: Pull everything together: L3->BSSAP->SCCP->IPA
diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
new file mode 100644
index 0000000..8f60b5c
--- /dev/null
+++ b/library/L3_Templates.ttcn
@@ -0,0 +1,112 @@
+module L3_Templates {
+
+import from General_Types all;
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from MobileL3_MM_Types all;
+import from MobileL3_RRM_Types all;
+
+type enumerated CmServiceType {
+ CM_TYPE_MO_CALL ('0001'B),
+ CM_TYPE_EMERG_CALL ('0010'B),
+ CM_TYPE_MO_SMS ('0100'B),
+ CM_TYPE_SS_ACT ('1000'B)
+}
+
+
+/* send template fro Mobile Identity (TMSI) */
+template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := {
+ lengthIndicator := 0, /* overwritten */
+ mobileIdentityV := {
+ typeOfIdentity := '000'B, /* overwritten */
+ oddEvenInd_identity := {
+ tmsi_ptmsi := {
+ oddevenIndicator := '0'B,
+ fillerDigit := '1111'B,
+ octets := tmsi
+ }
+ }
+ }
+}
+
+private function f_enc_IMSI_L3(hexstring digits) return IMSI_L3 {
+ var IMSI_L3 l3;
+ var integer len := lengthof(digits);
+ if (len rem 2 == 1) { /* modulo remainder */
+ l3.oddevenIndicator := '0'B;
+ l3.fillerDigit := '1111'B;
+ } else {
+ l3.oddevenIndicator := '1'B;
+ l3.fillerDigit := omit;
+ }
+ l3.digits := digits;
+ return l3;
+}
+
+/* send template fro Mobile Identity (IMSI) */
+template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
+ lengthIndicator := 0, /* overwritten */
+ mobileIdentityV := {
+ typeOfIdentity := '000'B, /* overwritten */
+ oddEvenInd_identity := {
+ imsi := f_enc_IMSI_L3(imsi_digits)
+ }
+ }
+}
+
+/* Send template for Classmark 2 */
+template (value) MobileStationClassmark2_LV ts_CM2 := {
+ lengthIndicator := 0,
+ rf_PowerCapability := '000'B,
+ a5_1 := '0'B,
+ esind := '1'B,
+ revisionLevel := '10'B,
+ spare1_1 := '0'B,
+ mobileStationClassmark2_oct4 := omit,
+ mobileStationClassmark2_oct5 := omit
+};
+
+/* Send template for CM SERVICE REQUEST */
+template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(BIT4 serv_type, MobileIdentityLV mi_lv) := {
+ discriminator := '0000'B, /* overwritten */
+ tiOrSkip := {
+ skipIndicator := '0000'B
+ },
+ msgs := {
+ mm := {
+ cMServiceRequest := {
+ messageType := '000000'B, /* overwritten */
+ nsd := '00'B,
+ cm_ServiceType := serv_type,
+ cipheringKeySequenceNumber := { '000'B, '0'B },
+ mobileStationClassmark2 := ts_CM2,
+ mobileIdentity := mi_lv,
+ priorityLevel := omit,
+ additionalUpdateParameterTV := omit,
+ deviceProperties := omit
+ }
+ }
+ }
+}
+
+/* Send template for PAGING RESPONSE */
+template (value) PDU_ML3_MS_NW ts_PAG_RESP(MobileIdentityLV mi_lv) := {
+ discriminator := '0000'B, /* overwritten */
+ tiOrSkip := {
+ skipIndicator := '0000'B
+ },
+ msgs := {
+ rrm := {
+ pagingResponse := {
+ messageType := '00000000'B, /* overwritten */
+ cipheringKeySequenceNumber := { '000'B, '0'B },
+ spare1_4 := '0000'B,
+ mobileStationClassmark := ts_CM2,
+ mobileIdentity := mi_lv,
+ additionalUpdateParameters := omit
+ }
+ }
+ }
+}
+
+}