/* Osmocom HNBLL Interface Types, as per osmo-hnodeb/include/osmocom/hnodeb/hnb_prim.h * (C) 2021 by sysmocom - s.f.m.c. GmbH * All rights reserved. * Author: Pau Espin Pedrol * * 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)" };