/* S1AP Templates in TTCN-3
 * (C) 2019 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

module S1AP_Templates {

import from S1AP_IEs all;
import from S1AP_CommonDataTypes all;
import from S1AP_Constants all;
import from S1AP_Containers all;
import from S1AP_PDU_Contents all;
import from S1AP_PDU_Descriptions all;

/*********************************************************************************
 * non-UE related
 *********************************************************************************/

/*********************************************************************************
 * 9.1.8 Management Messages 
 *********************************************************************************/

/* 9.1.8.4 S1 SETUP REQUEST */
template (value) S1AP_PDU
ts_S1AP_SetupReq(template (value) Global_ENB_ID p_global_ENB_ID,
		 template (value) SupportedTAs p_supportedTAs,
		 template (value) PagingDRX p_pagingDRXs) := {
	initiatingMessage := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Global_ENB_ID,
						criticality := ignore,
						value_ := { Global_ENB_ID := p_global_ENB_ID }
					}, {
						id := S1AP_Constants.id_SupportedTAs,
						criticality := reject,
						value_ := {SupportedTAs := p_supportedTAs}
            				} /* HACK: work around nextepc bug
					  , {
						id := S1AP_Constants.id_pagingDRX,
						criticality := ignore,
						value_ := {PagingDRX := p_pagingDRXs}
            				} */
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_SetupReq(template (present) Global_ENB_ID p_global_ENB_ID := ?,
		 template (present) SupportedTAs p_supportedTAs := ?,
		 template (present) PagingDRX p_pagingDRXs := ?) := {
	initiatingMessage := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Global_ENB_ID,
						criticality := ignore,
						value_ := { Global_ENB_ID := p_global_ENB_ID }
					}, {
						id := S1AP_Constants.id_SupportedTAs,
						criticality := reject,
						value_ := {SupportedTAs := p_supportedTAs}
            				}, *
				}
			}
		}
	}
}

/* 9.1.8.5 S1 SETUP RESPONSE */
template (value) S1AP_PDU
ts_S1AP_SetupResp(template (value) ServedGUMMEIs served_gummeis,
		  template (value) RelativeMMECapacity rel_mme_capacity) := {
	successfulOutcome := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupResponse := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_ServedGUMMEIs,
						criticality := reject,
						value_ := { ServedGUMMEIs := served_gummeis }
					}, {
						id := S1AP_Constants.id_RelativeMMECapacity,
						criticality := ignore,
						value_ := { RelativeMMECapacity := rel_mme_capacity }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_SetupResp(template (present) ServedGUMMEIs served_gummeis := ?,
		  template (present) RelativeMMECapacity rel_mme_capacity := ?) := {
	successfulOutcome := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupResponse := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_ServedGUMMEIs,
						criticality := reject,
						value_ := { ServedGUMMEIs := served_gummeis }
					}, {
						id := S1AP_Constants.id_RelativeMMECapacity,
						criticality := ignore,
						value_ := { RelativeMMECapacity := rel_mme_capacity }
					}, *
				}
			}
		}
	}
}

/* 9.1.8.6 S1 SETUP FAILURE */
template (value) S1AP_PDU
ts_S1AP_SetupFail(template (value) Cause cause) := {
	unsuccessfulOutcome := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupFailure := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := { Cause := cause }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_SetupFail(template (present) Cause cause := ?) := {
	unsuccessfulOutcome := {
		procedureCode := id_S1Setup,
		criticality := reject,
		value_ := {
			S1SetupFailure := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := { Cause := cause }
					}, *
				}
			}
		}
	}
}

/* 9.1.8.1 RESET */
template (value) S1AP_PDU
ts_S1AP_Reset(template (value) Cause cause,
	      template (value) ResetType reset_type) := {
	initiatingMessage := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := { Cause := cause }
					} , {
						id := S1AP_Constants.id_ResetType,
						criticality := reject,
						value_ := { resetType := reset_type }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_Reset(template (present) Cause cause := ?,
	      template (present) ResetType reset_type := ?) := {
	initiatingMessage := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			Reset := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := { Cause := cause }
					}, {
						id := S1AP_Constants.id_ResetType,
						criticality := reject,
						value_ := { resetType := reset_type }
					}, *
				}
			}
		}
	}
}

/* 9.1.8.2 RESET ACKNOWLEDGE */
template (value) S1AP_PDU
ts_S1AP_ResetAck(template (value) UE_associatedLogicalS1_ConnectionListResAck val) := {
	successfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			ResetAcknowledge := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_UE_associatedLogicalS1_ConnectionListResAck,
						criticality := ignore,
						value_ := { UE_associatedLogicalS1_ConnectionListResAck := val }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_ResetAck(template (present) UE_associatedLogicalS1_ConnectionListResAck val := ?) := {
	successfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			ResetAcknowledge := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_UE_associatedLogicalS1_ConnectionListResAck,
						criticality := ignore,
						value_ := { UE_associatedLogicalS1_ConnectionListResAck := val }
					}, *
				}
			}
		}
	}
}




/*********************************************************************************
 * 9.1.7 NAS Transport
 *********************************************************************************/

/* 9.1.7.1 INITIAL UE MESSAGE */
template (value) S1AP_PDU
ts_S1AP_InitialUE(template (value) ENB_UE_S1AP_ID p_eNB_value,
		  template (value) NAS_PDU p_nasPdu,
		  template (value) TAI p_tAI,
		  template (value) EUTRAN_CGI  p_eUTRAN_CGI,
		  template (value) RRC_Establishment_Cause p_rrcCause) := {
	initiatingMessage := {
		procedureCode := id_initialUEMessage,
		criticality := ignore,
		value_ := {
			InitialUEMessage := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := p_eNB_value}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}, {
						id := S1AP_Constants.id_TAI,
						criticality := ignore,
						value_ := {TAI := p_tAI}
					}, {
						id := S1AP_Constants.id_EUTRAN_CGI,
						criticality := ignore,
						value_ := {EUTRAN_CGI := p_eUTRAN_CGI}
					}, {
						id := S1AP_Constants.id_RRC_Establishment_Cause,
						criticality := ignore,
						value_ := {RRC_Establishment_Cause := p_rrcCause}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_InitialUE(template (present) ENB_UE_S1AP_ID p_eNB_value := ?,
		  template (present) NAS_PDU p_nasPdu := ?,
		  template (present) TAI p_tAI := ?,
		  template (present) EUTRAN_CGI p_eUTRAN_CGI := ?,
		  template (present) RRC_Establishment_Cause p_rrcCause := ?) := {
	initiatingMessage := {
		procedureCode := id_initialUEMessage,
		criticality := ignore,
		value_ := {
			InitialUEMessage := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := p_eNB_value}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}, {
						id := S1AP_Constants.id_TAI,
						criticality := ignore,
						value_ := {TAI := p_tAI}
					}, {
						id := S1AP_Constants.id_EUTRAN_CGI,
						criticality := ignore,
						value_ := {EUTRAN_CGI := p_eUTRAN_CGI}
					}, {
						id := S1AP_Constants.id_RRC_Establishment_Cause,
						criticality := ignore,
						value_ := {RRC_Establishment_Cause := p_rrcCause}
					}, *
				}
			}
		}
	}
}


/* 9.1.7.2 DOWNLINK NAS TRANSPORT */
template (value) S1AP_PDU
ts_S1AP_DlNasTransport(template (value) MME_UE_S1AP_ID mme_id,
		       template (value) ENB_UE_S1AP_ID enb_id,
		       template (value) octetstring p_nasPdu) := {
	initiatingMessage := {
		procedureCode := id_downlinkNASTransport,
		criticality := ignore,
		value_ := {
			DownlinkNASTransport := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_DlNasTransport(template (present) MME_UE_S1AP_ID mme_id := ?,
		       template (present) ENB_UE_S1AP_ID enb_id := ?,
		       template (present) octetstring p_nasPdu := ?) := {
	initiatingMessage := {
		procedureCode := id_downlinkNASTransport,
		criticality := ignore,
		value_ := {
			DownlinkNASTransport := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}, *
				}
			}
		}
	}
}


/* 9.1.7.3 UPNLINK NAS TRANSPORT */
template (value) S1AP_PDU
ts_S1AP_UlNasTransport(template (value) MME_UE_S1AP_ID mme_id,
		       template (value) ENB_UE_S1AP_ID enb_id,
		       template (value) octetstring p_nasPdu,
		       template (value) EUTRAN_CGI p_eUTRAN_CGI,
		       template (value) TAI p_tAI) := {
	initiatingMessage := {
		procedureCode := id_uplinkNASTransport,
		criticality := ignore,
		value_ := {
			UplinkNASTransport := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}, {
						id := S1AP_Constants.id_EUTRAN_CGI,
						criticality := ignore,
						value_ := {EUTRAN_CGI := p_eUTRAN_CGI}
					}, {
						id := S1AP_Constants.id_TAI,
						criticality := ignore,
						value_ := {TAI := p_tAI}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_UlNasTransport(template (present) MME_UE_S1AP_ID mme_id := ?,
		       template (present) ENB_UE_S1AP_ID enb_id := ?,
		       template (present) octetstring p_nasPdu := ?,
		       template (present) EUTRAN_CGI p_eUTRAN_CGI := ?,
		       template (present) TAI p_tAI := ?) := {
	initiatingMessage := {
		procedureCode := id_uplinkNASTransport,
		criticality := ignore,
		value_ := {
			UplinkNASTransport := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_NAS_PDU,
						criticality := reject,
						value_ := {nAS_PDU := p_nasPdu}
					}, {
						id := S1AP_Constants.id_EUTRAN_CGI,
						criticality := ignore,
						value_ := {EUTRAN_CGI := p_eUTRAN_CGI}
					}, {
						id := S1AP_Constants.id_TAI,
						criticality := ignore,
						value_ := {TAI := p_tAI}
					}, *
				}
			}
		}
	}
}

/*********************************************************************************
 * 9.1.4 Context Management
 *********************************************************************************/

/* 9.1.4.1 INITIAL CONTEXT SETUP REQ */
template (value) S1AP_PDU
ts_S1AP_IntialCtxSetupReq(template (value) MME_UE_S1AP_ID mme_id,
			  template (value) ENB_UE_S1AP_ID enb_id,
			  template (value) UEAggregateMaximumBitrate max_br,
			  template (value) E_RABToBeSetupListCtxtSUReq rab_setup_items,
			  template (value) UESecurityCapabilities ue_sec_par,
			  template (value) SecurityKey sec_key) := {
	initiatingMessage := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			initialContextSetupRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_uEaggregateMaximumBitrate,
						criticality := reject,
						value_ := {UEAggregateMaximumBitrate := max_br}
					}, {
						id := S1AP_Constants.id_E_RABToBeSetupListCtxtSUReq,
						criticality := reject,
						value_ := {E_RABToBeSetupListCtxtSUReq := rab_setup_items}
					}, {
						id := S1AP_Constants.id_UESecurityCapabilities,
						criticality := reject,
						value_ := {UESecurityCapabilities := ue_sec_par}
					}, {
						id := S1AP_Constants.id_SecurityKey,
						criticality := reject,
						value_ := {SecurityKey := sec_key}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_IntialCtxSetupReq(template (present) MME_UE_S1AP_ID mme_id := ?,
			  template (present) ENB_UE_S1AP_ID enb_id := ?,
			  template (present) UEAggregateMaximumBitrate max_br := ?,
			  template (present) E_RABToBeSetupListCtxtSUReq rab_setup_items := ?,
			  template (present) UESecurityCapabilities ue_sec_par := ?,
			  template (present) SecurityKey sec_key := ?) := {
	initiatingMessage := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			initialContextSetupRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_uEaggregateMaximumBitrate,
						criticality := reject,
						value_ := {UEAggregateMaximumBitrate := max_br}
					}, {
						id := S1AP_Constants.id_E_RABToBeSetupListCtxtSUReq,
						criticality := reject,
						value_ := {E_RABToBeSetupListCtxtSUReq := rab_setup_items}
					}, {
						id := S1AP_Constants.id_UESecurityCapabilities,
						criticality := reject,
						value_ := {UESecurityCapabilities := ue_sec_par}
					}, {
						id := S1AP_Constants.id_SecurityKey,
						criticality := reject,
						value_ := {SecurityKey := sec_key}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.3 INITIAL CONTEXT SETUP RESPONSE */
template (value) S1AP_PDU
ts_S1AP_InitialCtxSetupResp(template (value) MME_UE_S1AP_ID mme_id,
			    template (value) ENB_UE_S1AP_ID enb_id,
			    template (value) E_RABSetupListCtxtSURes rab_setup_items,
			    template (value) E_RABList rab_items) := {
	successfulOutcome := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			InitialContextSetupResponse := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_E_RABSetupListBearerSURes,
						criticality := ignore,
						value_ := {E_RABSetupListCtxtSURes := rab_setup_items}
					}, {
						id := S1AP_Constants.id_E_RABFailedToSetupListBearerSURes,
						criticality := ignore,
						value_ := {E_RABList := rab_items}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_InitialCtxSetupResp(template (present) MME_UE_S1AP_ID mme_id := ?,
			    template (present) ENB_UE_S1AP_ID enb_id := ?,
			    template (present) E_RABSetupListCtxtSURes rab_setup_items := ?,
			    template (present) E_RABList rab_items := ?) := {
	successfulOutcome := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			InitialContextSetupResponse := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := reject,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_E_RABSetupListBearerSURes,
						criticality := ignore,
						value_ := {E_RABSetupListCtxtSURes := rab_setup_items}
					}, {
						id := S1AP_Constants.id_E_RABFailedToSetupListBearerSURes,
						criticality := ignore,
						value_ := {E_RABList := rab_items}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.4 INITIAL CONTEXT SETUP FAILURE */
template (value) S1AP_PDU
ts_S1AP_InitialCtxSetupFail(template (value) MME_UE_S1AP_ID mme_id,
			    template (value) ENB_UE_S1AP_ID enb_id,
			    template (value) Cause cause) := {
	unsuccessfulOutcome := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			InitialContextSetupFailure := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_InitialCtxSetupFail(template (present) MME_UE_S1AP_ID mme_id := ?,
			    template (present) ENB_UE_S1AP_ID enb_id := ?,
			    template (present) Cause cause := ?) := {
	unsuccessfulOutcome := {
		procedureCode := id_InitialContextSetup,
		criticality := reject,
		value_ := {
			InitialContextSetupFailure := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.5 UE CONTEXT RELEASE REQUEST */
template (value) S1AP_PDU
ts_S1AP_UeContextReleaseReq(template (value) MME_UE_S1AP_ID mme_id,
			    template (value) ENB_UE_S1AP_ID enb_id,
			    template (value) Cause cause) := {
	initiatingMessage := {
		procedureCode := id_UEContextReleaseRequest,
		criticality := reject,
		value_ := {
			UEContextReleaseRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_UeContextReleaseReq(template (present) MME_UE_S1AP_ID mme_id := ?,
			    template (present) ENB_UE_S1AP_ID enb_id := ?,
			    template (present) Cause cause := ?) := {
	initiatingMessage := {
		procedureCode := id_UEContextReleaseRequest,
		criticality := reject,
		value_ := {
			UEContextReleaseRequest := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.6 UE CONTEXT RELEASE COMMAND */
template (value) S1AP_PDU
ts_S1AP_UeContextReleaseCmd(template (value) UE_S1AP_IDs mme_ids,
			    template (value) Cause cause) := {
	initiatingMessage := {
		procedureCode := id_UEContextRelease,
		criticality := reject,
		value_ := {
			UEContextReleaseCommand := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_UE_S1AP_IDs,
						criticality := ignore,
						value_ := {UE_S1AP_IDs := mme_ids}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_UeContextReleaseCmd(template (present) UE_S1AP_IDs ue_ids := ?,
			    template (present) Cause cause := ?) := {
	initiatingMessage := {
		procedureCode := id_UEContextRelease,
		criticality := reject,
		value_ := {
			UEContextReleaseCommand := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_UE_S1AP_IDs,
						criticality := reject,
						value_ := {UE_S1AP_IDs := ue_ids}
					}, {
						id := S1AP_Constants.id_Cause,
						criticality := ignore,
						value_ := {Cause := cause}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.7 UE CONTEXT RELEASE COMPLETE */
template (value) S1AP_PDU
ts_S1AP_UeContextReleaseCompl(template (value) MME_UE_S1AP_ID mme_id,
			      template (value) ENB_UE_S1AP_ID enb_id) := {
	successfulOutcome := {
		procedureCode := id_UEContextRelease,
		criticality := reject,
		value_ := {
			UEContextReleaseComplete := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := reject,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_UeContextReleaseCompl(template (present) MME_UE_S1AP_ID mme_id := ?,
			      template (present) ENB_UE_S1AP_ID enb_id := ?) := {
	successfulOutcome := {
		procedureCode := id_UEContextRelease,
		criticality := reject,
		value_ := {
			UEContextReleaseComplete := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, *
				}
			}
		}
	}
}

/* 9.1.4.20 CONNECTION ESTABLISHMENT INDICATION */
template (value) S1AP_PDU
ts_S1AP_ConnEstInd(template (value) MME_UE_S1AP_ID mme_id,
		   template (value) ENB_UE_S1AP_ID enb_id) := {
	initiatingMessage := {
		procedureCode := id_ConnectionEstablishmentIndication,
		criticality := reject,
		value_ := {
			ConnectionEstablishmentIndication := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_ConnEstInd(template (present) MME_UE_S1AP_ID mme_id := ?,
		   template (present) ENB_UE_S1AP_ID enb_id := ?) := {
	initiatingMessage := {
		procedureCode := id_ConnectionEstablishmentIndication,
		criticality := reject,
		value_ := {
			ConnectionEstablishmentIndication := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_MME_UE_S1AP_ID,
						criticality := ignore,
						value_ := {MME_UE_S1AP_ID := mme_id}
					}, {
						id := S1AP_Constants.id_eNB_UE_S1AP_ID,
						criticality := ignore,
						value_ := {ENB_UE_S1AP_ID := enb_id}
					}, *
				}
			}
		}
	}
}



/* all non-UE-related S1AP messages */
template (present) S1AP_PDU
tr_S1AP_nonUErelated := (tr_S1AP_SetupReq, tr_S1AP_SetupResp, tr_S1AP_SetupFail,
			 tr_S1AP_Reset, tr_S1AP_ResetAck
			);


}
