261 lines
7.5 KiB
Plaintext
261 lines
7.5 KiB
Plaintext
/* 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 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,
|
|
octetstring other
|
|
} 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;
|
|
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)" }
|