HNBAP, RUA and RANAP protocol codecs

This patch introduces protocol codecs for the HNBAP, RUA and RANAP
protocols, which is mandatory for testing IuCS, IuPS or Iuh in
the future.

As Eclipse TITAN ASN.1 only supports the BER codec and the above
protocols all use APER, we need to use an external transcoder from
APER to BER and vice-versa.  This was implemented using a proprietary
ASN.1 compiler / trnaslator which sysmocom is packaging as
libfftranscode, which is made available as binary package
for Debian 9 at https://ftp.osmocom.org/binaries/libfftranscode/

Related: OS#2856, OS#2857, OS#2858
Change-Id: If4a72de9bc54d6e6a7daaca78a4d4aa5684203a5
diff --git a/library/ranap/RANAP_Templates.ttcn b/library/ranap/RANAP_Templates.ttcn
new file mode 100644
index 0000000..e55f212
--- /dev/null
+++ b/library/ranap/RANAP_Templates.ttcn
@@ -0,0 +1,1427 @@
+module RANAP_Templates {
+
+import from General_Types all;
+
+import from RANAP_IEs all;
+import from RANAP_CommonDataTypes all;
+import from RANAP_Constants all;
+import from RANAP_Containers all;
+import from RANAP_PDU_Contents all;
+import from RANAP_PDU_Descriptions all;
+
+template (value) Cause ts_RanapCause_om_intervention := { misc := 113 };
+
+/*****************************************************************************************************
+ * Reset
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_Reset(template (value) Cause cause, template (value) CN_DomainIndicator dom,
+			  template (omit) Reset.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_Reset,
+		criticality := reject,
+		value_ := {
+			Reset := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}, {
+						id := id_CN_DomainIndicator,
+						criticality := reject,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_Reset(template Cause cause := ?, template CN_DomainIndicator dom := ?,
+			  template Reset.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_Reset,
+		criticality := reject,
+		value_ := {
+			Reset := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}, {
+						id := id_CN_DomainIndicator,
+						criticality := reject,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}, *
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_ResetAck(template (value) CN_DomainIndicator dom,
+		  template (omit) ResetAcknowledge.protocolExtensions exts := omit) := {
+	successfulOutcome := {
+		procedureCode := id_Reset,
+		criticality := reject,
+		value_ := {
+			ResetAcknowledge := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := reject,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_ResetAck(template CN_DomainIndicator dom := ?,
+		  template ResetAcknowledge.protocolExtensions exts := *) := {
+	successfulOutcome := {
+		procedureCode := id_Reset,
+		criticality := reject,
+		value_ := {
+			ResetAcknowledge := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := reject,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}, *
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+/*****************************************************************************************************
+ * Security Mode Control
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_SecurityModeCmd(template (value) PermittedIntegrityProtectionAlgorithms uia_algs,
+			 template (value) IntegrityProtectionKey uia_key,
+			 template (value) KeyStatus key_sts,
+		  	 template (omit) SecurityModeCommand.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeCommand := {
+				protocolIEs := {
+					{
+						id := id_IntegrityProtectionInformation,
+						criticality := reject,
+						value_ := {
+							integrityProtectionInformation := {
+								permittedAlgorithms := uia_algs,
+								key := uia_key,
+								iE_Extensions := omit
+							}
+						}
+					}, {
+						id := id_KeyStatus,
+						criticality := reject,
+						value_ := {
+							keyStatus := key_sts
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_SecurityModeCmd(template PermittedIntegrityProtectionAlgorithms uia_algs,
+			 template IntegrityProtectionKey uia_key,
+			 template KeyStatus key_sts,
+		  	 template SecurityModeCommand.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeCommand := {
+				protocolIEs := {
+					{
+						id := id_IntegrityProtectionInformation,
+						criticality := reject,
+						value_ := {
+							integrityProtectionInformation := {
+								permittedAlgorithms := uia_algs,
+								key := uia_key,
+								iE_Extensions := *
+							}
+						}
+					}, {
+						id := id_KeyStatus,
+						criticality := reject,
+						value_ := {
+							keyStatus := key_sts
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_SecurityModeCmdEnc(template (value) PermittedIntegrityProtectionAlgorithms uia_algs,
+			    template (value) IntegrityProtectionKey uia_key,
+			    template (value) KeyStatus key_sts,
+			    template (value) PermittedEncryptionAlgorithms uea_algs,
+			    template (value) EncryptionKey uea_key,
+		  	    template (omit) SecurityModeCommand.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeCommand := {
+				protocolIEs := {
+					{
+						id := id_IntegrityProtectionInformation,
+						criticality := reject,
+						value_ := {
+							integrityProtectionInformation := {
+								permittedAlgorithms := uia_algs,
+								key := uia_key,
+								iE_Extensions := omit
+							}
+						}
+					}, {
+						id := id_EncryptionInformation,
+						criticality := ignore,
+						value_ := {
+							encryptionInformation := {
+								permittedAlgorithms := uea_algs,
+								key := uea_key,
+								iE_Extensions := omit
+							}
+						}
+					}, {
+						id := id_KeyStatus,
+						criticality := reject,
+						value_ := {
+							keyStatus := key_sts
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_SecurityModeCmdEnc(template PermittedIntegrityProtectionAlgorithms uia_algs,
+			    template IntegrityProtectionKey uia_key,
+			    template KeyStatus key_sts,
+			    template PermittedEncryptionAlgorithms uea_algs,
+			    template EncryptionKey uea_key,
+		  	    template SecurityModeCommand.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeCommand := {
+				protocolIEs := {
+					{
+						id := id_IntegrityProtectionInformation,
+						criticality := reject,
+						value_ := {
+							integrityProtectionInformation := {
+								permittedAlgorithms := uia_algs,
+								key := uia_key,
+								iE_Extensions := *
+							}
+						}
+					}, {
+						id := id_EncryptionInformation,
+						criticality := ignore,
+						value_ := {
+							encryptionInformation := {
+								permittedAlgorithms := uea_algs,
+								key := uea_key,
+								iE_Extensions := *
+							}
+						}
+					}, {
+						id := id_KeyStatus,
+						criticality := reject,
+						value_ := {
+							keyStatus := key_sts
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_SecurityModeComplete(template (value) IntegrityProtectionAlgorithm uia_alg,
+			      template (omit) SecurityModeComplete.protocolExtensions exts := omit) := {
+	successfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeComplete := {
+				protocolIEs := {
+					{
+						id := id_ChosenIntegrityProtectionAlgorithm,
+						criticality := reject,
+						value_ := {
+							chosenIntegrityProtectionAlgorithm := uia_alg
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_SecurityModeComplete(template IntegrityProtectionAlgorithm uia_alg,
+			      template SecurityModeComplete.protocolExtensions exts := *) := {
+	successfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeComplete := {
+				protocolIEs := {
+					{
+						id := id_ChosenIntegrityProtectionAlgorithm,
+						criticality := reject,
+						value_ := {
+							chosenIntegrityProtectionAlgorithm := uia_alg
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_SecurityModeCompleteEnc(template (value) IntegrityProtectionAlgorithm uia_alg,
+				 template (value) EncryptionAlgorithm uea_alg,
+				 template (omit) SecurityModeComplete.protocolExtensions exts := omit) := {
+	successfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeComplete := {
+				protocolIEs := {
+					{
+						id := id_ChosenIntegrityProtectionAlgorithm,
+						criticality := reject,
+						value_ := {
+							chosenIntegrityProtectionAlgorithm := uia_alg
+						}
+					}, {
+						id := id_ChosenEncryptionAlgorithm,
+						criticality := ignore,
+						value_ := {
+							chosenEncryptionAlgorithm := uea_alg
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_SecurityModeCompleteEnc(template IntegrityProtectionAlgorithm uia_alg,
+				 template EncryptionAlgorithm uea_alg,
+				 template SecurityModeComplete.protocolExtensions exts := *) := {
+	successfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeComplete := {
+				protocolIEs := {
+					{
+						id := id_ChosenIntegrityProtectionAlgorithm,
+						criticality := reject,
+						value_ := {
+							chosenIntegrityProtectionAlgorithm := uia_alg
+						}
+					}, {
+						id := id_ChosenEncryptionAlgorithm,
+						criticality := ignore,
+						value_ := {
+							chosenEncryptionAlgorithm := uea_alg
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_SecurityModeReject(template (value) Cause cause,
+			    template (omit) SecurityModeReject.protocolExtensions exts := omit) := {
+	unsuccessfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeReject := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_SecurityModeReject(template Cause cause,
+			    template SecurityModeReject.protocolExtensions exts := *) := {
+	unsuccessfulOutcome := {
+		procedureCode := id_SecurityModeControl,
+		criticality := reject,
+		value_ := {
+			securityModeReject := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+
+/*****************************************************************************************************
+ * Iu Release Request
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_IuReleaseRequest(template (value) Cause cause,
+			  template (omit) Iu_ReleaseRequest.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_Iu_ReleaseRequest,
+		criticality := ignore,
+		value_ := {
+			iu_ReleaseRequest := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := reject,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_IuReleaseRequest(template Cause cause,
+			  template Iu_ReleaseRequest.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_Iu_ReleaseRequest,
+		criticality := ignore,
+		value_ := {
+			iu_ReleaseRequest := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := reject,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+/*****************************************************************************************************
+ * RAB Release
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_RabReleaseRequest(template (value) RAB_ID rab_id, template (value) Cause cause,
+			   template (omit) RAB_ReleaseRequest.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_RAB_ReleaseRequest,
+		criticality := ignore,
+		value_ := {
+			rAB_ReleaseRequest := {
+				protocolIEs := {
+					{
+						id := id_RAB_ReleaseList,
+						criticality := ignore,
+						value_ := {
+							rAB_ReleaseList := {{
+								{
+									id := id_RAB_ReleaseItem,
+									criticality := ignore,
+									value_ := {
+										rAB_ReleaseItem := {
+											rAB_ID := rab_id,
+											cause := cause,
+											iE_Extensions := omit
+										}
+									}
+								}
+							}}
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_RabReleaseRequest(template RAB_ID rab_id, template Cause cause,
+			   template RAB_ReleaseRequest.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_RAB_ReleaseRequest,
+		criticality := ignore,
+		value_ := {
+			rAB_ReleaseRequest := {
+				protocolIEs := {
+					{
+						id := id_RAB_ReleaseList,
+						criticality := ignore,
+						value_ := {
+							rAB_ReleaseList := {{
+								{
+									id := id_RAB_ReleaseItem,
+									criticality := ignore,
+									value_ := {
+										rAB_ReleaseItem := {
+											rAB_ID := rab_id,
+											cause := cause,
+											iE_Extensions := *
+										}
+									}
+								}
+							}}
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+/*****************************************************************************************************
+ * Iu Release
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_IuReleaseCommand(template (value) Cause cause,
+			  template (omit) Iu_ReleaseCommand.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_Iu_Release,
+		criticality := reject,
+		value_ := {
+			iu_ReleaseCommand := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_IuReleaseCommand(template Cause cause,
+			  template Iu_ReleaseCommand.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_Iu_Release,
+		criticality := reject,
+		value_ := {
+			iu_ReleaseCommand := {
+				protocolIEs := {
+					{
+						id := id_Cause,
+						criticality := ignore,
+						value_ := {
+							cause := cause
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_IuReleaseComplete(template (omit) Iu_ReleaseComplete.protocolIEs ies := {},
+			   template (omit) Iu_ReleaseComplete.protocolExtensions exts := omit) := {
+	successfulOutcome := {
+		procedureCode := id_Iu_Release,
+		criticality := reject,
+		value_ := {
+			iu_ReleaseComplete := {
+				protocolIEs := ies,
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_IuReleaseComplete(template Iu_ReleaseComplete.protocolIEs ies := *,
+			   template Iu_ReleaseComplete.protocolExtensions exts := *) := {
+	successfulOutcome := {
+		procedureCode := id_Iu_Release,
+		criticality := reject,
+		value_ := {
+			iu_ReleaseComplete:= {
+				protocolIEs := ies,
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+/*****************************************************************************************************
+ * Paging
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_Paging(template (value) CN_DomainIndicator dom, template (value) IMSI imsi,
+		template (omit) TemporaryUE_ID temp_id := omit,
+		template (omit) Paging.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_Paging,
+		criticality := ignore,
+		value_ := {
+			paging := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}, {
+						id := id_PermanentNAS_UE_ID,
+						criticality := ignore,
+						value_ := {
+							permanentNAS_UE_ID := {
+								iMSI := imsi
+							}
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_Paging(template CN_DomainIndicator dom, template IMSI imsi,
+		template Paging.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_Paging,
+		criticality := ignore,
+		value_ := {
+			paging := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := dom
+						}
+					}, {
+						id := id_PermanentNAS_UE_ID,
+						criticality := ignore,
+						value_ := {
+							permanentNAS_UE_ID := {
+								iMSI := imsi
+							}
+						}
+					}, *
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+
+/*****************************************************************************************************
+ * Common ID
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_CommonId(template (value) IMSI imsi,
+		template (omit) CommonID.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_CommonID,
+		criticality := ignore,
+		value_ := {
+			commonID := {
+				protocolIEs := {
+					{
+						id := id_PermanentNAS_UE_ID,
+						criticality := ignore,
+						value_ := {
+							permanentNAS_UE_ID := {
+								iMSI := imsi
+							}
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_CommonId(template IMSI imsi,
+		  template CommonID.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_CommonID,
+		criticality := ignore,
+		value_ := {
+			commonID := {
+				protocolIEs := {
+					{
+						id := id_PermanentNAS_UE_ID,
+						criticality := ignore,
+						value_ := {
+							permanentNAS_UE_ID := {
+								iMSI := imsi
+							}
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+/*****************************************************************************************************
+ * Initial UE Message
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_initialUE_CS(template (value) LAI lai, template (value) SAI sai,
+		      template (value) NAS_PDU nas,
+		      template (value) IuSignallingConnectionIdentifier sigc_id,
+		      template (value) GlobalRNC_ID grnc_id,
+		      template (omit) InitialUE_Message.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_InitialUE_Message,
+		criticality := ignore,
+		value_ := {
+			initialUE_Message := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := cs_domain
+						}
+					}, {
+						id := id_LAI,
+						criticality := ignore,
+						value_ := {
+							lAI := lai
+						}
+					}, {
+						id := id_SAI,
+						criticality := ignore,
+						value_ := {
+							sAI := sai
+						}
+					}, {
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					}, {
+						id := id_IuSigConId,
+						criticality := ignore,
+						value_ := {
+							iuSignallingConnectionIdentifier := sigc_id
+						}
+					}, {
+						id := id_GlobalRNC_ID,
+						criticality := ignore,
+						value_ := {
+							globalRNC_ID := grnc_id
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_initialUE_CS(template LAI lai, template SAI sai,
+		      template NAS_PDU nas,
+		      template IuSignallingConnectionIdentifier sigc_id,
+		      template GlobalRNC_ID grnc_id,
+		      template InitialUE_Message.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_InitialUE_Message,
+		criticality := ignore,
+		value_ := {
+			initialUE_Message := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := cs_domain
+						}
+					}, {
+						id := id_LAI,
+						criticality := ignore,
+						value_ := {
+							lAI := lai
+						}
+					}, {
+						id := id_SAI,
+						criticality := ignore,
+						value_ := {
+							sAI := sai
+						}
+					}, {
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					}, {
+						id := id_IuSigConId,
+						criticality := ignore,
+						value_ := {
+							iuSignallingConnectionIdentifier := sigc_id
+						}
+					}, {
+						id := id_GlobalRNC_ID,
+						criticality := ignore,
+						value_ := {
+							globalRNC_ID := grnc_id
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_initialUE_PS(template (value) LAI lai, template (value) RAC rac, template (value) SAI sai,
+		      template (value) NAS_PDU nas,
+		      template (value) IuSignallingConnectionIdentifier sigc_id,
+		      template (value) GlobalRNC_ID grnc_id,
+		      template (omit) InitialUE_Message.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_InitialUE_Message,
+		criticality := ignore,
+		value_ := {
+			initialUE_Message := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := ps_domain
+						}
+					}, {
+						id := id_LAI,
+						criticality := ignore,
+						value_ := {
+							lAI := lai
+						}
+					}, {
+						id := id_RAC,
+						criticality := ignore,
+						value_ := {
+							rAC := rac
+						}
+					}, {
+						id := id_SAI,
+						criticality := ignore,
+						value_ := {
+							sAI := sai
+						}
+					}, {
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					}, {
+						id := id_IuSigConId,
+						criticality := ignore,
+						value_ := {
+							iuSignallingConnectionIdentifier := sigc_id
+						}
+					}, {
+						id := id_GlobalRNC_ID,
+						criticality := ignore,
+						value_ := {
+							globalRNC_ID := grnc_id
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_initialUE_PS(template LAI lai, template RAC rac, template SAI sai,
+		      template NAS_PDU nas,
+		      template IuSignallingConnectionIdentifier sigc_id,
+		      template GlobalRNC_ID grnc_id,
+		      template InitialUE_Message.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_InitialUE_Message,
+		criticality := ignore,
+		value_ := {
+			initialUE_Message := {
+				protocolIEs := {
+					{
+						id := id_CN_DomainIndicator,
+						criticality := ignore,
+						value_ := {
+							cN_DomainIndicator := ps_domain
+						}
+					}, {
+						id := id_LAI,
+						criticality := ignore,
+						value_ := {
+							lAI := lai
+						}
+					}, {
+						id := id_RAC,
+						criticality := ignore,
+						value_ := {
+							rAC := rac
+						}
+					}, {
+						id := id_SAI,
+						criticality := ignore,
+						value_ := {
+							sAI := sai
+						}
+					}, {
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					}, {
+						id := id_IuSigConId,
+						criticality := ignore,
+						value_ := {
+							iuSignallingConnectionIdentifier := sigc_id
+						}
+					}, {
+						id := id_GlobalRNC_ID,
+						criticality := ignore,
+						value_ := {
+							globalRNC_ID := grnc_id
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+/*****************************************************************************************************
+ * Direct Transfer
+ *****************************************************************************************************/
+
+template (value) RANAP_PDU
+ts_RANAP_DirectTransfer(template (value) NAS_PDU nas,
+			/* template DirectTransfer.protocolIEs ies := {}, */
+			template (omit) DirectTransfer.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_DirectTransfer,
+		criticality := ignore,
+		value_ := {
+			directTransfer := {
+				protocolIEs := {
+					{
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					}
+					/* LAI, RAC, SAI */
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_DirectTransfer(template NAS_PDU nas,
+			template SAPI sapi := sapi_0,
+			/* template DirectTransfer.protocolIEs ies := {}, */
+			template DirectTransfer.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_DirectTransfer,
+		criticality := ignore,
+		value_ := {
+			directTransfer := {
+				protocolIEs := {
+					{
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					},
+					* /* LAI, RAC, SAI */
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+template (value) RANAP_PDU
+ts_RANAP_DirectTransferSAPI(template (value) NAS_PDU nas,
+			    template (value) SAPI sapi := sapi_0,
+			    /* template DirectTransfer.protocolIEs ies := {}, */
+			    template (omit) DirectTransfer.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_DirectTransfer,
+		criticality := ignore,
+		value_ := {
+			directTransfer := {
+				protocolIEs := {
+					{
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					},
+					/* LAI, RAC, SAI */
+					{
+						id := id_SAPI,
+						criticality := ignore,
+						value_ := {
+							sAPI := sapi
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_DirectTransferSAPI(template NAS_PDU nas,
+			    template SAPI sapi := sapi_0,
+			    /* template DirectTransfer.protocolIEs ies := {}, */
+			    template DirectTransfer.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_DirectTransfer,
+		criticality := ignore,
+		value_ := {
+			directTransfer := {
+				protocolIEs := {
+					{
+						id := id_NAS_PDU,
+						criticality := ignore,
+						value_ := {
+							nAS_PDU := nas
+						}
+					},
+					*, /* LAI, RAC, SAI */
+					{
+						id := id_SAPI,
+						criticality := ignore,
+						value_ := {
+							sAPI := sapi
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+/*****************************************************************************************************
+ * RAB Assignment Request
+ *****************************************************************************************************/
+
+template (value) RAB_Parameters ts_RabParams := {
+	trafficClass := conversational,
+	rAB_AsymmetryIndicator := symmetric_bidirectional,
+	maxBitrate := { 12200 },
+	guaranteedBitRate := { 12200 },
+	deliveryOrder := delivery_order_requested,
+	maxSDU_Size := 244,
+	sDU_Parameters := {
+		{
+			sDU_ErrorRatio := { mantissa := 1, exponent := 5, iE_Extensions := omit },
+			residualBitErrorRatio := { mantissa := 1, exponent := 6, iE_Extensions := omit },
+			deliveryOfErroneousSDU := yes,
+			sDU_FormatInformationParameters := {
+				{
+					subflowSDU_Size := 81,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}, {
+					subflowSDU_Size := 39,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}
+			},
+			iE_Extensions := omit
+		}, {
+			sDU_ErrorRatio := omit,
+			residualBitErrorRatio := { mantissa := 1, exponent := 3, iE_Extensions := omit },
+			deliveryOfErroneousSDU := no_error_detection_consideration,
+			sDU_FormatInformationParameters := {
+				{
+					subflowSDU_Size := 103,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}, {
+					subflowSDU_Size := 0,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}
+			},
+			iE_Extensions := omit
+		}, {
+			sDU_ErrorRatio := omit,
+			residualBitErrorRatio := { mantissa := 5, exponent := 3, iE_Extensions := omit },
+			deliveryOfErroneousSDU := no_error_detection_consideration,
+			sDU_FormatInformationParameters := {
+				{
+					subflowSDU_Size := 60,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}, {
+					subflowSDU_Size := 0,
+					rAB_SubflowCombinationBitRate := omit,
+					iE_Extensions := omit
+				}
+			},
+			iE_Extensions := omit
+		}
+	},
+	transferDelay := 80,
+	trafficHandlingPriority := omit,
+	allocationOrRetentionPriority := {
+		priorityLevel := 15,
+		pre_emptionCapability := shall_not_trigger_pre_emption,
+		pre_emptionVulnerability := pre_emptable,
+		queuingAllowed := queueing_not_allowed,
+		iE_Extensions := omit
+	},
+	sourceStatisticsDescriptor := omit,
+	relocationRequirement := omit,
+	iE_Extensions := omit
+}
+
+template (value) UserPlaneInformation ts_UserPlaneInfo := {
+	userPlaneMode := support_mode_for_predefined_SDU_sizes,
+	uP_ModeVersions := '0000000000000010'B,
+	iE_Extensions := omit
+}
+
+template (value) TransportLayerInformation ts_TLI(template (value) TransportLayerAddress tla,
+						  template (value) BindingID binding_id) := {
+	transportLayerAddress := tla,
+	iuTransportAssociation := {
+		bindingID := binding_id
+	},
+	iE_Extensions := omit
+}
+template TransportLayerInformation tr_TLI(template TransportLayerAddress tla,
+					  template BindingID binding_id) := {
+	transportLayerAddress := tla,
+	iuTransportAssociation := {
+		bindingID := binding_id
+	},
+	iE_Extensions := *
+}
+
+template (value) RAB_SetupOrModifyList ts_RAB_SML(template (value) RAB_ID rab_id,
+						  template (value) TransportLayerAddress tla,
+						  template (value) BindingID binding_id) := { {
+	{
+		id := id_RAB_SetupOrModifyItem,
+		firstCriticality := reject,
+		firstValue := {
+			rAB_SetupOrModifyItemFirst := {
+				rAB_ID := rab_id,
+				nAS_SynchronisationIndicator := omit,
+				rAB_Parameters := ts_RabParams,
+				userPlaneInformation := ts_UserPlaneInfo,
+				transportLayerInformation := ts_TLI(tla, binding_id),
+				service_Handover := omit,
+				iE_Extensions := omit
+			}
+		},
+		secondCriticality := ignore,
+		secondValue := {
+			rAB_SetupOrModifyItemSecond := {
+				pDP_TypeInformation := omit,
+				dataVolumeReportingIndication := omit,
+				dl_GTP_PDU_SequenceNumber := omit,
+				ul_GTP_PDU_SequenceNumber := omit,
+				dl_N_PDU_SequenceNumber := omit,
+				ul_N_PDU_SequenceNumber := omit,
+				iE_Extensions := omit
+			}
+		}
+	}
+} }
+template RAB_SetupOrModifyList tr_RAB_SML(template RAB_ID rab_id,
+					  template TransportLayerAddress tla,
+					  template BindingID binding_id) := { {
+	{
+		id := id_RAB_SetupOrModifyItem,
+		firstCriticality := reject,
+		firstValue := {
+			rAB_SetupOrModifyItemFirst := {
+				rAB_ID := rab_id,
+				nAS_SynchronisationIndicator := *,
+				rAB_Parameters := ts_RabParams,
+				userPlaneInformation := ts_UserPlaneInfo,
+				transportLayerInformation := tr_TLI(tla, binding_id),
+				service_Handover := *,
+				iE_Extensions := *
+			}
+		},
+		secondCriticality := ignore,
+		secondValue := {
+			rAB_SetupOrModifyItemSecond := {
+				pDP_TypeInformation := omit,
+				dataVolumeReportingIndication := omit,
+				dl_GTP_PDU_SequenceNumber := omit,
+				ul_GTP_PDU_SequenceNumber := omit,
+				dl_N_PDU_SequenceNumber := omit,
+				ul_N_PDU_SequenceNumber := omit,
+				iE_Extensions := omit
+			}
+		}
+	}
+} }
+
+
+template (value) RANAP_PDU
+ts_RANAP_RabAssReq(template (value) RAB_SetupOrModifyList rab_sml,
+		   template (omit) RAB_AssignmentRequest.protocolExtensions exts := omit) := {
+	initiatingMessage := {
+		procedureCode := id_RAB_Assignment,
+		criticality := reject,
+		value_ := {
+			rAB_AssignmentRequest := {
+				protocolIEs := {
+					{
+						id := id_RAB_SetupOrModifyList,
+						criticality := reject,
+						value_ := {
+							rAB_SetupOrModifyList := rab_sml
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_RabAssReq(template RAB_SetupOrModifyList rab_sml,
+		   template RAB_AssignmentRequest.protocolExtensions exts := *) := {
+	initiatingMessage := {
+		procedureCode := id_RAB_Assignment,
+		criticality := reject,
+		value_ := {
+			rAB_AssignmentRequest := {
+				protocolIEs := {
+					{
+						id := id_RAB_SetupOrModifyList,
+						criticality := reject,
+						value_ := {
+							rAB_SetupOrModifyList := rab_sml
+						}
+					}
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+template (value) RANAP_PDU
+ts_RANAP_RabAssResp(template (value) RAB_SetupOrModifiedList rab_sml,
+		    template (omit) RAB_AssignmentResponse.protocolExtensions exts := omit) := {
+	outcome := {
+		procedureCode := id_RAB_Assignment,
+		criticality := reject,
+		value_ := {
+			rAB_AssignmentResponse := {
+				protocolIEs := {
+					{
+						id := id_RAB_SetupOrModifiedList,
+						criticality := ignore,
+						value_ := {
+							rAB_SetupOrModifiedList := rab_sml
+						}
+					}
+					/* RAB-ReleasedList */
+					/* RAB-QueuedList */
+					/* RAB-FailedList */
+					/* RAB-ReleaseFailedList */
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+template RANAP_PDU
+tr_RANAP_RabAssResp(template RAB_SetupOrModifiedList rab_sml,
+		    template RAB_AssignmentResponse.protocolExtensions exts := *) := {
+	outcome := {
+		procedureCode := id_RAB_Assignment,
+		criticality := reject,
+		value_ := {
+			rAB_AssignmentResponse := {
+				protocolIEs := {
+					{
+						id := id_RAB_SetupOrModifiedList,
+						criticality := ignore,
+						value_ := {
+							rAB_SetupOrModifiedList := rab_sml
+						}
+					}, *
+					/* RAB-ReleasedList */
+					/* RAB-QueuedList */
+					/* RAB-FailedList */
+					/* RAB-ReleaseFailedList */
+				},
+				protocolExtensions := exts
+			}
+		}
+	}
+}
+
+
+/*****************************************************************************************************
+ *
+ *****************************************************************************************************/
+
+/* extract the L3 (NAS) from a given RANAP message */
+function f_ranap_extract_l3(RANAP_PDU ranap) return template (omit) octetstring
+{
+	var integer i;
+
+	if (match(ranap, tr_RANAP_initialUE_CS(?, ?, ?, ?, ?)) or
+	    match(ranap, tr_RANAP_initialUE_PS(?, ?, ?, ?, ?, ?)) ) {
+		var InitialUE_Message.protocolIEs ies := ranap.initiatingMessage.value_.initialUE_Message.protocolIEs;
+		for (i := 0; i < lengthof(ies); i := i+1) {
+			if (ies[i].id == id_NAS_PDU) {
+				return ies[i].value_.nAS_PDU;
+			}
+		}
+	} else if (match(ranap, tr_RANAP_DirectTransfer(?, ?))) {
+		var DirectTransfer.protocolIEs ies := ranap.initiatingMessage.value_.directTransfer.protocolIEs;
+		for (i := 0; i < lengthof(ies); i := i+1) {
+			if (ies[i].id == id_NAS_PDU) {
+				return ies[i].value_.nAS_PDU;
+			}
+		}
+	} else {
+		/* relocationInformation not supported yet*/
+	}
+	return omit;
+}
+
+function f_ranap_extract_sapi(RANAP_PDU ranap) return template (omit) SAPI
+{
+	var integer i;
+
+	/* InitialUE message has no SAPI */
+	if (match(ranap, tr_RANAP_DirectTransfer(?, ?))) {
+		var DirectTransfer.protocolIEs ies := ranap.initiatingMessage.value_.directTransfer.protocolIEs;
+		for (i := 0; i < lengthof(ies); i := i+1) {
+			if (ies[i].id == id_SAPI) {
+				return ies[i].value_.sAPI;
+			}
+		}
+	}
+	return omit;
+}
+
+
+}