/* Encoding/Decoding routines for GSM System Information messages * according to 3GPP TS 44.018 Version 12.3.0 Release 12 */ /* (C) 2017 by Harald Welte */ module GSM_SystemInformation { import from General_Types all; import from GSM_Types all; import from Osmocom_Types all; type record L2PseudoLength { uint6_t l2_plen, BIT2 zero_one } with { variant "" }; template L2PseudoLength t_L2Pseudolength(uint6_t len) := { l2_plen := len, zero_one := '01'B }; type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" }; type record MaioHsn { } with { variant "" }; type union ArfcnOrMaio { uint12_t arfcn, MaioHsn maio_hsn } with { variant "" }; type record SystemInformationHeader { L2PseudoLength l2_plen, uint4_t skip_indicator, uint4_t rr_protocol_discriminator, RrMessageType message_type } with { variant "" }; template SystemInformationHeader t_SiHeader(RrMessageType msg_type, uint6_t len) := { l2_plen := t_L2Pseudolength(len), rr_protocol_discriminator := 6, message_type := msg_type }; external function enc_SystemInformationHeader(in SystemInformationHeader si) return octetstring with { extension "prototype(convert) encode(RAW)" }; external function dec_SystemInformationHeader(in octetstring stream) return SystemInformationHeader with { extension "prototype(convert) decode(RAW)" }; type hexstring GsmBcdString with { variant "HEXORDER(low)" }; type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" }; /* 24.008 10.5.1.1 */ type uint16_t CellIdentity; /* 24.008 10.5.1.3 */ type record LocationAreaIdentification { BcdMccMnc mcc_mnc, uint16_t lac } with { variant "" }; /* 44.018 10.5.2.1b */ type octetstring CellChannelDescription with { variant "FIELDLENGTH(16)" }; /* 44.018 10.5.2.3 */ type record CellOptions { boolean dn_ind, boolean pwrc, BIT2 dtx, BIT4 radio_link_timeout } with { variant "" }; /* 44.018 10.5.2.3a */ type record CellOptionsSacch { BIT1 dtx_ext, boolean pwrc, BIT2 dtx, BIT4 radio_link_timeout } with { variant "" }; /* 44.018 10.5.2.4 */ type record CellSelectionParameters { uint3_t cell_resel_hyst, uint5_t ms_txpwr_max_cch, boolean acs, boolean neci, uint6_t rxlev_access_min } with { variant "" }; /* 44.018 10.5.2.5 */ type record ChannelDescription { OCT1 iei, BIT5 chan_type_tdma_offset, uint3_t tn, uint3_t tsc, boolean h, uint12_t arfcn optional, MaioHsn maio_hsn optional } with { variant (arfcn) "PRESENCE(h = true)" variant (maio_hsn) "PRESENCE(h = false)" }; /* 44.018 10.5.2.11 */ type record ControlChannelDescription { boolean mscrr, boolean att, uint3_t bs_ag_blks_res, uint3_t ccch_conf, boolean si22ind, uint2_t cbq3, BIT2 spare, uint3_t bs_pa_mfrms, uint8_t t3212 } with { variant "" }; /* 44.018 10.5.2.21 */ type record MobileAllocation { OCT1 iei, uint8_t len, bitstring ma } with { variant "" }; /* 44.018 10.5.2.22 */ type octetstring NeighbourCellDescription with { variant "FIELDLENGTH(16)" }; /* 44.018 10.5.2.22a */ type octetstring NeighbourCellDescription2 with { variant "FIELDLENGTH(16)" }; type bitstring AccessControlClass with { variant "FIELDLENGTH(16), BYTEORDER(last)" }; /* 44.018 10.5.2.29 */ type record RachControlParameters { BIT2 max_retrans, BIT4 tx_integer, boolean cell_barr_access, boolean re, AccessControlClass ac } with { variant (ac) "FIELDLENGTH(16)" }; /* 44.018 10.5.2.32 */ type RestOctets Si1RestOctets with { variant "FIELDLENGTH(1)" }; type RestOctets Si3RestOctets with { variant "FIELDLENGTH(4)" }; /* 44.018 9.1.31 */ type record SystemInformationType1 { //SystemInformationHeader header, CellChannelDescription cell_chan_desc, RachControlParameters rach_control, Si1RestOctets rest_octets } with { variant "" }; /* 44.018 9.1.32 */ type record SystemInformationType2 { //SystemInformationHeader header, NeighbourCellDescription bcch_freq_list, BIT8 ncc_permitted, RachControlParameters rach_control } with { variant "" }; /* 44.018 9.1.33 */ type record SystemInformationType2bis { //SystemInformationHeader header, NeighbourCellDescription extd_bcch_freq_list, RachControlParameters rach_control, OCT1 rest_octets } with { variant "" }; /* 44.018 9.1.34 */ type record SystemInformationType2ter { //SystemInformationHeader header, NeighbourCellDescription2 extd_bcch_freq_list, OCT4 rest_octets } with { variant "" }; /* 44.018 9.1.35 */ type record SystemInformationType3 { //SystemInformationHeader header, CellIdentity cell_id, LocationAreaIdentification lai, ControlChannelDescription ctrl_chan_desc, CellOptions cell_options, CellSelectionParameters cell_sel_par, RachControlParameters rach_control, Si3RestOctets rest_octets } with { variant "" }; /* 44.018 9.1.36 */ type record SystemInformationType4 { //SystemInformationHeader header, LocationAreaIdentification lai, CellSelectionParameters cell_sel_par, RachControlParameters rach_control, ChannelDescription cbch_chan_desc optional, MobileAllocation cbch_mobile_alloc optional, RestOctets rest_octets } with { variant "TAG(cbch_chan_desc, iei = '64'O; cbch_mobile_alloc, iei = '72'O)" }; /* 44.018 9.1.37 */ type record SystemInformationType5 { SystemInformationHeader header, NeighbourCellDescription bcch_freq_list } with { variant "" }; /* 44.018 9.1.38 */ type record SystemInformationType5bis { //SystemInformationHeader header, NeighbourCellDescription extd_bcch_freq_list } with { variant "" }; /* 44.018 9.1.39 */ type record SystemInformationType5ter { //SystemInformationHeader header, NeighbourCellDescription2 extd_bcch_freq_list } with { variant "" }; /* 44.018 9.1.40 */ type record SystemInformationType6 { //SystemInformationHeader header, CellIdentity cell_id, LocationAreaIdentification lai, CellOptionsSacch cell_options, BIT8 ncc_permitted, OCT7 rest_octets } with { variant "" }; type union SystemInformationUnion { SystemInformationType1 si1, SystemInformationType2 si2, SystemInformationType2bis si2bis, SystemInformationType2ter si2ter, SystemInformationType3 si3, SystemInformationType4 si4, SystemInformationType5 si5, SystemInformationType5bis si5bis, SystemInformationType5ter si5ter, SystemInformationType6 si6 } with { variant "" }; type record SystemInformation { SystemInformationHeader header, SystemInformationUnion payload } with { variant (payload) "CROSSTAG(si1, header.message_type = SYSTEM_INFORMATION_TYPE_1; si2, header.message_type = SYSTEM_INFORMATION_TYPE_2; si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis; si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter; si3, header.message_type = SYSTEM_INFORMATION_TYPE_3; si4, header.message_type = SYSTEM_INFORMATION_TYPE_4; si5, header.message_type = SYSTEM_INFORMATION_TYPE_5; si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis; si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter; si6, header.message_type = SYSTEM_INFORMATION_TYPE_6; )" }; external function enc_SystemInformation(in SystemInformation si) return octetstring with { extension "prototype(convert) encode(RAW)" }; external function dec_SystemInformation(in octetstring stream) return SystemInformation with { extension "prototype(convert) decode(RAW)" }; } with { encode "RAW"; variant "FIELDORDER(msb)" }