module RANAP_Templates {

import from General_Types all;
import from Misc_Helpers all;
import from Native_Functions 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 := ignore,
						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 := ignore,
						value_ := {
							cause := cause
						}
					}
				},
				protocolExtensions := exts
			}
		}
	}
}

/*****************************************************************************************************
 * RAB Release
 *****************************************************************************************************/

template (value) RAB_ID
t_RAB_id(integer rab_id) := int2bit(rab_id, 8);

template (value) TransportLayerAddress ts_RAB_TLA4(OCT4 ip) := hex2bit('350001'H & oct2hex(ip) & '00000000000000000000000000'H);
template (value) TransportLayerAddress ts_RAB_TLA6(OCT16 ip) := hex2bit('350000'H & oct2hex(ip) & '00'H);
function f_ts_RAB_TLA(charstring addr) return template (value) TransportLayerAddress {
	if (f_addr_is_ipv6(addr)) {
		var OCT16 ip6 := f_inet6_addr(addr);
		return ts_RAB_TLA6(ip6);
	} else {
		var OCT4 ip4 := f_inet_addr(addr);
		return ts_RAB_TLA4(ip4);
	}
}

template (value) BindingID
t_RAB_binding_port(integer prt) := int2oct(prt, 2) & '0000'O;

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 (present) 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
 *****************************************************************************************************/

private function f_gen_ts_dt_ies(template (value) NAS_PDU nas,
				 template (omit) SAPI sapi,
				 template (value) DirectTransfer.protocolIEs opt_ies)
return DirectTransfer.protocolIEs {
	var DirectTransfer.protocolIEs ies := {
		/* NAS PDU is mandatory */
		{
			id := id_NAS_PDU,
			criticality := ignore,
			value_ := {
				nAS_PDU := valueof(nas)
			}
		}
	};

	/* Optional IEs, e.g. LAI, RAC, SAI */
	ies := ies & valueof(opt_ies);

	/* Optional SAPI is the last IE */
	if (isvalue(sapi)) {
		ies := ies & {{
			id := id_SAPI,
			criticality := ignore,
			value_ := {
				sAPI := valueof(sapi)
			}
		}};
	}

	return ies;
}

private function f_gen_tr_dt_ies(template NAS_PDU nas,
				 template SAPI sapi,
				 template DirectTransfer.protocolIEs opt_ies)
return template DirectTransfer.protocolIEs {
	var template DirectTransfer.protocolIEs ies := {
		/* NAS PDU is mandatory */
		{
			id := id_NAS_PDU,
			criticality := ignore,
			value_ := {
				nAS_PDU := nas
			}
		}
	};

	/* Optional IEs start from index 1 */
	var integer idx := 1;

	/* Optional IEs, e.g. LAI, RAC, SAI */
	if (istemplatekind(opt_ies, "*")) {
		ies[idx] := *;
		idx := idx + 1;
	} else if (not istemplatekind(opt_ies, "omit")) {
		for (var integer i := 0; i < lengthof(opt_ies); i := i + 1) {
			ies[idx] := opt_ies[idx];
			idx := idx + 1;
		}
	}

	/* Optional SAPI is the last IE */
	if (istemplatekind(sapi, "*")) {
		ies[idx] := *;
	} else if (not istemplatekind(sapi, "omit")) {
		ies[idx] := {
			id := id_SAPI,
			criticality := ignore,
			value_ := {
				sAPI := sapi
			}
		};
	}

	return ies;
}

template (value) RANAP_PDU
ts_RANAP_DirectTransfer(template (value) NAS_PDU nas,
			template (omit) SAPI sapi := omit,
			template (value) DirectTransfer.protocolIEs ies := {},
			template (omit) DirectTransfer.protocolExtensions exts := omit) := {
	initiatingMessage := {
		procedureCode := id_DirectTransfer,
		criticality := ignore,
		value_ := {
			directTransfer := {
				protocolIEs := f_gen_ts_dt_ies(nas, sapi, ies),
				protocolExtensions := exts
			}
		}
	}
}
template RANAP_PDU
tr_RANAP_DirectTransfer(template NAS_PDU nas,
			template SAPI sapi := *,
			template DirectTransfer.protocolIEs ies := *,
			template DirectTransfer.protocolExtensions exts := *) := {
	initiatingMessage := {
		procedureCode := id_DirectTransfer,
		criticality := ignore,
		value_ := {
			directTransfer := {
				protocolIEs := f_gen_tr_dt_ies(nas, sapi, ies),
				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 (present) 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) RAB_SetupOrModifiedList ts_RAB_SMdL(template (value) RAB_ID rab_id,
						  template (value) TransportLayerAddress tla,
						  template (value) BindingID binding_id) := { {
	{
		id := id_RAB_SetupOrModifiedItem,
		criticality := ignore,
		value_ := {
			rAB_SetupOrModifiedItem := {
				rAB_ID := rab_id,
				transportLayerAddress := tla,
				iuTransportAssociation := {
					bindingID := binding_id
				},
				dl_dataVolumes := omit,
				iE_Extensions := omit
			}
		}
	}
} }

template RAB_SetupOrModifiedList tr_RAB_SMdL(template (present) RAB_ID rab_id,
					  template TransportLayerAddress tla,
					  template BindingID binding_id) := { {
	{
		id := id_RAB_SetupOrModifiedItem,
		criticality := ignore,
		value_ := {
			rAB_SetupOrModifiedItem := {
				rAB_ID := rab_id,
				transportLayerAddress := tla,
				iuTransportAssociation := {
					bindingID := binding_id
				},
				dl_dataVolumes := *,
				iE_Extensions := *
			}
		}
	}
} }

template (value) RAB_FailedList ts_RAB_FL(template (value) RAB_ID rab_id,
					  template (value) Cause cause) := { {
	{
		id := id_RAB_FailedItem,
		criticality := ignore,
		value_ := {
			rAB_FailedItem := {
				rAB_ID := rab_id,
				cause := cause,
				iE_Extensions := omit
			}
		}
	}
} }

template RAB_FailedList tr_RAB_FL(template RAB_ID rab_id,
				  template Cause cause) := { {
	{
		id := id_RAB_FailedItem,
		criticality := ignore,
		value_ := {
			rAB_FailedItem := {
				rAB_ID := rab_id,
				cause := cause,
				iE_Extensions := *
			}
		}
	}
} }

template (value) RAB_ReleaseList ts_RAB_RL(template (value) RAB_ID rab_id,
					   template (value) Cause cause) := { {
	{
		id := id_RAB_ReleaseItem,
		criticality := ignore,
		value_ := {
			rAB_ReleaseItem := {
				rAB_ID := rab_id,
				cause := cause,
				iE_Extensions := omit
			}
		}
	}
} }

template RAB_ReleaseList tr_RAB_RL(template (present) RAB_ID rab_id,
				   template Cause cause := ?) := { {
	{
		id := id_RAB_ReleaseItem,
		criticality := ignore,
		value_ := {
			rAB_ReleaseItem := {
				rAB_ID := rab_id,
				cause := cause,
				iE_Extensions := *
			}
		}
	}
} }


function
ts_RANAP_RabAssReq(template (omit) RAB_SetupOrModifyList rab_sml := omit,
		   template (omit) RAB_ReleaseList rab_rl := omit,
		   template (omit) RAB_AssignmentRequest.protocolExtensions exts := omit) return template RANAP_PDU {
	var template RANAP_PDU ret;
	var template RAB_AssignmentRequest.protocolIEs protocolIEs := {};
	var integer ie_pos := 0;

	var template RAB_AssignmentRequest.protocolIEs protocolIEs_rab_sml;
	var template RAB_AssignmentRequest.protocolIEs protocolIEs_rab_rl;

	/* RAB-SetupOrModifyList */
	if (istemplatekind(rab_sml, "value")) {
		protocolIEs_rab_sml := {
			{
				id := id_RAB_SetupOrModifyList,
				criticality := ignore,
				value_ := {
					rAB_SetupOrModifyList := rab_sml
				}
			}
		};
		protocolIEs[ie_pos] := protocolIEs_rab_sml[0];
		ie_pos := ie_pos + 1;
	}

	/* RAB-ReleaseList */
	if (istemplatekind(rab_rl, "value")) {
		protocolIEs_rab_rl := {
			{
				id := id_RAB_ReleaseList,
				criticality := ignore,
				value_ := {
					rAB_ReleaseList := rab_rl
				}
			}
		};
		protocolIEs[ie_pos] := protocolIEs_rab_rl[0];
		ie_pos := ie_pos + 1;
	}


	ret.initiatingMessage := {
		procedureCode := id_RAB_Assignment,
		criticality := reject,
		value_ := {
			rAB_AssignmentRequest := {
				protocolIEs := protocolIEs,
				protocolExtensions := exts
			}
		}
	}

	return ret;
}

function
tr_RANAP_RabAssReq(template RAB_SetupOrModifyList rab_sml := omit,
		   template RAB_ReleaseList rab_rl := omit,
		   template RAB_AssignmentRequest.protocolExtensions exts := *) return template RANAP_PDU {
	var template RANAP_PDU ret;
	var template RAB_AssignmentRequest.protocolIEs protocolIEs := {};
	var integer ie_pos := 0;

	var template RAB_AssignmentRequest.protocolIEs protocolIEs_rab_sml;
	var template RAB_AssignmentRequest.protocolIEs protocolIEs_rab_rl;

	/* RAB-SetupOrModifyList */
	if (not istemplatekind(rab_sml, "omit")) {
		protocolIEs_rab_sml := {
			{
				id := id_RAB_SetupOrModifyList,
				criticality := ignore,
				value_ := {
					rAB_SetupOrModifyList := rab_sml
				}
			}
		};
		protocolIEs[ie_pos] := protocolIEs_rab_sml[0];
		ie_pos := ie_pos + 1;
	}

	/* RAB-ReleaseList */
	if (not istemplatekind(rab_rl, "omit")) {
		protocolIEs_rab_rl := {
			{
				id := id_RAB_ReleaseList,
				criticality := ignore,
				value_ := {
					rAB_ReleaseList := rab_rl
				}
			}
		};
		protocolIEs[ie_pos] := protocolIEs_rab_rl[0];
		ie_pos := ie_pos + 1;
	}


	ret.initiatingMessage := {
		procedureCode := id_RAB_Assignment,
		criticality := reject,
		value_ := {
			rAB_AssignmentRequest := {
				protocolIEs := protocolIEs,
				protocolExtensions := exts
			}
		}
	}

	return ret;
}

function
ts_RANAP_RabAssResp(template (omit) RAB_SetupOrModifiedList rab_sml := omit,
		    template (omit) RAB_FailedList rab_fl := omit,
		    template (omit) RAB_AssignmentResponse.protocolExtensions exts := omit) return template RANAP_PDU {
	var template RANAP_PDU ret;
	var template RAB_AssignmentResponse.protocolIEs protocolIEs := {};
	var integer ie_pos := 0;

	var template RAB_AssignmentResponse.protocolIEs protocolIEs_rab_sml;
	var template RAB_AssignmentResponse.protocolIEs protocolIEs_rab_fl;

	/* RAB-SetupOrModifiedList */
	if (istemplatekind(rab_sml, "value")) {
		protocolIEs_rab_sml := {
			{
				id := id_RAB_SetupOrModifiedList,
				criticality := ignore,
				value_ := {
					rAB_SetupOrModifiedList := rab_sml
				}
			}
		}

		protocolIEs[ie_pos] := protocolIEs_rab_sml[0];
		ie_pos := ie_pos + 1;
	}

	/* TODO: RAB-ReleasedList */
	/* TODO: RAB-QueuedList */

	/* RAB-FailedList */
	if (istemplatekind(rab_fl, "value")) {
		protocolIEs_rab_fl := {
			{
				id := id_RAB_FailedList,
				criticality := ignore,
				value_ := {
					rAB_FailedList := rab_fl
				}
			}
		}

		protocolIEs[ie_pos] := protocolIEs_rab_fl[0];
		ie_pos := ie_pos + 1;
	}

	/* TODO: RAB-ReleaseFailedList */

	ret.outcome := {
		procedureCode := id_RAB_Assignment,
		criticality := reject,
		value_ := {
			rAB_AssignmentResponse := {
				protocolIEs := protocolIEs,
				protocolExtensions := exts
			}
		}
	}

	return ret;
}

function
tr_RANAP_RabAssResp(template RAB_SetupOrModifiedList rab_sml := omit,
		    template RAB_FailedList rab_fl := omit,
		    template RAB_AssignmentResponse.protocolExtensions exts := *) return template RANAP_PDU {
	var template RANAP_PDU ret;
	var template RAB_AssignmentResponse.protocolIEs protocolIEs := {};
	var integer ie_pos := 0;

	var template RAB_AssignmentResponse.protocolIEs protocolIEs_rab_sml;
	var template RAB_AssignmentResponse.protocolIEs protocolIEs_rab_fl;

	/* RAB-SetupOrModifiedList */
	if (not istemplatekind(rab_sml, "omit")) {
		protocolIEs_rab_sml := {
			{
				id := id_RAB_SetupOrModifiedList,
				criticality := ignore,
				value_ := {
					rAB_SetupOrModifiedList := rab_sml
				}
			}
		}

		protocolIEs[ie_pos] := protocolIEs_rab_sml[0];
		ie_pos := ie_pos + 1;
	}

	/* TODO: RAB-ReleasedList */
	/* TODO: RAB-QueuedList */

	/* RAB-FailedList */
	if (not istemplatekind(rab_fl, "omit")) {
		protocolIEs_rab_fl := {
			{
				id := id_RAB_FailedList,
				criticality := ignore,
				value_ := {
					rAB_FailedList := rab_fl
				}
			}
		}

		protocolIEs[ie_pos] := protocolIEs_rab_fl[0];
		ie_pos := ie_pos + 1;
	}

	/* TODO: RAB-ReleaseFailedList */

	protocolIEs[ie_pos] := *;

	ret.outcome := {
		procedureCode := id_RAB_Assignment,
		criticality := reject,
		value_ := {
			rAB_AssignmentResponse := {
				protocolIEs := protocolIEs,
				protocolExtensions := exts
			}
		}
	}

	return ret;
}

/*****************************************************************************************************
 *
 *****************************************************************************************************/

/* 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(?, omit))) {
		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;
}


}
