/* HNBAP Templates in TTCN-3
 * (C) 2021 Pau Espin Pedrol <pespin@sysmocom.de>
 * 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 HNBAP_Templates {

import from General_Types all;
import from Osmocom_Types all;

import from HNBAP_IEs all;
import from HNBAP_CommonDataTypes all;
import from HNBAP_Constants all;
import from HNBAP_Containers all;
import from HNBAP_PDU_Contents all;
import from HNBAP_PDU_Descriptions all;

/*********************************************************************************
 * 3GPP TS 25.469
 *********************************************************************************/

template (value) Cause ts_HnbapCause(template (value) CauseRadioNetwork c) := {
	radioNetwork := c
}

/* 9.1.3 HNB REGISTER REQUEST */
template (present) HNBAP_PDU
tr_HNBAP_HNBRegisterRequest(template (present) octetstring hNB_Identity_Info := ?,
		 template (present) OCT3 plmnid := ?,
		 template (present) BIT28 cell_identity := ?,
		 template (present) OCT2 lac := ?,
		 template (present) OCT1 rac := ?,
		 template (present) OCT2 sac := ?) := {
	initiatingMessage := {
		procedureCode := id_HNBRegister,
		criticality := reject,
		value_ := {
			hNBRegisterRequest := {
				protocolIEs := {
					{
						id := HNBAP_Constants.id_HNB_Identity,
						criticality := reject,
						value_ := {
							hNB_Identity := {
								hNB_Identity_Info := hNB_Identity_Info,
								iE_Extensions := omit
							}
						}
					}, {
						id := 8,
						criticality := reject,
						value_ := {
							hNB_Location_Information := {
									macroCoverageInfo := omit,
									geographicalCoordinates := omit,
									iE_Extensions := omit
							}
						}
					}, {
						id := 9,
						criticality := reject,
						value_ := { pLMNidentity := plmnid }
					}, {
						id := 11,
						criticality := reject,
						value_ := { cellIdentity := cell_identity }
					}, {
						id := 6,
						criticality := reject,
						value_ := { lAC := lac }
					}, {
						id := 7,
						criticality := reject,
						value_ := { rAC := rac }
					}, {
						id := 10,
						criticality := reject,
						value_ := { sAC := sac }
					}
				},
				protocolExtensions := omit
			}
		}
	}
}


/* 9.1.4 HNB REGISTER ACCEPT */
template (present) HNBAP_PDU
tr_HNBAP_HNBRegisterAccept(template (present) uint16_t rnc_id := ?) := {
	successfulOutcome := {
		procedureCode := id_HNBRegister,
		criticality := reject,
		value_ := {
			hNBRegisterAccept := {
				protocolIEs := {
					{
						id := HNBAP_Constants.id_RNC_ID,
						criticality := reject,
						value_ := { RNC_ID := rnc_id }
					}
				},
				protocolExtensions := omit /* TODO: Mux Port Number (optional) 9.2.29 */
			}
		}
	}
}

template (value) HNBAP_PDU
ts_HNBAP_HNBRegisterAccept(template (value) uint16_t rnc_id) := {
	successfulOutcome := {
		procedureCode := id_HNBRegister,
		criticality := reject,
		value_ := {
			hNBRegisterAccept := {
				protocolIEs := {
					{
						id := HNBAP_Constants.id_RNC_ID,
						criticality := reject,
						value_ := { RNC_ID := rnc_id }
					}
				},
				protocolExtensions := omit /* TODO: Mux Port Number (optional) 9.2.29 */
			}
		}
	}
}

/* 9.1.5 HNB REGISTER REJECT */
template (value) HNBAP_PDU
ts_HNBAP_HNBRegisterReject(template (value) Cause cause) := {
	unsuccessfulOutcome := {
		procedureCode := id_HNBRegister,
		criticality := reject,
		value_ := {
			HNBRegisterReject := {
				protocolIEs := {
					{
						id := HNBAP_Constants.id_Cause,
						criticality := ignore,
						value_ := { Cause := cause }
					}
				},
				protocolExtensions := omit /* TODO: CriticalityDiagnostics, BackoffTimer */
			}
		}
	}
}

}
