| /* 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 <laforge@gnumonks.org> */ |
| |
| module GSM_SystemInformation { |
| |
| import from General_Types all; |
| |
| type integer uint32_t (0..4294967295) with { variant "unsigned 32 bit" }; |
| type integer uint16_t (0..65535) with { variant "unsigned 16 bit" }; |
| type integer uint2_t (0..3) with { variant "unsigned 2 bit" }; |
| type integer uint3_t (0..7) with { variant "unsigned 3 bit" }; |
| type integer uint4_t (0..15) with { variant "unsigned 4 bit" }; |
| type integer uint5_t (0..31) with { variant "unsigned 5 bit" }; |
| type integer uint6_t (0..63) with { variant "unsigned 6 bit" }; |
| type integer uint7_t (0..127) with { variant "unsigned 7 bit" }; |
| type integer uint8_t (0..255) with { variant "unsigned 8 bit" }; |
| type integer uint9_t (0..511) with { variant "unsigned 9 bit" }; |
| type integer uint10_t (0..1023) with { variant "unsigned 10 bit" }; |
| type integer uint11_t (0..2047) with { variant "unsigned 11 bit" }; |
| type integer uint12_t (0..4095) with { variant "unsigned 12 bit" }; |
| |
| 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, |
| OCT1 message_type |
| } with { variant "" }; |
| |
| template SystemInformationHeader t_SiHeader(OCT1 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, |
| RachControlParameters rach_control, |
| 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 SystemInformation { |
| SystemInformationType1 si1, |
| SystemInformationType2 si2, |
| SystemInformationType2bis si2bis, |
| SystemInformationType2ter si2ter, |
| SystemInformationType3 si3, |
| SystemInformationType4 si4, |
| SystemInformationType5 si5, |
| SystemInformationType5bis si5bis, |
| SystemInformationType5ter si5ter, |
| SystemInformationType6 si6 |
| } with { variant "TAG(si1, header.message_type = '19'O; |
| si2, header.message_type = '1A'O; |
| si2bis, header.message_type = '02'O; |
| si2ter, header.message_type = '03'O; |
| si3, header.message_type = '1B'O; |
| si4, header.message_type = '1C'O; |
| si5, header.message_type = '1D'O; |
| si5bis, header.message_type = '05'O; |
| si5ter, header.message_type = '06'O; |
| si6, header.message_type = '1E'O; |
| )" }; |
| |
| 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)" } |