| /* 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; |
| import from GSM_Types all; |
| import from GSM_RR_Types all; |
| import from Osmocom_Types all; |
| |
| type union ArfcnOrMaio { |
| uint12_t arfcn, |
| MaioHsn maio_hsn |
| } with { variant "" }; |
| |
| /* 24.008 10.5.1.1 */ |
| type uint16_t SysinfoCellIdentity; |
| |
| /* 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.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 "" }; |
| |
| template ControlChannelDescription t_ControlChannelDescription := { ?, ?, ?, ?, ?, ?, '00'B, ?, ? }; |
| |
| /* 44.018 10.5.2.21 */ |
| type record MobileAllocationT { |
| 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 { |
| CellChannelDescription cell_chan_desc, |
| RachControlParameters rach_control, |
| Si1RestOctets rest_octets |
| } with { variant "" }; |
| |
| /* 44.018 9.1.32 */ |
| type record SystemInformationType2 { |
| NeighbourCellDescription bcch_freq_list, |
| BIT8 ncc_permitted, |
| RachControlParameters rach_control |
| } with { variant "" }; |
| |
| /* 44.018 9.1.33 */ |
| type record SystemInformationType2bis { |
| NeighbourCellDescription extd_bcch_freq_list, |
| RachControlParameters rach_control, |
| OCT1 rest_octets |
| } with { variant "" }; |
| |
| /* 44.018 9.1.34 */ |
| type record SystemInformationType2ter { |
| NeighbourCellDescription2 extd_bcch_freq_list, |
| OCT4 rest_octets |
| } with { variant "" }; |
| |
| /* 44.018 9.1.35 */ |
| type record SystemInformationType3 { |
| SysinfoCellIdentity cell_id, |
| LocationAreaIdentification lai, |
| ControlChannelDescription ctrl_chan_desc, |
| CellOptions cell_options, |
| CellSelectionParameters cell_sel_par, |
| RachControlParameters rach_control, |
| Si3RestOctets rest_octets |
| } with { variant "" }; |
| |
| template SystemInformationType3 t_SI3 := { |
| cell_id := ?, |
| lai := ?, |
| ctrl_chan_desc := t_ControlChannelDescription, |
| cell_options := ?, |
| cell_sel_par := ?, |
| rach_control := ?, |
| rest_octets := ? |
| }; |
| |
| |
| /* 44.018 9.1.36 */ |
| type record SystemInformationType4 { |
| LocationAreaIdentification lai, |
| CellSelectionParameters cell_sel_par, |
| RachControlParameters rach_control, |
| ChannelDescriptionTV cbch_chan_desc optional, |
| MobileAllocationT 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 { |
| NeighbourCellDescription bcch_freq_list |
| } with { variant "" }; |
| |
| /* 44.018 9.1.38 */ |
| type record SystemInformationType5bis { |
| NeighbourCellDescription extd_bcch_freq_list |
| } with { variant "" }; |
| |
| /* 44.018 9.1.39 */ |
| type record SystemInformationType5ter { |
| NeighbourCellDescription2 extd_bcch_freq_list |
| } with { variant "" }; |
| |
| /* 44.018 9.1.40 */ |
| type record SystemInformationType6 { |
| SysinfoCellIdentity 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, |
| octetstring other |
| } with { variant "" }; |
| |
| type record SystemInformation { |
| RrHeader 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; |
| other, OTHERWISE; |
| )" }; |
| |
| 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)" } |