osmo-ttcn3-hacks/library/HNBLLIF_Types.ttcn

531 lines
15 KiB
Plaintext

/* 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;
/* 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 */
} 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)" };