From 9419c8aff79e5d1cf97077e5a146244be8699222 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 30 Jul 2017 04:07:05 +0200 Subject: Split RR portion of GSM_Types into GSM_RR_Types --- gprs_gb/gen_links.sh | 2 +- library/GSM_RR_Types.ttcn | 593 ++++++++++++++++++++++++++++++++++++++++++++ library/GSM_Types.ttcn | 458 ---------------------------------- library/L1CTL_PortType.ttcn | 1 + library/L1CTL_Types.ttcn | 1 + 5 files changed, 596 insertions(+), 459 deletions(-) create mode 100644 library/GSM_RR_Types.ttcn diff --git a/gprs_gb/gen_links.sh b/gprs_gb/gen_links.sh index c2e76dcf..20b40bea 100755 --- a/gprs_gb/gen_links.sh +++ b/gprs_gb/gen_links.sh @@ -30,5 +30,5 @@ gen_links $DIR $FILES DIR=../library -FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn" +FILES="General_Types.ttcn GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn RLCMAC_Types.ttcn L1CTL_Types.ttcn L1CTL_PortType.ttcn" gen_links $DIR $FILES diff --git a/library/GSM_RR_Types.ttcn b/library/GSM_RR_Types.ttcn new file mode 100644 index 00000000..436273af --- /dev/null +++ b/library/GSM_RR_Types.ttcn @@ -0,0 +1,593 @@ +/* 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_RR_Types { + + import from General_Types all; + import from Osmocom_Types all; + import from GSM_Types all; + import from RLCMAC_CSN1_Types all; + + /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */ + type enumerated RrMessageType { + ADDITIONAL_ASSIGNMENT ('00111011'B), + IMMEDIATE_ASSIGNMENT ('00111111'B), + IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B), + IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B), + IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B), + + CIPHERING_MODE_COMMAND ('00110101'B), + CIPHERING_MODE_COMPLETE ('00110010'B), + + CONFIGURATION_CHANGE_COMMAND ('00110000'B), + CONFIGURATION_CHANGE_ACK ('00110001'B), + CONFIGURATION_CHANGE_REJECT ('00110011'B), + + ASSIGNMENT_COMMAND ('00101110'B), + ASSIGNMENT_COMPLETE ('00101001'B), + ASSIGNMENT_FAILURE ('00101111'B), + HANDOVER_COMMAND ('00101011'B), + HANDOVER_COMPLETE ('00101100'B), + HANDOVER_FAILURE ('00101000'B), + PHYSICAL_INFORMATION ('00101101'B), + + CHANNEL_RELEASE ('00001101'B), + PARTIAL_RELEASE ('00001010'B), + PARTIAL_RELEASE_COMPLETE ('00001111'B), + + PAGING_REQUEST_TYPE_1 ('00100001'B), + PAGING_REQUEST_TYPE_2 ('00100010'B), + PAGING_REQUEST_TYPE_3 ('00100100'B), + PAGING_RESPONSE ('00100111'B), + NOTIFICATION_NCH ('00100000'B), + NOTIFICATION_RESPOSNE ('00100110'B), + + SYSTEM_INFORMATION_TYPE_8 ('00011000'B), + SYSTEM_INFORMATION_TYPE_1 ('00011001'B), + SYSTEM_INFORMATION_TYPE_2 ('00011010'B), + SYSTEM_INFORMATION_TYPE_3 ('00011011'B), + SYSTEM_INFORMATION_TYPE_4 ('00011100'B), + SYSTEM_INFORMATION_TYPE_5 ('00011101'B), + SYSTEM_INFORMATION_TYPE_6 ('00011110'B), + SYSTEM_INFORMATION_TYPE_7 ('00011111'B), + SYSTEM_INFORMATION_TYPE_2bis ('00000010'B), + SYSTEM_INFORMATION_TYPE_2ter ('00000011'B), + SYSTEM_INFORMATION_TYPE_2quater ('00000111'B), + SYSTEM_INFORMATION_TYPE_5bis ('00000101'B), + SYSTEM_INFORMATION_TYPE_5ter ('00000110'B), + SYSTEM_INFORMATION_TYPE_9 ('00000100'B), + SYSTEM_INFORMATION_TYPE_13 ('00000000'B), + + SYSTEM_INFORMATION_TYPE_16 ('00111101'B), + SYSTEM_INFORMATION_TYPE_17 ('00111110'B), + + CHANNEL_MODE_MODIFY ('00010000'B), + RR_STATUS ('00010010'B), + CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B), + FREQUENCY_REDEFINITION ('00010100'B), + MEASUREMENT_REPORT ('00010101'B), + CLASSMARK_CHANGE ('00010110'B), + CLASSMARK_ENQUIRY ('00010011'B), + EXTENDED_MEASUREMENT_REPORT ('00110110'B), + EXTENDED_MEASUREMENT_ORDER ('00110111'B), + GPRS_SUSPENSION_REQUEST ('00110100'B), + //MBMS_ANNOUNCEMENT ('00010110'B), duplicate? + //SERVICE_INFORMATION ('00110110'B), duplicate? + + APPLICATION_INFORMATION ('00111000'B), + + SYSTEM_INFORMATION_TYPE_14 ('00000001'B), + SYSTEM_INFORMATION_TYPE_15 ('01000011'B), + SYSTEM_INFORMATION_TYPE_18 ('01000000'B), + SYSTEM_INFORMATION_TYPE_19 ('01000001'B), + SYSTEM_INFORMATION_TYPE_20 ('01000010'B), + SYSTEM_INFORMATION_TYPE_13alt ('01000100'B), + SYSTEM_INFORMATION_TYPE_2n ('01000101'B), + SYSTEM_INFORMATION_TYPE_21 ('01000110'B), + SYSTEM_INFORMATION_TYPE_22 ('01000111'B), + SYSTEM_INFORMATION_TYPE_23 ('01001111'B), + + DTM_ASSIGNMENT_FAILURE ('01001000'B), + DTM_REJECT ('01001001'B), + DTM_REQUEST ('01001010'B), + PACKET_ASSIGNMENT ('01001011'B), + DTM_ASSIGNMENT_COMMAND ('01001100'B), + DTM_INFORMATION ('01001101'B), + PACKET_INFORMATION ('01001110'B), + + UTRAN_CLASSMARK_CHANGE ('01100000'B), + CDMA2000_CLASSMARK_CHANGE ('01100010'B), + INTERSYS_TO_UTRAN_HO_CMD ('01100011'B), + INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B), + GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B), + INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B) + } with { variant "FIELDLENGTH(8)" }; + + type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" }; + type hexstring GsmBcdString with { variant "HEXORDER(low)" }; + type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" }; + + type record L2PseudoLength { + uint6_t l2_plen, + BIT2 zero_one + } with { variant "" }; + + template L2PseudoLength t_L2Pseudolength(template uint6_t len) := { + l2_plen := len, + zero_one := '01'B + }; + + type record RrHeader { + L2PseudoLength l2_plen, + uint4_t skip_indicator, + uint4_t rr_protocol_discriminator, + RrMessageType message_type + } with { variant "" }; + + template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := { + l2_plen := t_L2Pseudolength(len), + skip_indicator := 0, + rr_protocol_discriminator := 6, + message_type := msg_type + }; + + type record RrL3Header { + uint4_t skip_indicator, + uint4_t rr_protocol_discriminator, + RrMessageType message_type + } with { variant "" }; + + type record MaioHsn { + } with { variant "" }; + + /* TS 24.008 10.5.1.1 */ + type uint16_t CellIdentity; + + /* TS 24.008 10.5.1.2 */ + type uint4_t CipheringKeySeqNr (0..7); + + /* 24.008 10.5.1.3 */ + type record LocationAreaIdentification { + BcdMccMnc mcc_mnc, + uint16_t lac + } with { variant "" }; + + /* TS 24.008 10.5.1.4 */ + type enumerated MobileIdentityType { + MI_TYPE_NONE (0), + MI_TYPE_IMSI, + MI_TYPE_IMEI, + MI_TYPE_IMEISV, + MI_TYPE_TMSI, + MI_TYPE_TMGI + } with { variant "FIELDLENGTH(3)" }; + + type record MobileIdentityBCD { + MobileIdentityType mi_type (MI_TYPE_IMSI, MI_TYPE_IMEI, MI_TYPE_IMEISV), + boolean odd, + hexstring digits + } with { variant "FIELDORDER(lsb)" }; + + type record MobileIdentityTMSI { + BIT4 pad ('1111'B), + boolean odd (false), + MobileIdentityType mi_type (MI_TYPE_TMSI), + GsmTmsi tmsi + } with { variant "FIELDORDER(lsb)" }; + + type record MobileIdentityNone { + BIT4 pad ('1111'B), + boolean odd (false), + MobileIdentityType mi_type (MI_TYPE_NONE) + } with { variant "FIELDORDER(lsb)" }; + + type union MobileIdentity { + MobileIdentityBCD imsi, + MobileIdentityBCD imei, + MobileIdentityBCD imeisv, + MobileIdentityTMSI tmsi, + MobileIdentityNone unused + } with { variant "TAG(imsi, mi_type = MI_TYPE_IMSI; + imei, mi_type = MI_TYPE_IMEI; + imeisv, mi_type = MI_TYPE_IMEISV; + tmsi, mi_type = MI_TYPE_TMSI; + unused, mi_type = MI_TYPE_NONE)" + variant "FIELDORDER(lsb)" + }; + + type record MobileIdentityLV { + uint8_t len, + MobileIdentity mi + } with { variant (len) "LENGTHTO(mi)" }; + + type record MobileIdentityTLV { + uint8_t tag, + uint8_t len, + MobileIdentity mi + } with { variant (len) "LENGTHTO(mi)" }; + + /* TS 24.008 10.5.1.5 */ + type record MsClassmark1 { + BIT1 spare, + uint2_t rev_level, + boolean es_ind, + boolean a51, + uint3_t rf_pwr_cap + } with { variant "" }; + + /* TS 24.008 10.5.1.6 */ + type record MsClassmark2 { + BIT1 spare, + uint2_t rev_level, + boolean es_ind, + boolean a51, + uint3_t rf_pwr_cap, + BIT1 spare1, + boolean ps_cap, + uint2_t ss_screen_ind, + boolean sm_cap, + boolean vbs, + boolean vgcs, + boolean fc, + boolean cm3, + BIT1 spare2, + boolean lcsva_cap, + boolean ucs2, + boolean solsa, + boolean cmsp, + boolean a53, + boolean a52 + } with { variant "" }; + type record MsClassmark2LV { + uint8_t len, + MsClassmark2 cm2 + } with { variant (len) "LENGTHTO(cm2)" }; + + + /* 44.018 10.5.2.5 */ + type record ChannelDescription { + RslChannelNr chan_nr, + uint3_t tsc, + boolean h, + uint12_t arfcn optional, + MaioHsn maio_hsn optional + } with { variant (arfcn) "PRESENCE(h = false)" + variant (maio_hsn) "PRESENCE(h = true)" }; + + type record ChannelDescriptionTV { + OCT1 iei, + ChannelDescription v + } with { variant "" }; + + /* 10.5.2.21 */ + type record MobileAllocation { + uint8_t len, + bitstring ma + } with { variant (len) "LENGTHTO(ma)" }; + + /* 10.5.2.25a */ + type OCT3 PacketChannelDescription; + + /* 10.5.2.25b */ + type record DedicatedModeOrTbf { + BIT1 spare, + boolean tma, + boolean downlink, + boolean tbf + } with { variant "" }; + + /* 10.5.2.26 */ + type enumerated PageMode { + PAGE_MODE_NORMAL, + PAGE_MODE_EXTENDED, + PAGE_MODE_REORGANIZATION, + PAGE_MODE_SAME_AS_BEFORE + } with { variant "FIELDLENGTH(4)" }; + + /* 10.5.2.30 */ + type record RequestReference { + bitstring ra length(8), + uint5_t t1p, + uint6_t t3, + uint5_t t2 + } with { variant "" }; + + template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := { + ra := ra, + t1p := t1p, + t3 := t3, + t2 := t2 + } + + /* compute the expected request reference for given RA + FN */ + function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference { + var RequestReference req_ref := { ra := int2bit(ra, 8) }; + req_ref.t1p := (fn / 1326) mod 32; + req_ref.t2 := fn mod 26; + req_ref.t3 := fn mod 51; + return req_ref + } + + /* 10.5.2.40 */ + type integer TimingAdvance (0..219); + + /* 10.5.2.43 */ + type uint8_t WaitIndication; + + /* 10.5.2.76 */ + type record FeatureIndicator { + BIT2 spare, + boolean cs_ir, + boolean ps_ir + } with { variant "" }; + + /* 24.008 10.5.5.6 */ + type record DrxParameter { + uint8_t split_pg_cycle_code, + uint4_t drx_cycle_len_coeff, + boolean split_on_ccch, + uint3_t non_drx_timer + } with { variant "" }; + + /* 24.008 10.5.5.15 */ + type record RoutingAreaIdentification { + LocationAreaIdentification lai, + uint8_t rac + } with { variant "" }; + + /* 44.018 10.5.2.16 */ + type record IaRestOctHL { + uint6_t freq_par_len, + BIT2 padding ('00'B) optional, + uint6_t maio optional, + octetstring mobile_allocation optional + } with { + variant (freq_par_len) "LENGTHTO(mobile_allocation,maio,padding)" +/* + variant (padding) "PRESENCE(freq_par_len != 0)" + variant (maio) "PRESENCE(freq_par_len != 0)" + variant (mobile_allocation) "PRESENCE(freq_par_len != 0)" +*/ + }; + type record IaRestOctHH { + BIT2 presence, + PacketUlAssign ul optional, + PacketDlAssign dl optional + } with { + variant (ul) "PRESENCE(presence = '00'B)" + variant (dl) "PRESENCE(presence = '01'B)" + }; + type record PacketUlAssignDyn { + uint5_t tfi_assignment, + BIT1 polling, + BIT1 spare ('0'B), + uint3_t usf, + BIT1 usf_granularity, + BIT1 p0_present, + uint4_t p0 optional, + BIT1 pr_mode optional, + ChCodingCommand ch_coding_cmd, + BIT1 tlli_block_chan_coding, + BIT1 alpha_present, + uint4_t alpha optional, + uint5_t gamma, + BIT1 ta_index_present, + uint4_t ta_index optional, + BIT1 tbf_starting_time_present, + uint16_t tbf_starting_time optional + } with { + variant (p0) "PRESENCE(p0_present = '1'B)" + variant (pr_mode) "PRESENCE(p0_present = '1'B)" + variant (alpha) "PRESENCE(alpha_present = '1'B)" + variant (ta_index) "PRESENCE(ta_index_present = '1'B)" + variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)" + }; + type record PacketUlAssignSgl { + BIT1 alpha_present, + uint4_t alpha optional, + uint5_t gamma, + BIT2 padding ('01'B), + uint16_t tbf_starting_time + /* TODO: P0 / PR_MODE */ + } with { + variant (alpha) "PRESENCE(alpha_present = '1'B)" + }; + type record PacketUlAssign { + BIT1 presence, + PacketUlAssignDyn dynamic optional, + PacketUlAssignSgl single optional + /* TODO: Estended RA, PFI */ + } with { + variant (dynamic) "PRESENCE(presence = '1'B)" + variant (single) "PRESENCE(presence = '0'B)" + }; + type record PacketDlAssG1 { + uint5_t tfi_assignment, + BIT1 rlc_mode, + BIT1 alpha_present, + uint4_t alpha optional, + uint5_t gamma, + BIT1 polling, + BIT1 ta_valid + } with { variant "" }; + type record PacketDlAssign { + GprsTlli tlli, + BIT1 group1_present, + PacketDlAssG1 group1 optional, + BIT1 ta_index_present, + uint4_t ta_index optional, + BIT1 tbf_starting_time_present, + uint16_t tbf_starting_time optional, + BIT1 p0_present, + uint4_t p0 optional, + BIT1 pr_mode optional + /* TODO: EGPRS window size, etc. */ + } with { + variant (group1) "PRESENCE(group1_present = '1'B)" + variant (ta_index) "PRESENCE(ta_index_present = '1'B)" + variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)" + variant (p0) "PRESENCE(p0_present = '1'B)" + variant (pr_mode) "PRESENCE(p0_present = '1'B)" + }; + type record IaRestOctLL { + BIT1 compressed_irat_ho_info_ind + } with { variant "" }; + type octetstring EgprsUlAss; /* TODO */ + type octetstring MblkDlAss; /* TODO */ + type record IaRestOctLH { + BIT2 presence, + EgprsUlAss egprs_ul optional, + MblkDlAss multiblock_dl_ass optional + } with { + variant (egprs_ul) "PRESENCE(presence = '00'B)" + variant (multiblock_dl_ass) "PRESENCE(presence = '01'B)" + }; + type record IaRestOctets { + BIT2 presence, + IaRestOctLL ll optional, + IaRestOctLH lh optional, + IaRestOctHL hl optional, + IaRestOctHH hh optional + } with { + variant (ll) "PRESENCE(presence = '00'B)" + variant (lh) "PRESENCE(presence = '01'B)" + variant (hl) "PRESENCE(presence = '10'B)" + variant (hh) "PRESENCE(presence = '11'B)" + }; + + + /* 9.1.18 */ + type record ImmediateAssignment { + DedicatedModeOrTbf ded_or_tbf, + PageMode page_mode, + ChannelDescription chan_desc optional, + PacketChannelDescription pkt_chan_desc optional, + RequestReference req_ref, + TimingAdvance timing_advance, + MobileAllocation mobile_allocation, + /* TODO: starting time TLV */ + IaRestOctets rest_octets + } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)" + variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" }; + + /* 9.1.20 */ + type record ReqRefWaitInd { + RequestReference req_ref, + WaitIndication wait_ind + } with { variant "" }; + type record length(4) of ReqRefWaitInd ReqRefWaitInd4; + type record ImmediateAssignmentReject { + FeatureIndicator feature_ind, + PageMode page_mode, + ReqRefWaitInd4 payload + } with { variant "" }; + + /* 9.1.22 */ + type record PagingRequestType1 { + ChannelNeeded12 chan_needed, + PageMode page_mode, + MobileIdentityLV mi1, + MobileIdentityTLV mi2 optional, + RestOctets rest_octets + } with { variant "TAG(mi2, tag = 23)" }; + + /* 9.1.23 */ + type record PagingRequestType2 { + ChannelNeeded12 chan_needed, + PageMode page_mode, + GsmTmsi mi1, + GsmTmsi mi2, + MobileIdentityTLV mi3 optional, + RestOctets rest_octets + } with { variant "TAG(mi3, tag = 23)" }; + + /* 9.1.24 */ + type record length(4) of GsmTmsi GsmTmsi4; + type record PagingRequestType3 { + ChannelNeeded12 chan_needed, + PageMode page_mode, + GsmTmsi4 mi, + RestOctets rest_octets + } with { variant "" }; + + + type union RrUnion { +/* + SystemInformationType1 si1, + SystemInformationType2 si2, + SystemInformationType2bis si2bis, + SystemInformationType2ter si2ter, + SystemInformationType3 si3, + SystemInformationType4 si4, + SystemInformationType5 si5, + SystemInformationType5bis si5bis, + SystemInformationType5ter si5ter, + SystemInformationType6 si6, +*/ + ImmediateAssignment imm_ass, + ImmediateAssignmentReject imm_ass_rej, + PagingRequestType1 pag_req_1, + PagingRequestType2 pag_req_2, + PagingRequestType3 pag_req_3, + octetstring other + } with { variant "" }; + + /* Special RR Message on BCCH / CCCH Dowlink */ + + type record GsmRrMessage { + RrHeader header, + RrUnion 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; +*/ + imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT; + imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT; + pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1; + pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2; + pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3; + other, OTHERWISE; + )" }; + + external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring + with { extension "prototype(convert) encode(RAW)" }; + external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage + with { extension "prototype(convert) decode(RAW)" }; + + /* Normal L3 Message on Dedicated Channel */ + + /* 9.1.25 Paging Response */ + type record PagingResponse { + uint4_t spare_half_octet, + CipheringKeySeqNr cksn, + MsClassmark2LV cm2, + MobileIdentityLV mi, + uint8_t addl_upd_par optional + } with { variant "" }; + + type union RrL3Union { + PagingResponse paging_response, + octetstring other + }; + + type record GsmRrL3Message { + RrL3Header header, + RrL3Union payload + } with { variant (payload) "CROSSTAG( + paging_response, header.message_type = PAGING_RESPONSE; + + other, OTHERWISE; + )" } + +} with { encode "RAW" ; variant "FIELDORDER(msb)" } diff --git a/library/GSM_Types.ttcn b/library/GSM_Types.ttcn index a9922351..811623ad 100644 --- a/library/GSM_Types.ttcn +++ b/library/GSM_Types.ttcn @@ -18,257 +18,6 @@ module GSM_Types { type uint32_t GsmTmsi; type uint32_t GprsTlli; - /* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */ - type enumerated RrMessageType { - ADDITIONAL_ASSIGNMENT ('00111011'B), - IMMEDIATE_ASSIGNMENT ('00111111'B), - IMMEDIATE_ASSIGNMENT_EXTENDED ('00111001'B), - IMMEDIATE_ASSIGNMENT_REJECT ('00111010'B), - IMMEDIATE_PACKET_ASSIGNMENT ('01101001'B), - - CIPHERING_MODE_COMMAND ('00110101'B), - CIPHERING_MODE_COMPLETE ('00110010'B), - - CONFIGURATION_CHANGE_COMMAND ('00110000'B), - CONFIGURATION_CHANGE_ACK ('00110001'B), - CONFIGURATION_CHANGE_REJECT ('00110011'B), - - ASSIGNMENT_COMMAND ('00101110'B), - ASSIGNMENT_COMPLETE ('00101001'B), - ASSIGNMENT_FAILURE ('00101111'B), - HANDOVER_COMMAND ('00101011'B), - HANDOVER_COMPLETE ('00101100'B), - HANDOVER_FAILURE ('00101000'B), - PHYSICAL_INFORMATION ('00101101'B), - - CHANNEL_RELEASE ('00001101'B), - PARTIAL_RELEASE ('00001010'B), - PARTIAL_RELEASE_COMPLETE ('00001111'B), - - PAGING_REQUEST_TYPE_1 ('00100001'B), - PAGING_REQUEST_TYPE_2 ('00100010'B), - PAGING_REQUEST_TYPE_3 ('00100100'B), - PAGING_RESPONSE ('00100111'B), - NOTIFICATION_NCH ('00100000'B), - NOTIFICATION_RESPOSNE ('00100110'B), - - SYSTEM_INFORMATION_TYPE_8 ('00011000'B), - SYSTEM_INFORMATION_TYPE_1 ('00011001'B), - SYSTEM_INFORMATION_TYPE_2 ('00011010'B), - SYSTEM_INFORMATION_TYPE_3 ('00011011'B), - SYSTEM_INFORMATION_TYPE_4 ('00011100'B), - SYSTEM_INFORMATION_TYPE_5 ('00011101'B), - SYSTEM_INFORMATION_TYPE_6 ('00011110'B), - SYSTEM_INFORMATION_TYPE_7 ('00011111'B), - SYSTEM_INFORMATION_TYPE_2bis ('00000010'B), - SYSTEM_INFORMATION_TYPE_2ter ('00000011'B), - SYSTEM_INFORMATION_TYPE_2quater ('00000111'B), - SYSTEM_INFORMATION_TYPE_5bis ('00000101'B), - SYSTEM_INFORMATION_TYPE_5ter ('00000110'B), - SYSTEM_INFORMATION_TYPE_9 ('00000100'B), - SYSTEM_INFORMATION_TYPE_13 ('00000000'B), - - SYSTEM_INFORMATION_TYPE_16 ('00111101'B), - SYSTEM_INFORMATION_TYPE_17 ('00111110'B), - - CHANNEL_MODE_MODIFY ('00010000'B), - RR_STATUS ('00010010'B), - CHANNEL_MODE_MODIFY_ACKNOWLEDGE ('00010111'B), - FREQUENCY_REDEFINITION ('00010100'B), - MEASUREMENT_REPORT ('00010101'B), - CLASSMARK_CHANGE ('00010110'B), - CLASSMARK_ENQUIRY ('00010011'B), - EXTENDED_MEASUREMENT_REPORT ('00110110'B), - EXTENDED_MEASUREMENT_ORDER ('00110111'B), - GPRS_SUSPENSION_REQUEST ('00110100'B), - //MBMS_ANNOUNCEMENT ('00010110'B), duplicate? - //SERVICE_INFORMATION ('00110110'B), duplicate? - - APPLICATION_INFORMATION ('00111000'B), - - SYSTEM_INFORMATION_TYPE_14 ('00000001'B), - SYSTEM_INFORMATION_TYPE_15 ('01000011'B), - SYSTEM_INFORMATION_TYPE_18 ('01000000'B), - SYSTEM_INFORMATION_TYPE_19 ('01000001'B), - SYSTEM_INFORMATION_TYPE_20 ('01000010'B), - SYSTEM_INFORMATION_TYPE_13alt ('01000100'B), - SYSTEM_INFORMATION_TYPE_2n ('01000101'B), - SYSTEM_INFORMATION_TYPE_21 ('01000110'B), - SYSTEM_INFORMATION_TYPE_22 ('01000111'B), - SYSTEM_INFORMATION_TYPE_23 ('01001111'B), - - DTM_ASSIGNMENT_FAILURE ('01001000'B), - DTM_REJECT ('01001001'B), - DTM_REQUEST ('01001010'B), - PACKET_ASSIGNMENT ('01001011'B), - DTM_ASSIGNMENT_COMMAND ('01001100'B), - DTM_INFORMATION ('01001101'B), - PACKET_INFORMATION ('01001110'B), - - UTRAN_CLASSMARK_CHANGE ('01100000'B), - CDMA2000_CLASSMARK_CHANGE ('01100010'B), - INTERSYS_TO_UTRAN_HO_CMD ('01100011'B), - INTERSYS_TO_CDMA2000_HO_CMD ('01100100'B), - GERAN_IU_MODE_CLASSMARK_CHG ('01100101'B), - INTERSYS_TO_EUTRAN_HO_CMD ('01100110'B) - } with { variant "FIELDLENGTH(8)" }; - - type octetstring RestOctets with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" }; - type hexstring GsmBcdString with { variant "HEXORDER(low)" }; - type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" }; - - type record L2PseudoLength { - uint6_t l2_plen, - BIT2 zero_one - } with { variant "" }; - - template L2PseudoLength t_L2Pseudolength(template uint6_t len) := { - l2_plen := len, - zero_one := '01'B - }; - - type record RrHeader { - L2PseudoLength l2_plen, - uint4_t skip_indicator, - uint4_t rr_protocol_discriminator, - RrMessageType message_type - } with { variant "" }; - - template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := { - l2_plen := t_L2Pseudolength(len), - skip_indicator := 0, - rr_protocol_discriminator := 6, - message_type := msg_type - }; - - type record RrL3Header { - uint4_t skip_indicator, - uint4_t rr_protocol_discriminator, - RrMessageType message_type - } with { variant "" }; - - type record MaioHsn { - } with { variant "" }; - - /* TS 24.008 10.5.1.1 */ - type uint16_t CellIdentity; - - /* TS 24.008 10.5.1.2 */ - type uint4_t CipheringKeySeqNr (0..7); - - /* 24.008 10.5.1.3 */ - type record LocationAreaIdentification { - BcdMccMnc mcc_mnc, - uint16_t lac - } with { variant "" }; - - /* TS 24.008 10.5.1.4 */ - type enumerated MobileIdentityType { - MI_TYPE_NONE (0), - MI_TYPE_IMSI, - MI_TYPE_IMEI, - MI_TYPE_IMEISV, - MI_TYPE_TMSI, - MI_TYPE_TMGI - } with { variant "FIELDLENGTH(3)" }; - - type record MobileIdentityBCD { - MobileIdentityType mi_type (MI_TYPE_IMSI, MI_TYPE_IMEI, MI_TYPE_IMEISV), - boolean odd, - hexstring digits - } with { variant "FIELDORDER(lsb)" }; - - type record MobileIdentityTMSI { - BIT4 pad ('1111'B), - boolean odd (false), - MobileIdentityType mi_type (MI_TYPE_TMSI), - GsmTmsi tmsi - } with { variant "FIELDORDER(lsb)" }; - - type record MobileIdentityNone { - BIT4 pad ('1111'B), - boolean odd (false), - MobileIdentityType mi_type (MI_TYPE_NONE) - } with { variant "FIELDORDER(lsb)" }; - - type union MobileIdentity { - MobileIdentityBCD imsi, - MobileIdentityBCD imei, - MobileIdentityBCD imeisv, - MobileIdentityTMSI tmsi, - MobileIdentityNone unused - } with { variant "TAG(imsi, mi_type = MI_TYPE_IMSI; - imei, mi_type = MI_TYPE_IMEI; - imeisv, mi_type = MI_TYPE_IMEISV; - tmsi, mi_type = MI_TYPE_TMSI; - unused, mi_type = MI_TYPE_NONE)" - variant "FIELDORDER(lsb)" - }; - - type record MobileIdentityLV { - uint8_t len, - MobileIdentity mi - } with { variant (len) "LENGTHTO(mi)" }; - - type record MobileIdentityTLV { - uint8_t tag, - uint8_t len, - MobileIdentity mi - } with { variant (len) "LENGTHTO(mi)" }; - - /* TS 24.008 10.5.1.5 */ - type record MsClassmark1 { - BIT1 spare, - uint2_t rev_level, - boolean es_ind, - boolean a51, - uint3_t rf_pwr_cap - } with { variant "" }; - - /* TS 24.008 10.5.1.6 */ - type record MsClassmark2 { - BIT1 spare, - uint2_t rev_level, - boolean es_ind, - boolean a51, - uint3_t rf_pwr_cap, - BIT1 spare1, - boolean ps_cap, - uint2_t ss_screen_ind, - boolean sm_cap, - boolean vbs, - boolean vgcs, - boolean fc, - boolean cm3, - BIT1 spare2, - boolean lcsva_cap, - boolean ucs2, - boolean solsa, - boolean cmsp, - boolean a53, - boolean a52 - } with { variant "" }; - type record MsClassmark2LV { - uint8_t len, - MsClassmark2 cm2 - } with { variant (len) "LENGTHTO(cm2)" }; - - - /* 44.018 10.5.2.5 */ - type record ChannelDescription { - RslChannelNr chan_nr, - uint3_t tsc, - boolean h, - uint12_t arfcn optional, - MaioHsn maio_hsn optional - } with { variant (arfcn) "PRESENCE(h = false)" - variant (maio_hsn) "PRESENCE(h = true)" }; - - type record ChannelDescriptionTV { - OCT1 iei, - ChannelDescription v - } with { variant "" }; - /* 10.5.2.8 */ type enumerated ChannelNeeded { CHAN_NEED_ANY (0), @@ -281,213 +30,6 @@ module GSM_Types { ChannelNeeded first } with { variant "" }; - /* 10.5.2.21 */ - type record MobileAllocation { - uint8_t len, - bitstring ma - } with { variant (len) "LENGTHTO(ma)" }; - - /* 10.5.2.25a */ - type OCT3 PacketChannelDescription; - - /* 10.5.2.25b */ - type record DedicatedModeOrTbf { - BIT1 spare, - boolean tma, - boolean downlink, - boolean tbf - } with { variant "" }; - - /* 10.5.2.26 */ - type enumerated PageMode { - PAGE_MODE_NORMAL, - PAGE_MODE_EXTENDED, - PAGE_MODE_REORGANIZATION, - PAGE_MODE_SAME_AS_BEFORE - } with { variant "FIELDLENGTH(4)" }; - - /* 10.5.2.30 */ - type record RequestReference { - bitstring ra length(8), - uint5_t t1p, - uint6_t t3, - uint5_t t2 - } with { variant "" }; - - template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := { - ra := ra, - t1p := t1p, - t3 := t3, - t2 := t2 - } - - /* compute the expected request reference for given RA + FN */ - function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference { - var RequestReference req_ref := { ra := int2bit(ra, 8) }; - req_ref.t1p := (fn / 1326) mod 32; - req_ref.t2 := fn mod 26; - req_ref.t3 := fn mod 51; - return req_ref - } - - /* 10.5.2.40 */ - type integer TimingAdvance (0..219); - - /* 10.5.2.43 */ - type uint8_t WaitIndication; - - /* 10.5.2.76 */ - type record FeatureIndicator { - BIT2 spare, - boolean cs_ir, - boolean ps_ir - } with { variant "" }; - - /* 24.008 10.5.5.6 */ - type record DrxParameter { - uint8_t split_pg_cycle_code, - uint4_t drx_cycle_len_coeff, - boolean split_on_ccch, - uint3_t non_drx_timer - } with { variant "" }; - - /* 24.008 10.5.5.15 */ - type record RoutingAreaIdentification { - LocationAreaIdentification lai, - uint8_t rac - } with { variant "" }; - - - - /* 9.1.18 */ - type record ImmediateAssignment { - DedicatedModeOrTbf ded_or_tbf, - PageMode page_mode, - ChannelDescription chan_desc optional, - PacketChannelDescription pkt_chan_desc optional, - RequestReference req_ref, - TimingAdvance timing_advance, - MobileAllocation mobile_allocation - } with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)" - variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" }; - - /* 9.1.20 */ - type record ReqRefWaitInd { - RequestReference req_ref, - WaitIndication wait_ind - } with { variant "" }; - type record length(4) of ReqRefWaitInd ReqRefWaitInd4; - type record ImmediateAssignmentReject { - FeatureIndicator feature_ind, - PageMode page_mode, - ReqRefWaitInd4 payload - } with { variant "" }; - - /* 9.1.22 */ - type record PagingRequestType1 { - ChannelNeeded12 chan_needed, - PageMode page_mode, - MobileIdentityLV mi1, - MobileIdentityTLV mi2 optional, - RestOctets rest_octets - } with { variant "TAG(mi2, tag = 23)" }; - - /* 9.1.23 */ - type record PagingRequestType2 { - ChannelNeeded12 chan_needed, - PageMode page_mode, - GsmTmsi mi1, - GsmTmsi mi2, - MobileIdentityTLV mi3 optional, - RestOctets rest_octets - } with { variant "TAG(mi3, tag = 23)" }; - - /* 9.1.24 */ - type record length(4) of GsmTmsi GsmTmsi4; - type record PagingRequestType3 { - ChannelNeeded12 chan_needed, - PageMode page_mode, - GsmTmsi4 mi, - RestOctets rest_octets - } with { variant "" }; - - - type union RrUnion { -/* - SystemInformationType1 si1, - SystemInformationType2 si2, - SystemInformationType2bis si2bis, - SystemInformationType2ter si2ter, - SystemInformationType3 si3, - SystemInformationType4 si4, - SystemInformationType5 si5, - SystemInformationType5bis si5bis, - SystemInformationType5ter si5ter, - SystemInformationType6 si6, -*/ - ImmediateAssignment imm_ass, - ImmediateAssignmentReject imm_ass_rej, - PagingRequestType1 pag_req_1, - PagingRequestType2 pag_req_2, - PagingRequestType3 pag_req_3, - octetstring other - } with { variant "" }; - - /* Special RR Message on BCCH / CCCH Dowlink */ - - type record GsmRrMessage { - RrHeader header, - RrUnion 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; -*/ - imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT; - imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT; - pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1; - pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2; - pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3; - other, OTHERWISE; - )" }; - - external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring - with { extension "prototype(convert) encode(RAW)" }; - external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage - with { extension "prototype(convert) decode(RAW)" }; - - /* Normal L3 Message on Dedicated Channel */ - - /* 9.1.25 Paging Response */ - type record PagingResponse { - uint4_t spare_half_octet, - CipheringKeySeqNr cksn, - MsClassmark2LV cm2, - MobileIdentityLV mi, - uint8_t addl_upd_par optional - } with { variant "" }; - - type union RrL3Union { - PagingResponse paging_response, - octetstring other - }; - - type record GsmRrL3Message { - RrL3Header header, - RrL3Union payload - } with { variant (payload) "CROSSTAG( - paging_response, header.message_type = PAGING_RESPONSE; - - other, OTHERWISE; - )" } /* TS 48.058 9.3.1 Channel Number IE */ type enumerated RslChanNr0 { diff --git a/library/L1CTL_PortType.ttcn b/library/L1CTL_PortType.ttcn index 019e2a70..7a9ee3e6 100644 --- a/library/L1CTL_PortType.ttcn +++ b/library/L1CTL_PortType.ttcn @@ -5,6 +5,7 @@ module L1CTL_PortType { import from UD_Types all; import from Osmocom_Types all; import from GSM_Types all; + import from GSM_RR_Types all; type record L1CTL_connect { charstring path diff --git a/library/L1CTL_Types.ttcn b/library/L1CTL_Types.ttcn index 66e7b9da..78947065 100644 --- a/library/L1CTL_Types.ttcn +++ b/library/L1CTL_Types.ttcn @@ -5,6 +5,7 @@ module L1CTL_Types { import from General_Types all; import from GSM_Types all; + import from GSM_RR_Types all; import from Osmocom_Types all; type enumerated L1ctlMsgType { -- cgit v1.2.3