aboutsummaryrefslogtreecommitdiffstats
path: root/library/HNBLLIF_Types.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'library/HNBLLIF_Types.ttcn')
-rw-r--r--library/HNBLLIF_Types.ttcn532
1 files changed, 532 insertions, 0 deletions
diff --git a/library/HNBLLIF_Types.ttcn b/library/HNBLLIF_Types.ttcn
new file mode 100644
index 00000000..cbbe984e
--- /dev/null
+++ b/library/HNBLLIF_Types.ttcn
@@ -0,0 +1,532 @@
+/* Osmocom HNBLL Interface Types, 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_Types {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from Native_Functions all;
+
+modulepar {
+ /* HNBLLIF version supported by the IUT */
+ HNBLLIF_Version mp_hnbllif_version := 0;
+};
+
+const charstring HNBLL_SOCK_DEFAULT := "/tmp/hnb_prim_sock";
+type integer HNBLLIF_Version (0); /* supported versions */
+
+/**********************
+ * CTL SAPI
+ **********************/
+
+
+type enumerated HNBLLIF_CTL_MsgType {
+ HNBLL_IF_CTL_MSG_HELLO ('0000'O)
+} with { variant "FIELDLENGTH(16)" };
+
+type record HNBLLIF_CTL_hello_req {
+ HNBLLIF_Sapi sapi,
+ uint16_t api_version
+} with { variant "" };
+
+type record HNBLLIF_CTL_hello_cnf {
+ HNBLLIF_Sapi sapi,
+ uint16_t api_version
+} with { variant "" };
+
+type union HNBLLIF_CTL_PrimOpUnion_hello {
+ HNBLLIF_CTL_hello_req req,
+ HNBLLIF_CTL_hello_cnf cnf,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_CTL_PrimOp_hello {
+ HNBLLIF_Operation op,
+ HNBLLIF_CTL_PrimOpUnion_hello u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ cnf, op = HNBLL_IF_OP_CONFIRM;
+ other, OTHERWISE)"
+};
+
+type union HNBLLIF_CTL_PrimUnion {
+ HNBLLIF_CTL_PrimOp_hello hello,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_CTL_PrimHdr {
+ HNBLLIF_CTL_MsgType prim,
+ HNBLLIF_CTL_PrimUnion u
+} with { variant (u) "CROSSTAG( hello, prim = HNBLL_IF_CTL_MSG_HELLO;
+ other, OTHERWISE)"
+};
+
+/**********************
+ * IUH SAPI
+ **********************/
+type enumerated HNBLLIF_IUH_MsgType {
+ HNBLL_IF_IUH_MSG_CONFIGURE ('0000'O),
+ HNBLL_IF_IUH_MSG_CONN_ESTABLISH ('0001'O),
+ HNBLL_IF_IUH_MSG_CONN_RELEASE ('0002'O),
+ HNBLL_IF_IUH_MSG_CONN_DATA ('0003'O),
+ HNBLL_IF_IUH_MSG_UNITDATA ('0004'O)
+} with { variant "FIELDLENGTH(16)" };
+
+/* CONFIGURE */
+type record HNBLLIF_IUH_configure_ind {
+ uint16_t mcc,
+ uint16_t mnc,
+ uint16_t cell_identity,
+ uint16_t lac,
+ uint8_t rac,
+ uint8_t reserved,
+ uint16_t sac,
+ uint16_t rnc_id
+} with { variant "" };
+
+type union HNBLLIF_IUH_PrimOpUnion_configure {
+ HNBLLIF_IUH_configure_ind ind,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_IUH_PrimOp_configure {
+ HNBLLIF_Operation op,
+ HNBLLIF_IUH_PrimOpUnion_configure u
+} with { variant (u) "CROSSTAG( ind, op = HNBLL_IF_OP_INDICATION;
+ other, OTHERWISE)"
+};
+
+/* CONN_ESTABLISH */
+type record HNBLLIF_IUH_conn_establish_req {
+ uint32_t context_id,
+ uint8_t domain,
+ uint8_t est_cause,
+ uint16_t reserved, //uint16_t nas_node_selector_bitlen;
+ //uint8_t nas_node_selector[128]; /* TODO: check whether we can decrease this buffer size */
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type record HNBLLIF_IUH_conn_establish_cnf {
+ uint32_t context_id,
+ uint8_t domain,
+ uint8_t est_cause
+} with { variant "" };
+
+type union HNBLLIF_IUH_PrimOpUnion_conn_establish {
+ HNBLLIF_IUH_conn_establish_req req,
+ HNBLLIF_IUH_conn_establish_cnf cnf,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_IUH_PrimOp_conn_establish {
+ HNBLLIF_Operation op,
+ HNBLLIF_IUH_PrimOpUnion_conn_establish u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ cnf, op = HNBLL_IF_OP_CONFIRM;
+ other, OTHERWISE)"
+};
+
+/* CONN_RELEASE */
+type record HNBLLIF_IUH_conn_release_req {
+ uint32_t context_id,
+ uint8_t domain,
+ uint8_t spare1,
+ uint8_t cause_type,
+ uint8_t cause,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+
+type union HNBLLIF_IUH_PrimOpUnion_conn_release {
+ HNBLLIF_IUH_conn_release_req req,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_IUH_PrimOp_conn_release {
+ HNBLLIF_Operation op,
+ HNBLLIF_IUH_PrimOpUnion_conn_release u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ other, OTHERWISE)"
+};
+
+/* CONN_DATA */
+type record HNBLLIF_IUH_conn_data_ind {
+ uint32_t context_id,
+ uint8_t domain,
+ uint8_t spare1,
+ uint16_t spare2,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type record HNBLLIF_IUH_conn_data_req {
+ uint32_t context_id,
+ uint8_t domain,
+ uint8_t spare1,
+ uint16_t spare2,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type union HNBLLIF_IUH_PrimOpUnion_conn_data {
+ HNBLLIF_IUH_conn_data_req req,
+ HNBLLIF_IUH_conn_data_ind ind,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_IUH_PrimOp_conn_data {
+ HNBLLIF_Operation op,
+ HNBLLIF_IUH_PrimOpUnion_conn_data u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ ind, op = HNBLL_IF_OP_INDICATION;
+ other, OTHERWISE)"
+};
+
+/* UNITDATA */
+type record HNBLLIF_IUH_unitdata_ind {
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type record HNBLLIF_IUH_unitdata_req {
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type union HNBLLIF_IUH_PrimOpUnion_unitdata {
+ HNBLLIF_IUH_unitdata_req req,
+ HNBLLIF_IUH_unitdata_ind ind,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_IUH_PrimOp_unitdata {
+ HNBLLIF_Operation op,
+ HNBLLIF_IUH_PrimOpUnion_unitdata u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ ind, op = HNBLL_IF_OP_INDICATION;
+ other, OTHERWISE)"
+};
+
+type union HNBLLIF_IUH_PrimUnion {
+ HNBLLIF_IUH_PrimOp_configure configure,
+ HNBLLIF_IUH_PrimOp_conn_establish conn_establish,
+ HNBLLIF_IUH_PrimOp_conn_release conn_release,
+ HNBLLIF_IUH_PrimOp_conn_data conn_data,
+ HNBLLIF_IUH_PrimOp_unitdata unitdata,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_IUH_PrimHdr {
+ HNBLLIF_IUH_MsgType prim,
+ HNBLLIF_IUH_PrimUnion u
+} with { variant (u) "CROSSTAG( configure, prim = HNBLL_IF_IUH_MSG_CONFIGURE;
+ conn_establish, prim = HNBLL_IF_IUH_MSG_CONN_ESTABLISH;
+ conn_release, prim = HNBLL_IF_IUH_MSG_CONN_RELEASE;
+ conn_data, prim = HNBLL_IF_IUH_MSG_CONN_DATA;
+ unitdata, prim = HNBLL_IF_IUH_MSG_UNITDATA;
+ other, OTHERWISE)"
+};
+
+/**********************
+ * AUDIO SAPI
+ **********************/
+type enumerated HNBLLIF_AUDIO_MsgType {
+ HNBLL_IF_AUDIO_MSG_CONN_ESTABLISH ('0000'O),
+ HNBLL_IF_AUDIO_MSG_CONN_RELEASE ('0001'O),
+ HNBLL_IF_AUDIO_MSG_CONN_DATA ('0002'O)
+} with { variant "FIELDLENGTH(16)" };
+
+const integer HNBLLIF_MAX_RFCIS := 64;
+const integer HNBLLIF_MAX_SUBFLOWS := 7;
+type record length(HNBLLIF_MAX_RFCIS) of uint8_t HNBLLIF_AUDIO_IPTIs;
+type record length(HNBLLIF_MAX_SUBFLOWS) of uint16_t HNBLLIF_AUDIO_RFCI_SubflowSizes;
+type record length(HNBLLIF_MAX_RFCIS) of HNBLLIF_AUDIO_RFCI_SubflowSizes HNBLLIF_AUDIO_SubflowSizes;
+type record length(HNBLLIF_MAX_RFCIS) of uint8_t HNBLLIF_AUDIO_RFCIs;
+
+/* CONN_ESTABLISH */
+type record HNBLLIF_AUDIO_conn_establish_req {
+ uint32_t context_id,
+ uint16_t remote_rtp_port,
+ uint8_t reserved,
+ HNBLLIF_AddrType remote_rtp_address_type,
+ HNBLLIF_Addr remote_addr,
+ uint8_t transparent, /* 1=transparent; 0=SMpSDU */
+ uint8_t data_pdu_type,
+ uint16_t supported_versions_mask, /* host byte order */
+ uint8_t num_rfci,
+ uint8_t num_subflows,
+ HNBLLIF_AUDIO_SubflowSizes subflow_sizes,
+ uint8_t IPTIs_present, /* 1=present; 0=not present */
+ HNBLLIF_AUDIO_IPTIs IPTIs, /* values range 0-15, 4 bits */
+ HNBLLIF_AUDIO_RFCIs rfci optional /* only available in audio SAPI ver >= 1 */
+} with { variant "" };
+
+type record HNBLLIF_AUDIO_conn_establish_cnf {
+ uint32_t context_id,
+ uint32_t audio_conn_id,
+ uint16_t local_rtp_port,
+ uint8_t error_code,
+ HNBLLIF_AddrType local_rtp_address_type,
+ HNBLLIF_Addr local_addr
+} with { variant "" };
+
+type union HNBLLIF_AUDIO_PrimOpUnion_conn_establish {
+ HNBLLIF_AUDIO_conn_establish_req req,
+ HNBLLIF_AUDIO_conn_establish_cnf cnf,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_AUDIO_PrimOp_conn_establish {
+ HNBLLIF_Operation op,
+ HNBLLIF_AUDIO_PrimOpUnion_conn_establish u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ cnf, op = HNBLL_IF_OP_CONFIRM;
+ other, OTHERWISE)"
+};
+
+/* CONN_RELEASE */
+type record HNBLLIF_AUDIO_conn_release_req {
+ uint32_t audio_conn_id
+} with { variant "" };
+
+
+type union HNBLLIF_AUDIO_PrimOpUnion_conn_release {
+ HNBLLIF_AUDIO_conn_release_req req,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_AUDIO_PrimOp_conn_release {
+ HNBLLIF_Operation op,
+ HNBLLIF_AUDIO_PrimOpUnion_conn_release u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ other, OTHERWISE)"
+};
+
+/* CONN_DATA */
+type record HNBLLIF_AUDIO_conn_data_ind {
+ uint32_t audio_conn_id,
+ uint8_t frame_nr,
+ uint8_t fqc, /* enumerated IuUP_FQC */
+ uint8_t rfci,
+ uint8_t spare,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type record HNBLLIF_AUDIO_conn_data_req {
+ uint32_t audio_conn_id,
+ uint8_t frame_nr,
+ uint8_t fqc, /* enumerated IuUP_FQC */
+ uint8_t rfci,
+ uint8_t spare,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type union HNBLLIF_AUDIO_PrimOpUnion_conn_data {
+ HNBLLIF_AUDIO_conn_data_req req,
+ HNBLLIF_AUDIO_conn_data_ind ind,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_AUDIO_PrimOp_conn_data {
+ HNBLLIF_Operation op,
+ HNBLLIF_AUDIO_PrimOpUnion_conn_data u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ ind, op = HNBLL_IF_OP_INDICATION;
+ other, OTHERWISE)"
+};
+
+type union HNBLLIF_AUDIO_PrimUnion {
+ HNBLLIF_AUDIO_PrimOp_conn_establish conn_establish,
+ HNBLLIF_AUDIO_PrimOp_conn_release conn_release,
+ HNBLLIF_AUDIO_PrimOp_conn_data conn_data,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_AUDIO_PrimHdr {
+ HNBLLIF_AUDIO_MsgType prim,
+ HNBLLIF_AUDIO_PrimUnion u
+} with { variant (u) "CROSSTAG( conn_establish, prim = HNBLL_IF_AUDIO_MSG_CONN_ESTABLISH;
+ conn_release, prim = HNBLL_IF_AUDIO_MSG_CONN_RELEASE;
+ conn_data, prim = HNBLL_IF_AUDIO_MSG_CONN_DATA;
+ other, OTHERWISE)"
+};
+
+/**********************
+ * GTP SAPI
+ **********************/
+type enumerated HNBLLIF_GTP_MsgType {
+ HNBLL_IF_GTP_MSG_CONN_ESTABLISH ('0000'O),
+ HNBLL_IF_GTP_MSG_CONN_RELEASE ('0001'O),
+ HNBLL_IF_GTP_MSG_CONN_DATA ('0002'O)
+} with { variant "FIELDLENGTH(16)" };
+
+/* CONN_ESTABLISH */
+type record HNBLLIF_GTP_conn_establish_req {
+ uint32_t context_id,
+ uint32_t remote_tei,
+ uint8_t reserved,
+ HNBLLIF_AddrType remote_gtpu_address_type,
+ HNBLLIF_Addr remote_gtpu_addr
+} with { variant "" };
+
+type record HNBLLIF_GTP_conn_establish_cnf {
+ uint32_t context_id,
+ uint32_t gtp_conn_id,
+ uint32_t local_tei,
+ uint8_t error_code,
+ HNBLLIF_AddrType local_gtpu_address_type,
+ HNBLLIF_Addr local_gtpu_addr
+} with { variant "" };
+
+type union HNBLLIF_GTP_PrimOpUnion_conn_establish {
+ HNBLLIF_GTP_conn_establish_req req,
+ HNBLLIF_GTP_conn_establish_cnf cnf,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_GTP_PrimOp_conn_establish {
+ HNBLLIF_Operation op,
+ HNBLLIF_GTP_PrimOpUnion_conn_establish u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ cnf, op = HNBLL_IF_OP_CONFIRM;
+ other, OTHERWISE)"
+};
+
+/* CONN_RELEASE */
+type record HNBLLIF_GTP_conn_release_req {
+ uint32_t gtp_conn_id
+} with { variant "" };
+
+type union HNBLLIF_GTP_PrimOpUnion_conn_release {
+ HNBLLIF_GTP_conn_release_req req,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_GTP_PrimOp_conn_release {
+ HNBLLIF_Operation op,
+ HNBLLIF_GTP_PrimOpUnion_conn_release u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ other, OTHERWISE)"
+};
+
+/* CONN_DATA */
+type record HNBLLIF_GTP_conn_data_req {
+ uint32_t gtp_conn_id,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type record HNBLLIF_GTP_conn_data_ind {
+ uint32_t gtp_conn_id,
+ uint32_t data_len,
+ octetstring data /* RANAP message */
+} with { variant (data_len) "LENGTHTO (data)" };
+
+type union HNBLLIF_GTP_PrimOpUnion_conn_data {
+ HNBLLIF_GTP_conn_data_req req,
+ HNBLLIF_GTP_conn_data_ind ind,
+ octetstring other
+} with { variant "" };
+type record HNBLLIF_GTP_PrimOp_conn_data {
+ HNBLLIF_Operation op,
+ HNBLLIF_GTP_PrimOpUnion_conn_data u
+} with { variant (u) "CROSSTAG( req, op = HNBLL_IF_OP_REQUEST;
+ ind, op = HNBLL_IF_OP_INDICATION;
+ other, OTHERWISE)"
+};
+
+type union HNBLLIF_GTP_PrimUnion {
+ HNBLLIF_GTP_PrimOp_conn_establish conn_establish,
+ HNBLLIF_GTP_PrimOp_conn_release conn_release,
+ HNBLLIF_GTP_PrimOp_conn_data conn_data,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_GTP_PrimHdr {
+ HNBLLIF_GTP_MsgType prim,
+ HNBLLIF_GTP_PrimUnion u
+} with { variant (u) "CROSSTAG( conn_establish, prim = HNBLL_IF_GTP_MSG_CONN_ESTABLISH;
+ conn_release, prim = HNBLL_IF_GTP_MSG_CONN_RELEASE;
+ conn_data, prim = HNBLL_IF_GTP_MSG_CONN_DATA;
+ other, OTHERWISE)"
+};
+
+
+/**********************
+* General
+**********************/
+
+type enumerated HNBLLIF_AddrType {
+ HNBLL_IF_ADDR_TYPE_UNSPEC ('00'O),
+ HNBLL_IF_ADDR_TYPE_IPV4 ('01'O),
+ HNBLL_IF_ADDR_TYPE_IPV6 ('02'O)
+} with { variant "FIELDLENGTH(8)" };
+type octetstring HNBLLIF_Addr length(16);
+
+type enumerated HNBLLIF_Sapi {
+ HNBLL_IF_SAPI_CTL (-1),
+ HNBLL_IF_SAPI_IUH ('00000001'O),
+ HNBLL_IF_SAPI_GTP ('00000002'O),
+ HNBLL_IF_SAPI_AUDIO ('00000003'O)
+} with { variant "FIELDLENGTH(32)"
+ variant "COMP(2scompl)"
+};
+
+type enumerated HNBLLIF_Operation {
+ HNBLL_IF_OP_REQUEST ('0000'O),
+ HNBLL_IF_OP_RESPONSE ('0001'O),
+ HNBLL_IF_OP_INDICATION ('0002'O),
+ HNBLL_IF_OP_CONFIRM ('0003'O)
+} with { variant "FIELDLENGTH(16)" };
+
+type union HNBLLIF_SapiUnion {
+ HNBLLIF_CTL_PrimHdr ctl,
+ HNBLLIF_IUH_PrimHdr iuh,
+ HNBLLIF_GTP_PrimHdr gtp,
+ HNBLLIF_AUDIO_PrimHdr audio,
+ octetstring other
+} with { variant "" };
+
+type record HNBLLIF_Message {
+ HNBLLIF_Sapi sapi,
+ HNBLLIF_SapiUnion u
+} with { variant (u) "CROSSTAG( ctl, sapi = HNBLL_IF_SAPI_CTL;
+ iuh, sapi = HNBLL_IF_SAPI_IUH;
+ gtp, sapi = HNBLL_IF_SAPI_GTP;
+ audio, sapi = HNBLL_IF_SAPI_AUDIO;
+ other, OTHERWISE)"
+};
+
+external function enc_HNBLLIF_Message(in HNBLLIF_Message pdu) return octetstring
+ with { extension "prototype(convert) encode(RAW)" };
+external function dec_HNBLLIF_Message(in octetstring stream) return HNBLLIF_Message
+ with { extension "prototype(convert) decode(RAW)" };
+
+function f_HNBLLIF_AF2addr_type(AddressFamily address_family)
+return HNBLLIF_AddrType {
+ if (address_family == AF_INET) {
+ return HNBLL_IF_ADDR_TYPE_IPV4;
+ } else if (address_family == AF_INET6) {
+ return HNBLL_IF_ADDR_TYPE_IPV6;
+ } else {
+ return HNBLL_IF_ADDR_TYPE_UNSPEC;
+ }
+}
+
+function f_HNBLLIF_Addr(HNBLLIF_AddrType addr_type, charstring addr_str)
+return HNBLLIF_Addr {
+ var HNBLLIF_Addr addr;
+
+ if (addr_type == HNBLL_IF_ADDR_TYPE_IPV4) {
+ addr := f_inet_addr(addr_str);
+ } else {
+ addr := f_inet6_addr(addr_str);
+ }
+
+ return addr;
+}
+
+
+} with { encode "RAW" variant "BYTEORDER(first)" };