/* Osmocom HNBLL Interface Templates, as per osmo-hnodeb/include/osmocom/hnodeb/hnb_prim.h
 * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
 * All rights reserved.
 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
 *
 * 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 HNBLLIF_Templates {

import from General_Types all;
import from Osmocom_Types all;
import from HNBLLIF_Types all;

/**********************
 * CTL SAPI
 **********************/
template (value) HNBLLIF_Message ts_HNBLLIF_CTL_HELLO_REQ(template (value) HNBLLIF_Sapi sapi,
							  template (value) uint16_t api_version) := {
	sapi := HNBLL_IF_SAPI_CTL,
	u := {
		ctl := {
			prim := HNBLL_IF_CTL_MSG_HELLO,
			u := {
				hello := {
					op := HNBLL_IF_OP_REQUEST,
					u := {
						req := {
							sapi := sapi,
							api_version := api_version
						}
					}
				}
			}
		}
	}
}

template (present) HNBLLIF_Message tr_HNBLLIF_CTL_HELLO_CNF(template (present) HNBLLIF_Sapi sapi := ?,
							    template (present) uint32_t api_version := ?) := {
	sapi := HNBLL_IF_SAPI_CTL,
	u := {
		ctl := {
			prim := HNBLL_IF_CTL_MSG_HELLO,
			u := {
				hello := {
					op := HNBLL_IF_OP_CONFIRM,
					u := {
						cnf := {
							sapi := sapi,
							api_version := api_version
						}
					}
				}
			}
		}
	}
}


/**********************
 * IUH SAPI
 **********************/

template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONFIGURE_IND(template (present) uint16_t mcc := ?,
								template (present) uint16_t mnc := ?,
								template (present) uint16_t cell_identity := ?,
								template (present) uint16_t lac := ?,
								template (present) uint8_t rac := ?,
								template (present) uint16_t sac := ?,
								template (present) uint16_t rnc_id := ?) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONFIGURE,
			u := {
				configure := {
					op := HNBLL_IF_OP_INDICATION,
					u := {
						ind := {
							mcc := mcc,
							mnc := mnc,
							cell_identity := cell_identity,
							lac := lac,
							rac := rac,
							reserved := ?,
							sac := sac,
							rnc_id := rnc_id
						}
					}
				}
			}
		}
	}
}

template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_ESTABLISH_REQ(template (value) uint32_t context_id,
								template (value) uint8_t domain,
								template (value) uint8_t est_cause,
								template (value) octetstring data) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONN_ESTABLISH,
			u := {
				conn_establish := {
					op := HNBLL_IF_OP_REQUEST,
					u := {
						req := {
							context_id := context_id,
							domain := domain,
							est_cause := est_cause,
							reserved := 0,
							data_len := lengthof(data),
							data := data
						}
					}
				}
			}
		}
	}
}

template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONN_ESTABLISH_CNF(template (present) uint32_t context_id := ?,
								template (present) uint8_t domain := ?,
								template (present) uint8_t est_cause := ?) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONN_ESTABLISH,
			u := {
				conn_establish := {
					op := HNBLL_IF_OP_CONFIRM,
					u := {
						cnf := {
							context_id := context_id,
							domain := domain,
							est_cause := est_cause
						}
					}
				}
			}
		}
	}
}

template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_RELEASE_REQ(template (value) uint32_t context_id,
							      template (value) uint8_t domain,
							      template (value) uint8_t cause_type,
							      template (value) uint8_t cause,
							      template (value) octetstring data) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONN_RELEASE,
			u := {
				conn_release := {
					op := HNBLL_IF_OP_REQUEST,
					u := {
						req := {
							context_id := context_id,
							domain := domain,
							spare1 := 0,
							cause_type := cause_type,
							cause := cause,
							data_len := lengthof(data),
							data := data
						}
					}
				}
			}
		}
	}
}

template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONN_DATA_IND(template (present) uint32_t context_id := ?,
								template (present) uint8_t domain := ?,
								template (present) octetstring data := ?) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONN_DATA,
			u := {
				conn_data := {
					op := HNBLL_IF_OP_INDICATION,
					u := {
						ind := {
							context_id := context_id,
							domain := domain,
							spare1 := ?,
							spare2 := ?,
							data_len := ?,
							data := data
						}
					}
				}
			}
		}
	}
}

template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_DATA_REQ(template (value) uint32_t context_id,
							      template (value) uint8_t domain,
							      template (value) octetstring data) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_CONN_DATA,
			u := {
				conn_data := {
					op := HNBLL_IF_OP_REQUEST,
					u := {
						req := {
							context_id := context_id,
							domain := domain,
							spare1 := 0,
							spare2 := 0,
							data_len := lengthof(data),
							data := data
						}
					}
				}
			}
		}
	}
}

template (present) HNBLLIF_Message tr_HNBLLIF_IUH_UNITDATA_IND(template (present) octetstring data := ?) := {
	sapi := HNBLL_IF_SAPI_IUH,
	u := {
		iuh := {
			prim := HNBLL_IF_IUH_MSG_UNITDATA,
			u := {
				unitdata := {
					op := HNBLL_IF_OP_INDICATION,
					u := {
						ind := {
							data_len := ?,
							data := data
						}
					}
				}
			}
		}
	}
}

} with { encode "RAW" variant "BYTEORDER(first)" };
