/* 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 }
					}, *
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_ResetAck_any := {
	successfulOutcome := {
		procedureCode := id_Reset,
		criticality := reject,
		value_ := {
			ResetAcknowledge := {
				protocolIEs := ?
			}
		}
	}
}


/*********************************************************************************
 * 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) E_RABSetupItemCtxtSURes
ts_S1AP_RABSetupItemCtxtSURes(template (value) E_RAB_ID rab_id := 5,
			      template (value) TransportLayerAddress tla := '00001010000101110001100000000100'B,
			      template (value) GTP_TEID gtp_teid := '00000002'O) := {
					e_RAB_ID := rab_id,
					transportLayerAddress := tla,
					gTP_TEID := gtp_teid,
					iE_Extensions := omit
}
template (value) E_RABSetupListCtxtSURes
ts_S1AP_RABSetupListCtxtSURes(template (value) E_RABSetupItemCtxtSURes it := ts_S1AP_RABSetupItemCtxtSURes()) := {
	{
		id := S1AP_Constants.id_E_RABSetupItemCtxtSURes,
		criticality := ignore,
		value_ := { E_RABSetupItemCtxtSURes := it }
	}
}

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
			    /*OPTIONAL: 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_RABSetupListCtxtSURes,
						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}
					}, *
				}
			}
		}
	}
}

/* 9.1.14 eNB DIRECT INFORMATION TRANSFER */
template (value) S1AP_PDU
ts_S1AP_eNBDirectInfTrans(template (value) Inter_SystemInformationTransferType inf) := {
	initiatingMessage := {
		procedureCode := id_eNBDirectInformationTransfer,
		criticality := reject,
		value_ := {
			eNBDirectInformationTransfer := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Inter_SystemInformationTransferTypeEDT,
						criticality := ignore,
						value_ := {Inter_SystemInformationTransferType := inf}
					}
				}
			}
		}
	}
}

/* 9.1.15 MME DIRECT INFORMATION TRANSFER */
template (present) S1AP_PDU
tr_S1AP_MMEDirectInfTrans(template (present) Inter_SystemInformationTransferType inf := ?) := {
	initiatingMessage := {
		procedureCode := id_MMEDirectInformationTransfer,
		criticality := ignore,
		value_ := {
			MMEDirectInformationTransfer := {
				protocolIEs := {
					{
						id := S1AP_Constants.id_Inter_SystemInformationTransferTypeMDT,
						criticality := reject,
						value_ := {Inter_SystemInformationTransferType := inf}
					}, *
				}
			}
		}
	}
}

/* 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, tr_S1AP_ResetAck_any, tr_S1AP_MMEDirectInfTrans
			);


/* 9.1.3.1 E-RAB SETUP REQUEST */
template (value) E_RABToBeSetupItemBearerSUReq
ts_S1AP_RABToBeSetupItemBearerSUReq(template (value) E_RAB_ID rab_id,
				    template (value) E_RABLevelQoSParameters qos_params,
				    template (value) TransportLayerAddress tla,
				    template (value) GTP_TEID gtp_teid,
				    template (value) NAS_PDU nas_pdu) := {
	e_RAB_ID := rab_id,
	e_RABlevelQoSParameters := qos_params,
	transportLayerAddress := tla,
	gTP_TEID := gtp_teid,
	nAS_PDU := nas_pdu,
	iE_Extensions := omit
}
template (value) E_RABToBeSetupListBearerSUReq
ts_S1AP_RABToBeSetupListBearerSUReq(template (value) E_RABToBeSetupItemBearerSUReq it) := {
	{
		id := S1AP_Constants.id_E_RABToBeSetupItemBearerSUReq,
		criticality := reject,
		value_ := { E_RABToBeSetupItemBearerSUReq := it }
	}
}

template (value) S1AP_PDU
ts_S1AP_RABSetupReq(template (value) MME_UE_S1AP_ID mme_id,
		    template (value) ENB_UE_S1AP_ID enb_id,
		    template (value) E_RABToBeSetupListBearerSUReq rab_setup_items) := {
	initiatingMessage := {
		procedureCode := S1AP_Constants.id_E_RABSetup,
		criticality := reject,
		value_ := {
			E_RABSetupRequest := {
				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_RABToBeSetupListBearerSUReq,
						criticality := reject,
						value_ := { E_RABToBeSetupListBearerSUReq := rab_setup_items }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_RABSetupReq(template (present) MME_UE_S1AP_ID mme_id := ?,
		    template (present) ENB_UE_S1AP_ID enb_id := ?,
		    template (present) E_RABToBeSetupListBearerSUReq rab_setup_items := ?) := {
	initiatingMessage := {
		procedureCode := S1AP_Constants.id_E_RABSetup,
		criticality := reject,
		value_ := {
			E_RABSetupRequest := {
				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_RABToBeSetupListBearerSUReq,
						criticality := reject,
						value_ := { E_RABToBeSetupListBearerSUReq := rab_setup_items }
					}, *
				}
			}
		}
	}
}

/* 9.1.3.2 E-RAB SETUP RESPONSE */
template (value) E_RABSetupItemBearerSURes
ts_S1AP_RABSetupItemBearerSURes(template (value) E_RAB_ID rab_id,
				template (value) TransportLayerAddress tla,
				template (value) GTP_TEID gtp_teid) := {
	e_RAB_ID := rab_id,
	transportLayerAddress := tla,
	gTP_TEID := gtp_teid,
	iE_Extensions := omit
}
template (value) E_RABSetupListBearerSURes
ts_S1AP_RABSetupListBearerSURes(template (value) E_RABSetupItemBearerSURes it) := {
	{
		id := S1AP_Constants.id_E_RABSetupItemBearerSURes,
		criticality := reject,
		value_ := { E_RABSetupItemBearerSURes := it }
	}
}

template (value) S1AP_PDU
ts_S1AP_RABSetupRsp(template (value) MME_UE_S1AP_ID mme_id,
		    template (value) ENB_UE_S1AP_ID enb_id,
		    template (value) E_RABSetupListBearerSURes rab_setup_items) := {
	successfulOutcome := {
		procedureCode := S1AP_Constants.id_E_RABSetup,
		criticality := reject,
		value_ := {
			e_RABSetupResponse := {
				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 := reject,
						value_ := { e_RABSetupListBearerSURes := rab_setup_items }
					}
				}
			}
		}
	}
}
template (present) S1AP_PDU
tr_S1AP_RABSetupRsp(template (present) MME_UE_S1AP_ID mme_id := ?,
		    template (present) ENB_UE_S1AP_ID enb_id := ?,
		    template (present) E_RABSetupListBearerSURes rab_setup_items := ?) := {
	successfulOutcome := {
		procedureCode := S1AP_Constants.id_E_RABSetup,
		criticality := reject,
		value_ := {
			e_RABSetupResponse := {
				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 := reject,
						value_ := { e_RABSetupListBearerSURes := rab_setup_items }
					}, *
				}
			}
		}
	}
}

}
