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;
}


}
