diff options
author | Bill Meier <wmeier@newsguy.com> | 2012-03-15 23:19:28 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2012-03-15 23:19:28 +0000 |
commit | bc30c6d5aa63c63b65de56a0161f9d2e8b07be22 (patch) | |
tree | 4079f468fb248a08ba97acbead741bc92ac685f6 /epan | |
parent | c4cc3264fdbc96cf9b4bd2ca634f07acd6e76b87 (diff) |
FT_BOOLEAN hf[] entries with a 0 'bitmask' should have 'display' = BASE_NONE;
Convert "4 space tabs" to "4 spaces";
General whitespace & formatting changes.
svn path=/trunk/; revision=41580
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.c | 6719 |
1 files changed, 3358 insertions, 3361 deletions
diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index 48621fe89e..3d8a7ff44b 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -45,22 +45,22 @@ const value_string gsm_common_elem_strings[] = { - /* Common Information Elements 10.5.1 */ - { 0x00, "Cell Identity" }, - { 0x00, "Ciphering Key Sequence Number" }, - { 0x00, "Location Area Identification (LAI)" }, - { 0x00, "Mobile Identity" }, - { 0x00, "Mobile Station Classmark 1" }, - { 0x00, "Mobile Station Classmark 2" }, - { 0x00, "Mobile Station Classmark 3" }, - { 0x00, "Spare Half Octet" }, - { 0x00, "Descriptive group or broadcast call reference" }, - { 0x00, "Group Cipher Key Number" }, - { 0x00, "PD and SAPI $(CCBS)$" }, - { 0x00, "Priority Level" }, - { 0x00, "PLMN List" }, - { 0x00, "NAS container for PS HO" }, - { 0, NULL } + /* Common Information Elements 10.5.1 */ + { 0x00, "Cell Identity" }, + { 0x00, "Ciphering Key Sequence Number" }, + { 0x00, "Location Area Identification (LAI)" }, + { 0x00, "Mobile Identity" }, + { 0x00, "Mobile Station Classmark 1" }, + { 0x00, "Mobile Station Classmark 2" }, + { 0x00, "Mobile Station Classmark 3" }, + { 0x00, "Spare Half Octet" }, + { 0x00, "Descriptive group or broadcast call reference" }, + { 0x00, "Group Cipher Key Number" }, + { 0x00, "PD and SAPI $(CCBS)$" }, + { 0x00, "Priority Level" }, + { 0x00, "PLMN List" }, + { 0x00, "NAS container for PS HO" }, + { 0, NULL } }; /* Mobile Station Classmark Value strings @@ -70,198 +70,198 @@ const value_string gsm_common_elem_strings[] = { * Revision level */ static const value_string gsm_a_msc_rev_vals[] = { - { 0, "Reserved for GSM phase 1"}, - { 1, "Used by GSM phase 2 mobile stations"}, - { 2, "Used by mobile stations supporting R99 or later versions of the protocol"}, - { 3, "Reserved for future use"}, - { 0, NULL } + { 0, "Reserved for GSM phase 1"}, + { 1, "Used by GSM phase 2 mobile stations"}, + { 2, "Used by mobile stations supporting R99 or later versions of the protocol"}, + { 3, "Reserved for future use"}, + { 0, NULL } }; /* ES IND (octet 3, bit 5) "Controlled Early Classmark Sending" option implementation */ static const true_false_string ES_IND_vals = { - "Controlled Early Classmark Sending option is implemented in the MS", - "Controlled Early Classmark Sending option is not implemented in the MS" + "Controlled Early Classmark Sending option is implemented in the MS", + "Controlled Early Classmark Sending option is not implemented in the MS" }; /* A5/1 algorithm supported (octet 3, bit 4) */ static const true_false_string A5_1_algorithm_sup_vals = { - "encryption algorithm A5/1 not available", - "encryption algorithm A5/1 available" + "encryption algorithm A5/1 not available", + "encryption algorithm A5/1 available" }; /* RF Power Capability (Octet 3) */ static const value_string RF_power_capability_vals[] = { - { 0, "class 1"}, - { 1, "class 2"}, - { 2, "class 3"}, - { 3, "class 4"}, - { 4, "class 5"}, - { 7, "RF Power capability is irrelevant in this information element"}, - { 0, NULL } + { 0, "class 1"}, + { 1, "class 2"}, + { 2, "class 3"}, + { 3, "class 4"}, + { 4, "class 5"}, + { 7, "RF Power capability is irrelevant in this information element"}, + { 0, NULL } }; /* PS capability (pseudo-synchronization capability) (octet 4) */ static const true_false_string ps_sup_cap_vals = { - "PS capability present", - "PS capability not present" + "PS capability present", + "PS capability not present" }; /* SS Screening Indicator (octet 4)defined in 3GPP TS 24.080 */ static const value_string SS_screening_indicator_vals[] = { - { 0, "Default value of phase 1"}, - { 1, "Capability of handling of ellipsis notation and phase 2 error handling "}, - { 2, "For future use"}, - { 3, "For future use"}, - { 0, NULL } + { 0, "Default value of phase 1"}, + { 1, "Capability of handling of ellipsis notation and phase 2 error handling "}, + { 2, "For future use"}, + { 3, "For future use"}, + { 0, NULL } }; /* SM capability (MT SMS pt to pt capability) (octet 4)*/ static const true_false_string SM_capability_vals = { - "Mobile station supports mobile terminated point to point SMS", - "Mobile station does not support mobile terminated point to point SMS" + "Mobile station supports mobile terminated point to point SMS", + "Mobile station does not support mobile terminated point to point SMS" }; /* VBS notification reception (octet 4) */ static const true_false_string VBS_notification_rec_vals = { - "VBS capability and notifications wanted", - "no VBS capability or no notifications wanted" + "VBS capability and notifications wanted", + "no VBS capability or no notifications wanted" }; /* VGCS notification reception (octet 4) */ static const true_false_string VGCS_notification_rec_vals = { - "VGCS capability and notifications wanted", - "no VGCS capability or no notifications wanted" + "VGCS capability and notifications wanted", + "no VGCS capability or no notifications wanted" }; /* FC Frequency Capability (octet 4 ) */ static const true_false_string FC_frequency_cap_vals = { - "The MS does support the E-GSM or R-GSM", - "The MS does not support the E-GSM or R-GSM band" + "The MS does support the E-GSM or R-GSM", + "The MS does not support the E-GSM or R-GSM band" }; /* CM3 (octet 5, bit 8) */ static const true_false_string CM3_vals = { - "The MS supports options that are indicated in classmark 3 IE", - "The MS does not support any options that are indicated in CM3" + "The MS supports options that are indicated in classmark 3 IE", + "The MS does not support any options that are indicated in CM3" }; /* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */ static const true_false_string LCS_VA_cap_vals = { - "LCS value added location request notification capability supported", - "LCS value added location request notification capability not supported" + "LCS value added location request notification capability supported", + "LCS value added location request notification capability not supported" }; /* UCS2 treatment (octet 5, bit 5) */ static const true_false_string UCS2_treatment_vals = { - "the ME has no preference between the use of the default alphabet and the use of UCS2", - "the ME has a preference for the default alphabet" + "the ME has no preference between the use of the default alphabet and the use of UCS2", + "the ME has a preference for the default alphabet" }; /* SoLSA (octet 5, bit 4) */ static const true_false_string SoLSA_vals = { - "The ME supports SoLSA", - "The ME does not support SoLSA" + "The ME supports SoLSA", + "The ME does not support SoLSA" }; /* CMSP: CM Service Prompt (octet 5, bit 3) */ static const true_false_string CMSP_vals = { - "Network initiated MO CM connection request supported for at least one CM protocol", - "Network initiated MO CM connection request not supported" + "Network initiated MO CM connection request supported for at least one CM protocol", + "Network initiated MO CM connection request not supported" }; /* A5/7 algorithm supported */ static const true_false_string A5_7_algorithm_sup_vals = { - "encryption algorithm A5/7 available", - "encryption algorithm A5/7 not available" + "encryption algorithm A5/7 available", + "encryption algorithm A5/7 not available" }; /* A5/6 algorithm supported */ static const true_false_string A5_6_algorithm_sup_vals = { - "encryption algorithm A5/6 available", - "encryption algorithm A5/6 not available" + "encryption algorithm A5/6 available", + "encryption algorithm A5/6 not available" }; /* A5/5 algorithm supported */ static const true_false_string A5_5_algorithm_sup_vals = { - "encryption algorithm A5/5 available", - "encryption algorithm A5/5 not available" + "encryption algorithm A5/5 available", + "encryption algorithm A5/5 not available" }; /* A5/4 algorithm supported */ static const true_false_string A5_4_algorithm_sup_vals = { - "encryption algorithm A5/4 available", - "encryption algorithm A5/4 not available" + "encryption algorithm A5/4 available", + "encryption algorithm A5/4 not available" }; /* A5/3 algorithm supported (octet 5, bit 2) */ static const true_false_string A5_3_algorithm_sup_vals = { - "encryption algorithm A5/3 available", - "encryption algorithm A5/3 not available" + "encryption algorithm A5/3 available", + "encryption algorithm A5/3 not available" }; /* A5/2 algorithm supported (octet 5, bit 1) */ static const true_false_string A5_2_algorithm_sup_vals = { - "encryption algorithm A5/2 available", - "encryption algorithm A5/2 not available" + "encryption algorithm A5/2 available", + "encryption algorithm A5/2 not available" }; static const value_string mobile_identity_type_vals[] = { - { 1, "IMSI"}, - { 2, "IMEI"}, - { 3, "IMEISV"}, - { 4, "TMSI/P-TMSI"}, - { 5, "TMGI and optional MBMS Session Identity"}, /* ETSI TS 124 008 V6.8.0 (2005-03) p326 */ - { 0, "No Identity"}, - { 0, NULL } + { 1, "IMSI"}, + { 2, "IMEI"}, + { 3, "IMEISV"}, + { 4, "TMSI/P-TMSI"}, + { 5, "TMGI and optional MBMS Session Identity"}, /* ETSI TS 124 008 V6.8.0 (2005-03) p326 */ + { 0, "No Identity"}, + { 0, NULL } }; static const true_false_string oddevenind_vals = { - "Odd number of identity digits", - "Even number of identity digits" + "Odd number of identity digits", + "Even number of identity digits" }; static const true_false_string true_false_vals = { - "true", - "false" + "true", + "false" }; const value_string gsm_a_sms_vals[] = { - {0, "1/4 timeslot (~144 microseconds)" }, - {1, "2/4 timeslot (~288 microseconds)" }, - {2, "3/4 timeslot (~433 microseconds)" }, - {3, "4/4 timeslot (~577 microseconds)" }, - {4, "5/4 timeslot (~721 microseconds)" }, - {5, "6/4 timeslot (~865 microseconds)" }, - {6, "7/4 timeslot (~1009 microseconds)" }, - {7, "8/4 timeslot (~1154 microseconds)" }, - {8, "9/4 timeslot (~1298 microseconds)" }, - {9, "10/4 timeslot (~1442 microseconds)" }, - {10, "11/4 timeslot (~1586 microseconds)" }, - {11, "12/4 timeslot (~1730 microseconds)" }, - {12, "13/4 timeslot (~1874 microseconds)" }, - {13, "14/4 timeslot (~2019 microseconds)" }, - {14, "15/4 timeslot (~2163 microseconds)" }, - {15, "16/4 timeslot (~2307 microseconds)" }, - { 0, NULL} + { 0, "1/4 timeslot (~144 microseconds)" }, + { 1, "2/4 timeslot (~288 microseconds)" }, + { 2, "3/4 timeslot (~433 microseconds)" }, + { 3, "4/4 timeslot (~577 microseconds)" }, + { 4, "5/4 timeslot (~721 microseconds)" }, + { 5, "6/4 timeslot (~865 microseconds)" }, + { 6, "7/4 timeslot (~1009 microseconds)" }, + { 7, "8/4 timeslot (~1154 microseconds)" }, + { 8, "9/4 timeslot (~1298 microseconds)" }, + { 9, "10/4 timeslot (~1442 microseconds)" }, + { 10, "11/4 timeslot (~1586 microseconds)" }, + { 11, "12/4 timeslot (~1730 microseconds)" }, + { 12, "13/4 timeslot (~1874 microseconds)" }, + { 13, "14/4 timeslot (~2019 microseconds)" }, + { 14, "15/4 timeslot (~2163 microseconds)" }, + { 15, "16/4 timeslot (~2307 microseconds)" }, + { 0, NULL} }; static const true_false_string ms_assisted_e_otd_vals = { - "MS assisted E-OTD supported", - "MS assisted E-OTD not supported" + "MS assisted E-OTD supported", + "MS assisted E-OTD not supported" }; static const true_false_string ms_based_e_otd_vals = { - "MS based E-OTD supported", - "MS based E-OTD not supported" + "MS based E-OTD supported", + "MS based E-OTD not supported" }; static const true_false_string ms_assisted_gps_vals = { - "MS assisted GPS supported", - "MS assisted GPS not supported" + "MS assisted GPS supported", + "MS assisted GPS not supported" }; static const true_false_string ms_based_gps_vals = { - "MS based GPS supported", - "MS based GPS not supported" + "MS based GPS supported", + "MS based GPS not supported" }; static const true_false_string ms_conventional_gps_vals = { - "Conventional GPS supported", - "Conventional GPS not supported" + "Conventional GPS supported", + "Conventional GPS not supported" }; static const true_false_string modulation_capability_vals = { - "8-PSK supported for uplink transmission and downlink reception", - "8-PSK supported for downlink reception only" + "8-PSK supported for uplink transmission and downlink reception", + "8-PSK supported for downlink reception only" }; static const value_string eight_psk_rf_power_capability_vals[] = { - { 0, "Reserved" }, - { 1, "Power class E1" }, - { 2, "Power class E2" }, - { 3, "Power class E3" }, - { 0, NULL} + { 0, "Reserved" }, + { 1, "Power class E1" }, + { 2, "Power class E2" }, + { 3, "Power class E3" }, + { 0, NULL} }; static const value_string gsm_400_bands_supported_vals[] = { @@ -272,81 +272,81 @@ static const value_string gsm_400_bands_supported_vals[] = { }; static const true_false_string umts_fdd_rat_cap_vals = { - "UMTS FDD supported", - "UMTS FDD not supported" + "UMTS FDD supported", + "UMTS FDD not supported" }; static const true_false_string umts_384_mcps_tdd_rat_cap_vals = { - "UMTS 3.84 Mcps TDD supported", - "UMTS 3.84 Mcps TDD not supported" + "UMTS 3.84 Mcps TDD supported", + "UMTS 3.84 Mcps TDD not supported" }; static const true_false_string cdma_2000_rat_cap_vals = { - "CDMA 2000 supported", - "CDMA 2000 not supported" + "CDMA 2000 supported", + "CDMA 2000 not supported" }; static const value_string dtm_gprs_multi_slot_class_vals[] = { - { 0, "Unused. If received, the network shall interpret this as 1" }, - { 1, "Multislot class 5 supported" }, - { 2, "Multislot class 9 supported" }, - { 3, "Multislot class 11 supported" }, - { 0, NULL} + { 0, "Unused. If received, the network shall interpret this as 1" }, + { 1, "Multislot class 5 supported" }, + { 2, "Multislot class 9 supported" }, + { 3, "Multislot class 11 supported" }, + { 0, NULL} }; static const true_false_string single_slot_dtm_vals = { - "Single Slot DTM supported", - "Single Slot DTM not supported" + "Single Slot DTM supported", + "Single Slot DTM not supported" }; static const value_string gsm_band_vals[] = { - { 0, "E-GSM is supported" }, - { 1, "P-GSM is supported" }, - { 2, "GSM 1800 is supported" }, - { 3, "GSM 450 is supported" }, - { 4, "GSM 480 is supported" }, - { 5, "GSM 850 is supported" }, - { 6, "GSM 1900 is supported" }, - { 7, "GSM 750 is supported" }, - { 8, "GSM 710 is supported" }, - { 9, "T-GSM 810 is supported" }, - { 0, NULL} + { 0, "E-GSM is supported" }, + { 1, "P-GSM is supported" }, + { 2, "GSM 1800 is supported" }, + { 3, "GSM 450 is supported" }, + { 4, "GSM 480 is supported" }, + { 5, "GSM 850 is supported" }, + { 6, "GSM 1900 is supported" }, + { 7, "GSM 750 is supported" }, + { 8, "GSM 710 is supported" }, + { 9, "T-GSM 810 is supported" }, + { 0, NULL} }; static const true_false_string umts_128_mcps_tdd_rat_cap_vals = { - "UMTS 1.28 Mcps TDD supported", - "UMTS 1.28 Mcps TDD not supported" + "UMTS 1.28 Mcps TDD supported", + "UMTS 1.28 Mcps TDD not supported" }; static const true_false_string geran_feature_package_1_vals = { - "GERAN feature package 1 supported", - "GERAN feature package 1 not supported" + "GERAN feature package 1 supported", + "GERAN feature package 1 not supported" }; static const true_false_string flo_iu_cap_vals = { - "FLO in GERAN Iu Mode supported", - "FLO in GERAN Iu Mode not supported" + "FLO in GERAN Iu Mode supported", + "FLO in GERAN Iu Mode not supported" }; static const true_false_string geran_feature_package_2_vals = { - "GERAN feature package 2 supported", - "GERAN feature package 2 not supported" + "GERAN feature package 2 supported", + "GERAN feature package 2 not supported" }; static const value_string gmsk_multislot_power_prof_vals[] = { - { 0, "GMSK_MULTISLOT_POWER_PROFILE 0" }, - { 1, "GMSK_MULTISLOT_POWER_PROFILE 1" }, - { 2, "GMSK_MULTISLOT_POWER_PROFILE 2" }, - { 3, "GMSK_MULTISLOT_POWER_PROFILE 3" }, - { 0, NULL} + { 0, "GMSK_MULTISLOT_POWER_PROFILE 0" }, + { 1, "GMSK_MULTISLOT_POWER_PROFILE 1" }, + { 2, "GMSK_MULTISLOT_POWER_PROFILE 2" }, + { 3, "GMSK_MULTISLOT_POWER_PROFILE 3" }, + { 0, NULL} }; static const value_string eight_psk_multislot_power_prof_vals[] = { - { 0, "8-PSK_MULTISLOT_POWER_PROFILE 0" }, - { 1, "8-PSK_MULTISLOT_POWER_PROFILE 1" }, - { 2, "8-PSK_MULTISLOT_POWER_PROFILE 2" }, - { 3, "8-PSK_MULTISLOT_POWER_PROFILE 3" }, - { 0, NULL} + { 0, "8-PSK_MULTISLOT_POWER_PROFILE 0" }, + { 1, "8-PSK_MULTISLOT_POWER_PROFILE 1" }, + { 2, "8-PSK_MULTISLOT_POWER_PROFILE 2" }, + { 3, "8-PSK_MULTISLOT_POWER_PROFILE 3" }, + { 0, NULL} }; static const value_string t_gsm_400_bands_supported_vals[] = { @@ -364,143 +364,142 @@ static const value_string downlink_adv_receiver_perf_vals[] = { }; static const true_false_string dtm_enhancements_cap_vals = { - "The mobile station supports enhanced DTM CS establishment and release procedures", - "The mobile station does not support enhanced DTM CS establishment and release procedures" + "The mobile station supports enhanced DTM CS establishment and release procedures", + "The mobile station does not support enhanced DTM CS establishment and release procedures" }; static const true_false_string offset_required_vals = { - "The mobile station requires the offset", - "The mobile station does not require the offset" + "The mobile station requires the offset", + "The mobile station does not require the offset" }; static const value_string dtm_gprs_high_multi_slot_class_vals[] = { - { 0, "Unused. If received, the network shall interpret this as \"0 0 1\"" }, - { 1, "Multislot class 31 or 36 supported" }, - { 2, "Multislot class 32 or 37 supported" }, - { 3, "Multislot class 33 or 38 supported" }, - { 4, "Multislot class 41 supported" }, - { 5, "Multislot class 42 supported" }, - { 6, "Multislot class 43 supported" }, - { 7, "Multislot class 44 supported" }, - { 0, NULL} + { 0, "Unused. If received, the network shall interpret this as \"0 0 1\"" }, + { 1, "Multislot class 31 or 36 supported" }, + { 2, "Multislot class 32 or 37 supported" }, + { 3, "Multislot class 33 or 38 supported" }, + { 4, "Multislot class 41 supported" }, + { 5, "Multislot class 42 supported" }, + { 6, "Multislot class 43 supported" }, + { 7, "Multislot class 44 supported" }, + { 0, NULL} }; static const true_false_string repeated_acch_cap_vals = { - "The mobile station supports Repeated SACCH and Repeated Downlink FACCH", - "The mobile station does not support Repeated SACCH" + "The mobile station supports Repeated SACCH and Repeated Downlink FACCH", + "The mobile station does not support Repeated SACCH" }; static const true_false_string ciphering_mode_setting_cap_vals = { - "The mobile station supports the Ciphering Mode Setting IE in the DTM ASSIGNMENT COMMAND message", - "The mobile station does not support the Ciphering Mode Setting IE in the DTM ASSIGNMENT COMMAND message" + "The mobile station supports the Ciphering Mode Setting IE in the DTM ASSIGNMENT COMMAND message", + "The mobile station does not support the Ciphering Mode Setting IE in the DTM ASSIGNMENT COMMAND message" }; static const true_false_string additional_positioning_caps_vals = { - "The mobile station supports additional positioning capabilities which can be retrieved using RRLP", - "The mobile station does not support additional positioning capabilities which can be retrieved using RRLP" + "The mobile station supports additional positioning capabilities which can be retrieved using RRLP", + "The mobile station does not support additional positioning capabilities which can be retrieved using RRLP" }; static const true_false_string e_utra_fdd_support_vals = { - "E-UTRA FDD supported", - "E-UTRA FDD not supported" + "E-UTRA FDD supported", + "E-UTRA FDD not supported" }; static const true_false_string e_utra_tdd_support_vals = { - "E-UTRA TDD supported", - "E-UTRA TDD not supported" + "E-UTRA TDD supported", + "E-UTRA TDD not supported" }; static const true_false_string e_utra_meas_and_report_support_vals = { - "E-UTRAN Neighbour Cell measurements and measurement reporting while having an RR connection supported", - "E-UTRAN Neighbour Cell measurements and measurement reporting while having an RR connection not supported" + "E-UTRAN Neighbour Cell measurements and measurement reporting while having an RR connection supported", + "E-UTRAN Neighbour Cell measurements and measurement reporting while having an RR connection not supported" }; static const true_false_string prio_based_resel_support_vals = { - "Priority-based cell reselection supported", - "Priority-based cell reselection not supported" + "Priority-based cell reselection supported", + "Priority-based cell reselection not supported" }; static const true_false_string utra_csg_cells_reporting_vals = { - "Reporting of UTRAN CSG cells supported", - "Reporting of UTRAN CSG cells not supported" + "Reporting of UTRAN CSG cells supported", + "Reporting of UTRAN CSG cells not supported" }; static const value_string vamos_level_vals[] = { { 0, "VAMOS not supported" }, - { 1, "VAMOS I supported" }, - { 2, "VAMOS II supported" }, - { 3, "Unused. If received, the network shall interpret this as VAMOS II supported" }, - { 0, NULL} + { 1, "VAMOS I supported" }, + { 2, "VAMOS II supported" }, + { 3, "Unused. If received, the network shall interpret this as VAMOS II supported" }, + { 0, NULL} }; static const value_string gsm_a_rr_rxlev_vals [] = { - { 0, "< -110 dBm"}, - { 1, "-110 <= x < -109 dBm"}, - { 2, "-109 <= x < -108 dBm"}, - { 3, "-108 <= x < -107 dBm"}, - { 4, "-107 <= x < -106 dBm"}, - { 5, "-106 <= x < -105 dBm"}, - { 6, "-105 <= x < -104 dBm"}, - { 7, "-104 <= x < -103 dBm"}, - { 8, "-103 <= x < -102 dBm"}, - { 9, "-102 <= x < -101 dBm"}, - {10, "-101 <= x < -100 dBm"}, - {11, "-100 <= x < -99 dBm"}, - {12, "-99 <= x < -98 dBm"}, - {13, "-98 <= x < -97 dBm"}, - {14, "-97 <= x < -96 dBm"}, - {15, "-96 <= x < -95 dBm"}, - {16, "-95 <= x < -94 dBm"}, - {17, "-94 <= x < -93 dBm"}, - {18, "-93 <= x < -92 dBm"}, - {19, "-92 <= x < -91 dBm"}, - {20, "-91 <= x < -90 dBm"}, - {21, "-90 <= x < -89 dBm"}, - {22, "-89 <= x < -88 dBm"}, - {23, "-88 <= x < -87 dBm"}, - {24, "-87 <= x < -86 dBm"}, - {25, "-86 <= x < -85 dBm"}, - {26, "-85 <= x < -84 dBm"}, - {27, "-84 <= x < -83 dBm"}, - {28, "-83 <= x < -82 dBm"}, - {29, "-82 <= x < -81 dBm"}, - {30, "-81 <= x < -80 dBm"}, - {31, "-80 <= x < -79 dBm"}, - {32, "-79 <= x < -78 dBm"}, - {33, "-78 <= x < -77 dBm"}, - {34, "-77 <= x < -76 dBm"}, - {35, "-76 <= x < -75 dBm"}, - {36, "-75 <= x < -74 dBm"}, - {37, "-74 <= x < -73 dBm"}, - {38, "-73 <= x < -72 dBm"}, - {39, "-72 <= x < -71 dBm"}, - {40, "-71 <= x < -70 dBm"}, - {41, "-70 <= x < -69 dBm"}, - {42, "-69 <= x < -68 dBm"}, - {43, "-68 <= x < -67 dBm"}, - {44, "-67 <= x < -66 dBm"}, - {45, "-66 <= x < -65 dBm"}, - {46, "-65 <= x < -64 dBm"}, - {47, "-64 <= x < -63 dBm"}, - {48, "-63 <= x < -62 dBm"}, - {49, "-62 <= x < -61 dBm"}, - {50, "-61 <= x < -60 dBm"}, - {51, "-60 <= x < -59 dBm"}, - {52, "-59 <= x < -58 dBm"}, - {53, "-58 <= x < -57 dBm"}, - {54, "-57 <= x < -56 dBm"}, - {55, "-56 <= x < -55 dBm"}, - {56, "-55 <= x < -54 dBm"}, - {57, "-54 <= x < -53 dBm"}, - {58, "-53 <= x < -52 dBm"}, - {59, "-52 <= x < -51 dBm"}, - {60, "-51 <= x < -50 dBm"}, - {61, "-50 <= x < -49 dBm"}, - {62, "-49 <= x < -48 dBm"}, - {63, ">= -48 dBm"}, + { 0, "< -110 dBm"}, + { 1, "-110 <= x < -109 dBm"}, + { 2, "-109 <= x < -108 dBm"}, + { 3, "-108 <= x < -107 dBm"}, + { 4, "-107 <= x < -106 dBm"}, + { 5, "-106 <= x < -105 dBm"}, + { 6, "-105 <= x < -104 dBm"}, + { 7, "-104 <= x < -103 dBm"}, + { 8, "-103 <= x < -102 dBm"}, + { 9, "-102 <= x < -101 dBm"}, + { 10, "-101 <= x < -100 dBm"}, + { 11, "-100 <= x < -99 dBm"}, + { 12, "-99 <= x < -98 dBm"}, + { 13, "-98 <= x < -97 dBm"}, + { 14, "-97 <= x < -96 dBm"}, + { 15, "-96 <= x < -95 dBm"}, + { 16, "-95 <= x < -94 dBm"}, + { 17, "-94 <= x < -93 dBm"}, + { 18, "-93 <= x < -92 dBm"}, + { 19, "-92 <= x < -91 dBm"}, + { 20, "-91 <= x < -90 dBm"}, + { 21, "-90 <= x < -89 dBm"}, + { 22, "-89 <= x < -88 dBm"}, + { 23, "-88 <= x < -87 dBm"}, + { 24, "-87 <= x < -86 dBm"}, + { 25, "-86 <= x < -85 dBm"}, + { 26, "-85 <= x < -84 dBm"}, + { 27, "-84 <= x < -83 dBm"}, + { 28, "-83 <= x < -82 dBm"}, + { 29, "-82 <= x < -81 dBm"}, + { 30, "-81 <= x < -80 dBm"}, + { 31, "-80 <= x < -79 dBm"}, + { 32, "-79 <= x < -78 dBm"}, + { 33, "-78 <= x < -77 dBm"}, + { 34, "-77 <= x < -76 dBm"}, + { 35, "-76 <= x < -75 dBm"}, + { 36, "-75 <= x < -74 dBm"}, + { 37, "-74 <= x < -73 dBm"}, + { 38, "-73 <= x < -72 dBm"}, + { 39, "-72 <= x < -71 dBm"}, + { 40, "-71 <= x < -70 dBm"}, + { 41, "-70 <= x < -69 dBm"}, + { 42, "-69 <= x < -68 dBm"}, + { 43, "-68 <= x < -67 dBm"}, + { 44, "-67 <= x < -66 dBm"}, + { 45, "-66 <= x < -65 dBm"}, + { 46, "-65 <= x < -64 dBm"}, + { 47, "-64 <= x < -63 dBm"}, + { 48, "-63 <= x < -62 dBm"}, + { 49, "-62 <= x < -61 dBm"}, + { 50, "-61 <= x < -60 dBm"}, + { 51, "-60 <= x < -59 dBm"}, + { 52, "-59 <= x < -58 dBm"}, + { 53, "-58 <= x < -57 dBm"}, + { 54, "-57 <= x < -56 dBm"}, + { 55, "-56 <= x < -55 dBm"}, + { 56, "-55 <= x < -54 dBm"}, + { 57, "-54 <= x < -53 dBm"}, + { 58, "-53 <= x < -52 dBm"}, + { 59, "-52 <= x < -51 dBm"}, + { 60, "-51 <= x < -50 dBm"}, + { 61, "-50 <= x < -49 dBm"}, + { 62, "-49 <= x < -48 dBm"}, + { 63, ">= -48 dBm"}, { 0, NULL} }; - value_string_ext gsm_a_rr_rxlev_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_rr_rxlev_vals); /* Initialize the protocol and registered fields */ @@ -516,25 +515,25 @@ static int hf_gsm_a_imei = -1; static int hf_gsm_a_imeisv = -1; static int hf_gsm_a_MSC_rev = -1; -static int hf_gsm_a_ES_IND = -1; +static int hf_gsm_a_ES_IND = -1; static int hf_gsm_a_A5_1_algorithm_sup = -1; static int hf_gsm_a_RF_power_capability = -1; -static int hf_gsm_a_ps_sup_cap = -1; +static int hf_gsm_a_ps_sup_cap = -1; static int hf_gsm_a_SS_screening_indicator = -1; -static int hf_gsm_a_SM_capability = -1; +static int hf_gsm_a_SM_capability = -1; static int hf_gsm_a_VBS_notification_rec = -1; static int hf_gsm_a_VGCS_notification_rec = -1; -static int hf_gsm_a_FC_frequency_cap = -1; -static int hf_gsm_a_CM3 = -1; -static int hf_gsm_a_LCS_VA_cap = -1; -static int hf_gsm_a_UCS2_treatment = -1; -static int hf_gsm_a_SoLSA = -1; -static int hf_gsm_a_CMSP = -1; -static int hf_gsm_a_A5_7_algorithm_sup= -1; -static int hf_gsm_a_A5_6_algorithm_sup= -1; -static int hf_gsm_a_A5_5_algorithm_sup= -1; -static int hf_gsm_a_A5_4_algorithm_sup= -1; -static int hf_gsm_a_A5_3_algorithm_sup= -1; +static int hf_gsm_a_FC_frequency_cap = -1; +static int hf_gsm_a_CM3 = -1; +static int hf_gsm_a_LCS_VA_cap = -1; +static int hf_gsm_a_UCS2_treatment = -1; +static int hf_gsm_a_SoLSA = -1; +static int hf_gsm_a_CMSP = -1; +static int hf_gsm_a_A5_7_algorithm_sup = -1; +static int hf_gsm_a_A5_6_algorithm_sup = -1; +static int hf_gsm_a_A5_5_algorithm_sup = -1; +static int hf_gsm_a_A5_4_algorithm_sup = -1; +static int hf_gsm_a_A5_3_algorithm_sup = -1; static int hf_gsm_a_A5_2_algorithm_sup = -1; static int hf_gsm_a_odd_even_ind = -1; @@ -570,82 +569,82 @@ static int hf_gsm_a_ms_measurement_capability = -1; static int hf_gsm_a_sms_value =-1; static int hf_gsm_a_sm_value =-1; static int hf_gsm_a_key_seq = -1; -static int hf_gsm_a_ms_pos_method_cap_present = -1; -static int hf_gsm_a_ms_pos_method = -1; -static int hf_gsm_a_ms_assisted_e_otd = -1; -static int hf_gsm_a_ms_based_e_otd = -1; -static int hf_gsm_a_ms_assisted_gps = -1; -static int hf_gsm_a_ms_based_gps = -1; -static int hf_gsm_a_ms_conventional_gps = -1; -static int hf_gsm_a_ecsd_multi_slot_capability = -1; -static int hf_gsm_a_ecsd_multi_slot_class = -1; -static int hf_gsm_a_8_psk_struct_present = -1; -static int hf_gsm_a_8_psk_struct = -1; -static int hf_gsm_a_modulation_capability = -1; -static int hf_gsm_a_8_psk_rf_power_capability_1 = -1; -static int hf_gsm_a_8_psk_rf_power_capability_2 = -1; -static int hf_gsm_a_gsm_400_band_info_present = -1; -static int hf_gsm_a_gsm_400_bands_supported = -1; -static int hf_gsm_a_gsm_400_assoc_radio_cap = -1; -static int hf_gsm_a_gsm_850_assoc_radio_cap_present = -1; -static int hf_gsm_a_gsm_850_assoc_radio_cap = -1; -static int hf_gsm_a_gsm_1900_assoc_radio_cap_present = -1; -static int hf_gsm_a_gsm_1900_assoc_radio_cap = -1; -static int hf_gsm_a_cm3_A5_bits = -1; -static int hf_gsm_a_umts_fdd_rat_cap = -1; -static int hf_gsm_a_umts_384_mcps_tdd_rat_cap = -1; -static int hf_gsm_a_cdma_2000_rat_cap = -1; -static int hf_gsm_a_dtm_e_gprs_multi_slot_info_present = -1; -static int hf_gsm_a_dtm_gprs_multi_slot_class = -1; -static int hf_gsm_a_single_slot_dtm = -1; -static int hf_gsm_a_dtm_egprs_multi_slot_class_present = -1; -static int hf_gsm_a_dtm_egprs_multi_slot_class = -1; -static int hf_gsm_a_single_band_support = -1; -static int hf_gsm_a_gsm_band = -1; -static int hf_gsm_a_gsm_750_assoc_radio_cap_present = -1; -static int hf_gsm_a_gsm_750_assoc_radio_cap = -1; -static int hf_gsm_a_umts_128_mcps_tdd_rat_cap = -1; -static int hf_gsm_a_geran_feature_package_1 = -1; -static int hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present = -1; -static int hf_gsm_a_ext_dtm_gprs_multi_slot_class = -1; -static int hf_gsm_a_ext_dtm_egprs_multi_slot_class = -1; -static int hf_gsm_a_high_multislot_cap_present = -1; -static int hf_gsm_a_high_multislot_cap = -1; -static int hf_gsm_a_geran_iu_mode_support = -1; -static int hf_gsm_a_geran_iu_mode_cap = -1; -static int hf_gsm_a_geran_iu_mode_cap_length = -1; -static int hf_gsm_a_flo_iu_cap = -1; -static int hf_gsm_a_geran_feature_package_2 = -1; -static int hf_gsm_a_gmsk_multislot_power_prof = -1; -static int hf_gsm_a_8_psk_multislot_power_prof = -1; -static int hf_gsm_a_t_gsm_400_band_info_present = -1; -static int hf_gsm_a_t_gsm_400_bands_supported = -1; -static int hf_gsm_a_t_gsm_400_assoc_radio_cap = -1; -static int hf_gsm_a_t_gsm_900_assoc_radio_cap_present = -1; -static int hf_gsm_a_t_gsm_900_assoc_radio_cap = -1; -static int hf_gsm_a_downlink_adv_receiver_perf = -1; -static int hf_gsm_a_dtm_enhancements_cap = -1; -static int hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present = -1; -static int hf_gsm_a_dtm_gprs_high_multi_slot_class = -1; -static int hf_gsm_a_offset_required = -1; -static int hf_gsm_a_dtm_egprs_high_multi_slot_class_present = -1; -static int hf_gsm_a_dtm_egprs_high_multi_slot_class = -1; -static int hf_gsm_a_repeated_acch_cap = -1; -static int hf_gsm_a_gsm_710_assoc_radio_cap_present = -1; -static int hf_gsm_a_gsm_710_assoc_radio_cap = -1; -static int hf_gsm_a_t_gsm_810_assoc_radio_cap_present = -1; -static int hf_gsm_a_t_gsm_810_assoc_radio_cap = -1; -static int hf_gsm_a_ciphering_mode_setting_cap = -1; -static int hf_gsm_a_additional_positioning_caps = -1; -static int hf_gsm_a_e_utra_fdd_support = -1; -static int hf_gsm_a_e_utra_tdd_support = -1; -static int hf_gsm_a_e_utra_meas_and_report_support = -1; +static int hf_gsm_a_ms_pos_method_cap_present = -1; +static int hf_gsm_a_ms_pos_method = -1; +static int hf_gsm_a_ms_assisted_e_otd = -1; +static int hf_gsm_a_ms_based_e_otd = -1; +static int hf_gsm_a_ms_assisted_gps = -1; +static int hf_gsm_a_ms_based_gps = -1; +static int hf_gsm_a_ms_conventional_gps = -1; +static int hf_gsm_a_ecsd_multi_slot_capability = -1; +static int hf_gsm_a_ecsd_multi_slot_class = -1; +static int hf_gsm_a_8_psk_struct_present = -1; +static int hf_gsm_a_8_psk_struct = -1; +static int hf_gsm_a_modulation_capability = -1; +static int hf_gsm_a_8_psk_rf_power_capability_1 = -1; +static int hf_gsm_a_8_psk_rf_power_capability_2 = -1; +static int hf_gsm_a_gsm_400_band_info_present = -1; +static int hf_gsm_a_gsm_400_bands_supported = -1; +static int hf_gsm_a_gsm_400_assoc_radio_cap = -1; +static int hf_gsm_a_gsm_850_assoc_radio_cap_present = -1; +static int hf_gsm_a_gsm_850_assoc_radio_cap = -1; +static int hf_gsm_a_gsm_1900_assoc_radio_cap_present = -1; +static int hf_gsm_a_gsm_1900_assoc_radio_cap = -1; +static int hf_gsm_a_cm3_A5_bits = -1; +static int hf_gsm_a_umts_fdd_rat_cap = -1; +static int hf_gsm_a_umts_384_mcps_tdd_rat_cap = -1; +static int hf_gsm_a_cdma_2000_rat_cap = -1; +static int hf_gsm_a_dtm_e_gprs_multi_slot_info_present = -1; +static int hf_gsm_a_dtm_gprs_multi_slot_class = -1; +static int hf_gsm_a_single_slot_dtm = -1; +static int hf_gsm_a_dtm_egprs_multi_slot_class_present = -1; +static int hf_gsm_a_dtm_egprs_multi_slot_class = -1; +static int hf_gsm_a_single_band_support = -1; +static int hf_gsm_a_gsm_band = -1; +static int hf_gsm_a_gsm_750_assoc_radio_cap_present = -1; +static int hf_gsm_a_gsm_750_assoc_radio_cap = -1; +static int hf_gsm_a_umts_128_mcps_tdd_rat_cap = -1; +static int hf_gsm_a_geran_feature_package_1 = -1; +static int hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present = -1; +static int hf_gsm_a_ext_dtm_gprs_multi_slot_class = -1; +static int hf_gsm_a_ext_dtm_egprs_multi_slot_class = -1; +static int hf_gsm_a_high_multislot_cap_present = -1; +static int hf_gsm_a_high_multislot_cap = -1; +static int hf_gsm_a_geran_iu_mode_support = -1; +static int hf_gsm_a_geran_iu_mode_cap = -1; +static int hf_gsm_a_geran_iu_mode_cap_length = -1; +static int hf_gsm_a_flo_iu_cap = -1; +static int hf_gsm_a_geran_feature_package_2 = -1; +static int hf_gsm_a_gmsk_multislot_power_prof = -1; +static int hf_gsm_a_8_psk_multislot_power_prof = -1; +static int hf_gsm_a_t_gsm_400_band_info_present = -1; +static int hf_gsm_a_t_gsm_400_bands_supported = -1; +static int hf_gsm_a_t_gsm_400_assoc_radio_cap = -1; +static int hf_gsm_a_t_gsm_900_assoc_radio_cap_present = -1; +static int hf_gsm_a_t_gsm_900_assoc_radio_cap = -1; +static int hf_gsm_a_downlink_adv_receiver_perf = -1; +static int hf_gsm_a_dtm_enhancements_cap = -1; +static int hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present = -1; +static int hf_gsm_a_dtm_gprs_high_multi_slot_class = -1; +static int hf_gsm_a_offset_required = -1; +static int hf_gsm_a_dtm_egprs_high_multi_slot_class_present = -1; +static int hf_gsm_a_dtm_egprs_high_multi_slot_class = -1; +static int hf_gsm_a_repeated_acch_cap = -1; +static int hf_gsm_a_gsm_710_assoc_radio_cap_present = -1; +static int hf_gsm_a_gsm_710_assoc_radio_cap = -1; +static int hf_gsm_a_t_gsm_810_assoc_radio_cap_present = -1; +static int hf_gsm_a_t_gsm_810_assoc_radio_cap = -1; +static int hf_gsm_a_ciphering_mode_setting_cap = -1; +static int hf_gsm_a_additional_positioning_caps = -1; +static int hf_gsm_a_e_utra_fdd_support = -1; +static int hf_gsm_a_e_utra_tdd_support = -1; +static int hf_gsm_a_e_utra_meas_and_report_support = -1; static int hf_gsm_a_prio_based_resel_support = -1; static int hf_gsm_a_utra_csg_cells_reporting = -1; static int hf_gsm_a_vamos_level = -1; static int hf_gsm_a_geo_loc_type_of_shape = -1; -static int hf_gsm_a_geo_loc_sign_of_lat = -1; +static int hf_gsm_a_geo_loc_sign_of_lat = -1; static int hf_gsm_a_geo_loc_deg_of_lat =-1; static int hf_gsm_a_geo_loc_deg_of_long =-1; static int hf_gsm_a_geo_loc_uncertainty_code = -1; @@ -675,7 +674,7 @@ static char a_bigbuf[1024]; sccp_msg_info_t* sccp_msg; sccp_assoc_info_t* sccp_assoc; -#define NUM_GSM_COMMON_ELEM (sizeof(gsm_common_elem_strings)/sizeof(value_string)) +#define NUM_GSM_COMMON_ELEM (sizeof(gsm_common_elem_strings)/sizeof(value_string)) gint ett_gsm_common_elem[NUM_GSM_COMMON_ELEM]; @@ -700,195 +699,194 @@ other values reserved for future use /* TS 23 032 Table 2a: Coding of Type of Shape */ static const value_string type_of_shape_vals[] = { - { ELLIPSOID_POINT, "Ellipsoid Point"}, - { ELLIPSOID_POINT_WITH_UNCERT_CIRC, "Ellipsoid point with uncertainty Circle"}, - { ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE, "Ellipsoid point with uncertainty Ellipse"}, - { POLYGON, "Polygon"}, - { ELLIPSOID_POINT_WITH_ALT, "Ellipsoid point with altitude"}, - { ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID, "Ellipsoid point with altitude and uncertainty Ellipsoid"}, - { ELLIPSOID_ARC, "Ellipsoid Arc"}, - { 0, NULL } + { ELLIPSOID_POINT, "Ellipsoid Point"}, + { ELLIPSOID_POINT_WITH_UNCERT_CIRC, "Ellipsoid point with uncertainty Circle"}, + { ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE, "Ellipsoid point with uncertainty Ellipse"}, + { POLYGON, "Polygon"}, + { ELLIPSOID_POINT_WITH_ALT, "Ellipsoid point with altitude"}, + { ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID, "Ellipsoid point with altitude and uncertainty Ellipsoid"}, + { ELLIPSOID_ARC, "Ellipsoid Arc"}, + { 0, NULL } }; /* 3GPP TS 23.032 7.3.1 */ static const value_string sign_of_latitude_vals[] = { - { 0, "North"}, - { 1, "South"}, - { 0, NULL } + { 0, "North"}, + { 1, "South"}, + { 0, NULL } }; static const value_string dir_of_alt_vals[] = { - { 0, "Altitude expresses height"}, - { 1, "Altitude expresses depth"}, - { 0, NULL } + { 0, "Altitude expresses height"}, + { 1, "Altitude expresses depth"}, + { 0, NULL } }; void -dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree){ - - proto_item *lat_item, *long_item, *major_item, *minor_item, *alt_item, *uncer_item; - /*proto_tree *subtree; */ - - guint8 type_of_shape; - /*guint8 no_of_points;*/ - int offset = 0; - int length; - guint8 value; - guint32 value32; - - /*subtree = proto_item_add_subtree(item, ett_gsm_a_geo_desc);*/ - - length = tvb_reported_length_remaining(tvb,0); - /* Geographical Location - * The Location Estimate field is composed of 1 or more octets with an internal structure - * according to section 7 in [23.032]. - */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_type_of_shape, tvb, 0, 1, ENC_BIG_ENDIAN); - if (length<2) - return; - type_of_shape = tvb_get_guint8(tvb,offset)>>4; - switch (type_of_shape){ - case ELLIPSOID_POINT: - /* Ellipsoid Point */ - case ELLIPSOID_POINT_WITH_UNCERT_CIRC: - /* Ellipsoid Point with uncertainty Circle */ - case ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE: - /* Ellipsoid Point with uncertainty Ellipse */ - case ELLIPSOID_POINT_WITH_ALT: - /* Ellipsoid Point with Altitude */ - case ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID: - /* Ellipsoid Point with altitude and uncertainty ellipsoid */ - case ELLIPSOID_ARC: - /* Ellipsoid Arc */ - offset++; - if (length<4) - return; - proto_tree_add_item(tree, hf_gsm_a_geo_loc_sign_of_lat, tvb, offset, 1, ENC_BIG_ENDIAN); - - value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; - /* convert degrees (X/0x7fffff) * 90 = degrees */ - lat_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_deg_of_lat, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_item_append_text(lat_item,"(%.5f degrees)", (((double)value32/8388607) * 90)); - if (length<7) - return; - offset = offset + 3; - value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; - long_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_deg_of_long, tvb, offset, 3, ENC_BIG_ENDIAN); - /* (X/0xffffff) *360 = degrees */ - proto_item_append_text(long_item,"(%.5f degrees)", (((double)value32/16777215) * 360)); - offset = offset + 3; - if(type_of_shape==ELLIPSOID_POINT_WITH_UNCERT_CIRC){ - /* Ellipsoid Point with uncertainty Circle */ - if (length<8) - return; - /* Uncertainty code */ - value = tvb_get_guint8(tvb,offset)&0x7f; - uncer_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_code, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(uncer_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); - }else if(type_of_shape==ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE){ - /* Ellipsoid Point with uncertainty Ellipse */ - /* Uncertainty semi-major octet 10 - * To convert to metres 10*(((1.1)^X)-1) - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - major_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_major, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(major_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); - offset++; - /* Uncertainty semi-minor Octet 11 - * To convert to metres 10*(((1.1)^X)-1) - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - minor_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_minor, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(minor_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); - offset++; - /* Orientation of major axis octet 12 - * allowed value from 0-179 to convert - * to actual degrees multiply by 2. - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - proto_tree_add_uint(tree, hf_gsm_a_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); - offset++; - /* Confidence */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - }else if(type_of_shape==ELLIPSOID_POINT_WITH_ALT){ - /* Ellipsoid Point with Altitude */ - /*D: Direction of Altitude */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_D, tvb, offset, 1, ENC_BIG_ENDIAN); - /* Altitude */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_altitude, tvb, offset, 2, ENC_BIG_ENDIAN); - }else if(type_of_shape==ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID){ - /* Ellipsoid Point with altitude and uncertainty ellipsoid */ - /*D: Direction of Altitude octet 8,9 */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_D, tvb, offset, 1, ENC_BIG_ENDIAN); - /* Altitude Octet 8,9*/ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_altitude, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset +2; - /* Uncertainty semi-major octet 10 - * To convert to metres 10*(((1.1)^X)-1) - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - major_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_major, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(major_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); - offset++; - /* Uncertainty semi-minor Octet 11 - * To convert to metres 10*(((1.1)^X)-1) - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - minor_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_minor, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(minor_item,"(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); - offset++; - /* Orientation of major axis octet 12 - * allowed value from 0-179 to convert - * to actual degrees multiply by 2. - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - proto_tree_add_uint(tree, hf_gsm_a_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); - offset++; - /* Uncertainty Altitude 13 - * to convert to metres 45*(((1.025)^X)-1) - */ - value = tvb_get_guint8(tvb,offset)&0x7f; - alt_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_altitude, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(alt_item,"(%.1f m)", 45 * (pow(1.025, (double)value) - 1)); - offset++; - /* Confidence octet 14 - */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); - }else if(type_of_shape==ELLIPSOID_ARC){ - /* Ellipsoid Arc */ - /* Inner radius */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_inner_radius, tvb, offset, 2, ENC_BIG_ENDIAN); - offset= offset +2; - /* Uncertainty radius */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_radius, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - /* Offset angle */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_offset_angle, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - /* Included angle */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_included_angle, tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - /* Confidence */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); - } - - break; - case POLYGON: /* Polygon */ - /* Number of points */ - proto_tree_add_item(tree, hf_gsm_a_geo_loc_no_of_points, tvb, offset, 1, ENC_BIG_ENDIAN); +dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) { + + proto_item *lat_item, *long_item, *major_item, *minor_item, *alt_item, *uncer_item; + /*proto_tree *subtree; */ + guint8 type_of_shape; + /*guint8 no_of_points;*/ + int offset = 0; + int length; + guint8 value; + guint32 value32; + + /*subtree = proto_item_add_subtree(item, ett_gsm_a_geo_desc);*/ + + length = tvb_reported_length_remaining(tvb, 0); + /* Geographical Location + * The Location Estimate field is composed of 1 or more octets with an internal structure + * according to section 7 in [23.032]. + */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_type_of_shape, tvb, 0, 1, ENC_BIG_ENDIAN); + if (length < 2) + return; + type_of_shape = tvb_get_guint8(tvb,offset)>>4; + switch (type_of_shape) { + case ELLIPSOID_POINT: + /* Ellipsoid Point */ + case ELLIPSOID_POINT_WITH_UNCERT_CIRC: + /* Ellipsoid Point with uncertainty Circle */ + case ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE: + /* Ellipsoid Point with uncertainty Ellipse */ + case ELLIPSOID_POINT_WITH_ALT: + /* Ellipsoid Point with Altitude */ + case ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID: + /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + case ELLIPSOID_ARC: + /* Ellipsoid Arc */ + offset++; + if (length < 4) + return; + proto_tree_add_item(tree, hf_gsm_a_geo_loc_sign_of_lat, tvb, offset, 1, ENC_BIG_ENDIAN); + + value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; + /* convert degrees (X/0x7fffff) * 90 = degrees */ + lat_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_deg_of_lat, tvb, offset, 3, ENC_BIG_ENDIAN); + proto_item_append_text(lat_item, "(%.5f degrees)", (((double)value32/8388607) * 90)); + if (length < 7) + return; + offset = offset + 3; + value32 = tvb_get_ntoh24(tvb,offset)&0x7fffff; + long_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_deg_of_long, tvb, offset, 3, ENC_BIG_ENDIAN); + /* (X/0xffffff) *360 = degrees */ + proto_item_append_text(long_item, "(%.5f degrees)", (((double)value32/16777215) * 360)); + offset = offset + 3; + if (type_of_shape == ELLIPSOID_POINT_WITH_UNCERT_CIRC) { + /* Ellipsoid Point with uncertainty Circle */ + if (length < 8) + return; + /* Uncertainty code */ + value = tvb_get_guint8(tvb,offset)&0x7f; + uncer_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_code, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(uncer_item, "(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); + }else if (type_of_shape == ELLIPSOID_POINT_WITH_UNCERT_ELLIPSE) { + /* Ellipsoid Point with uncertainty Ellipse */ + /* Uncertainty semi-major octet 10 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset) & 0x7f; + major_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_major, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(major_item, "(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); + offset++; + /* Uncertainty semi-minor Octet 11 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + minor_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_minor, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(minor_item, "(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); + offset++; + /* Orientation of major axis octet 12 + * allowed value from 0-179 to convert + * to actual degrees multiply by 2. + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + proto_tree_add_uint(tree, hf_gsm_a_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + }else if (type_of_shape == ELLIPSOID_POINT_WITH_ALT) { + /* Ellipsoid Point with Altitude */ + /*D: Direction of Altitude */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_D, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Altitude */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_altitude, tvb, offset, 2, ENC_BIG_ENDIAN); + }else if (type_of_shape == ELLIPSOID_POINT_WITH_ALT_AND_UNCERT_ELLIPSOID) { + /* Ellipsoid Point with altitude and uncertainty ellipsoid */ + /*D: Direction of Altitude octet 8,9 */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_D, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Altitude Octet 8,9*/ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_altitude, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset +2; + /* Uncertainty semi-major octet 10 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + major_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_major, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(major_item, "(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); + offset++; + /* Uncertainty semi-minor Octet 11 + * To convert to metres 10*(((1.1)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + minor_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_semi_minor, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(minor_item, "(%.1f m)", 10 * (pow(1.1, (double)value) - 1)); + offset++; + /* Orientation of major axis octet 12 + * allowed value from 0-179 to convert + * to actual degrees multiply by 2. + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + proto_tree_add_uint(tree, hf_gsm_a_geo_loc_orientation_of_major_axis, tvb, offset, 1, value*2); + offset++; + /* Uncertainty Altitude 13 + * to convert to metres 45*(((1.025)^X)-1) + */ + value = tvb_get_guint8(tvb,offset)&0x7f; + alt_item = proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_altitude, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(alt_item, "(%.1f m)", 45 * (pow(1.025, (double)value) - 1)); + offset++; + /* Confidence octet 14 + */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); + }else if (type_of_shape == ELLIPSOID_ARC) { + /* Ellipsoid Arc */ + /* Inner radius */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_inner_radius, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + /* Uncertainty radius */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_uncertainty_radius, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Offset angle */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_offset_angle, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Included angle */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_included_angle, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Confidence */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_confidence, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + break; + case POLYGON: /* Polygon */ + /* Number of points */ + proto_tree_add_item(tree, hf_gsm_a_geo_loc_no_of_points, tvb, offset, 1, ENC_BIG_ENDIAN); #if 0 - no_of_points = tvb_get_guint8(tvb,offset)&0x0f; - while ( no_of_points > 0){ - offset++; + no_of_points = tvb_get_guint8(tvb,offset)&0x0f; + while ( no_of_points > 0) { + offset++; - no_of_points--; - } + no_of_points--; + } #endif - break; - default: - break; - } + break; + default: + break; + } } @@ -897,23 +895,23 @@ dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr */ /* 8.6 Coding of Velocity Type */ static const value_string gsm_a_velocity_type_vals[] = { - { 0, "Horizontal Velocity"}, - { 1, "Horizontal with Vertical Velocity"}, - { 2, "Horizontal Velocity with Uncertainty"}, - { 3, "Horizontal with Vertical Velocity and Uncertainty"}, - { 4, "reserved for future use"}, - { 5, "reserved for future use"}, - { 6, "reserved for future use"}, - { 7, "reserved for future use"}, - { 8, "reserved for future use"}, - { 9, "reserved for future use"}, - { 10, "reserved for future use"}, - { 11, "reserved for future use"}, - { 12, "reserved for future use"}, - { 13, "reserved for future use"}, - { 14, "reserved for future use"}, - { 15, "reserved for future use"}, - { 0, NULL } + { 0, "Horizontal Velocity"}, + { 1, "Horizontal with Vertical Velocity"}, + { 2, "Horizontal Velocity with Uncertainty"}, + { 3, "Horizontal with Vertical Velocity and Uncertainty"}, + { 4, "reserved for future use"}, + { 5, "reserved for future use"}, + { 6, "reserved for future use"}, + { 7, "reserved for future use"}, + { 8, "reserved for future use"}, + { 9, "reserved for future use"}, + { 10, "reserved for future use"}, + { 11, "reserved for future use"}, + { 12, "reserved for future use"}, + { 13, "reserved for future use"}, + { 14, "reserved for future use"}, + { 15, "reserved for future use"}, + { 0, NULL } }; static const true_false_string gsm_a_dir_of_ver_speed_vals = { @@ -924,232 +922,232 @@ static const true_false_string gsm_a_dir_of_ver_speed_vals = { guint16 dissect_description_of_velocity(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - proto_item *velocity_item; - guint32 curr_offset; - guint8 velocity_type, uncertainty_speed=0; - - curr_offset = offset; - - /* Bit 8 - 5 Velocity Type */ - velocity_type = tvb_get_guint8(tvb,curr_offset); - proto_tree_add_item(tree, hf_gsm_a_velocity_type, tvb, offset, 1, ENC_BIG_ENDIAN); - curr_offset++; - - switch(velocity_type){ - case 0: - /* 8.12 Coding of Horizontal Velocity */ - /* Spare bits */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 3, ENC_BIG_ENDIAN); - /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ - proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); - curr_offset+=2; - /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset+=2; - break; - case 1: - /* 8.13 Coding of Horizontal with Vertical Velocity */ - /* Spare bits */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); - /* D: Direction of Vertical Speed */ - proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); - /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ - proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); - curr_offset+=2; - /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset+=2; - /* Vertical Speed Octet 5 - * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. - */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset++; - break; - case 2: - /* 8.14 Coding of Horizontal Velocity with Uncertainty */ - /* Spare bits */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 3, ENC_BIG_ENDIAN); - /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ - proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); - curr_offset+=2; - /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset+=2; - /* Uncertainty Speed Octet 5 - * Uncertainty speed is encoded in increments of 1 kilometre per hour using an 8 bit binary coded number N. The value of - * N gives the uncertainty speed except for N=255 which indicates that the uncertainty is not specified. - */ - uncertainty_speed = tvb_get_guint8(tvb,curr_offset); - velocity_item = proto_tree_add_item(tree, hf_gsm_a_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - if(uncertainty_speed==255){ - proto_item_append_text(velocity_item," not specified"); - }else{ - proto_item_append_text(velocity_item," km/h"); - } - offset++; - break; - case 3: - /* 8.15 Coding of Horizontal with Vertical Velocity and Uncertainty */ - /* Spare bits */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); - /* D: Direction of Vertical Speed */ - proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); - /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ - proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); - curr_offset+=2; - /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset+=2; - /* Vertical Speed Octet 5 - * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. - */ - velocity_item = proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(velocity_item," km/h"); - curr_offset++; - - /* Horizontal Uncertainty Speed Octet 6 */ - uncertainty_speed = tvb_get_guint8(tvb,curr_offset); - velocity_item = proto_tree_add_item(tree, hf_gsm_a_h_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - if(uncertainty_speed==255){ - proto_item_append_text(velocity_item," not specified"); - }else{ - proto_item_append_text(velocity_item," km/h"); - } - offset++; - - /* Vertical Uncertainty Speed Octet 7 */ - uncertainty_speed = tvb_get_guint8(tvb,curr_offset); - velocity_item = proto_tree_add_item(tree, hf_gsm_a_v_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); - if(uncertainty_speed==255){ - proto_item_append_text(velocity_item," not specified"); - }else{ - proto_item_append_text(velocity_item," km/h"); - } - offset++; - - break; - default: - break; - } - - return(curr_offset-offset); + proto_item *velocity_item; + guint32 curr_offset; + guint8 velocity_type, uncertainty_speed = 0; + + curr_offset = offset; + + /* Bit 8 - 5 Velocity Type */ + velocity_type = tvb_get_guint8(tvb,curr_offset); + proto_tree_add_item(tree, hf_gsm_a_velocity_type, tvb, offset, 1, ENC_BIG_ENDIAN); + curr_offset++; + + switch (velocity_type) { + case 0: + /* 8.12 Coding of Horizontal Velocity */ + /* Spare bits */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 3, ENC_BIG_ENDIAN); + /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ + proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); + curr_offset += 2; + /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset += 2; + break; + case 1: + /* 8.13 Coding of Horizontal with Vertical Velocity */ + /* Spare bits */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); + /* D: Direction of Vertical Speed */ + proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ + proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); + curr_offset += 2; + /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset += 2; + /* Vertical Speed Octet 5 + * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. + */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset++; + break; + case 2: + /* 8.14 Coding of Horizontal Velocity with Uncertainty */ + /* Spare bits */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 3, ENC_BIG_ENDIAN); + /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ + proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); + curr_offset += 2; + /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset += 2; + /* Uncertainty Speed Octet 5 + * Uncertainty speed is encoded in increments of 1 kilometre per hour using an 8 bit binary coded number N. The value of + * N gives the uncertainty speed except for N=255 which indicates that the uncertainty is not specified. + */ + uncertainty_speed = tvb_get_guint8(tvb,curr_offset); + velocity_item = proto_tree_add_item(tree, hf_gsm_a_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + if (uncertainty_speed == 255) { + proto_item_append_text(velocity_item, " not specified"); + }else{ + proto_item_append_text(velocity_item, " km/h"); + } + offset++; + break; + case 3: + /* 8.15 Coding of Horizontal with Vertical Velocity and Uncertainty */ + /* Spare bits */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 2, ENC_BIG_ENDIAN); + /* D: Direction of Vertical Speed */ + proto_tree_add_item(tree, hf_gsm_a_d, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Bearing is encoded in increments of 1 degree measured clockwise from North using a 9 bit binary coded number N. */ + proto_tree_add_bits_item(tree, hf_gsm_a_bearing, tvb, (curr_offset<<3)+7, 9, ENC_BIG_ENDIAN); + curr_offset += 2; + /* Horizontal speed is encoded in increments of 1 kilometre per hour using a 16 bit binary coded number N. */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_horizontal_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset += 2; + /* Vertical Speed Octet 5 + * Vertical speed is encoded in increments of 1 kilometre per hour using 8 bits giving a number N between 0 and 28-1. + */ + velocity_item = proto_tree_add_item(tree, hf_gsm_a_vertical_speed, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(velocity_item, " km/h"); + curr_offset++; + + /* Horizontal Uncertainty Speed Octet 6 */ + uncertainty_speed = tvb_get_guint8(tvb,curr_offset); + velocity_item = proto_tree_add_item(tree, hf_gsm_a_h_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + if (uncertainty_speed == 255) { + proto_item_append_text(velocity_item, " not specified"); + }else{ + proto_item_append_text(velocity_item, " km/h"); + } + offset++; + + /* Vertical Uncertainty Speed Octet 7 */ + uncertainty_speed = tvb_get_guint8(tvb,curr_offset); + velocity_item = proto_tree_add_item(tree, hf_gsm_a_v_uncertainty_speed, tvb, offset, 2, ENC_BIG_ENDIAN); + if (uncertainty_speed == 255) { + proto_item_append_text(velocity_item, " not specified"); + }else{ + proto_item_append_text(velocity_item, " km/h"); + } + offset++; + + break; + default: + break; + } + + return(curr_offset-offset); } const char* get_gsm_a_msg_string(int pdu_type, int idx) { - const char *msg_string=NULL; - - switch (pdu_type) { - case GSM_A_PDU_TYPE_BSSMAP: - msg_string = gsm_bssmap_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_DTAP: - msg_string = gsm_dtap_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_RP: - msg_string = gsm_rp_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_RR: - msg_string = gsm_rr_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_COMMON: - msg_string = gsm_common_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_GM: - msg_string = gsm_gm_elem_strings[idx].strptr; - break; - case GSM_A_PDU_TYPE_BSSLAP: - msg_string = gsm_bsslap_elem_strings[idx].strptr; - break; - case GSM_PDU_TYPE_BSSMAP_LE: - msg_string = gsm_bssmap_le_elem_strings[idx].strptr; - break; - case NAS_PDU_TYPE_COMMON: - msg_string = nas_eps_common_elem_strings[idx].strptr; - break; - case NAS_PDU_TYPE_EMM: - msg_string = nas_emm_elem_strings[idx].strptr; - break; - case NAS_PDU_TYPE_ESM: - msg_string = nas_esm_elem_strings[idx].strptr; - break; - case SGSAP_PDU_TYPE: - msg_string = sgsap_elem_strings[idx].strptr; - break; - case BSSGP_PDU_TYPE: - msg_string = bssgp_elem_strings[idx].strptr; - break; - case GMR1_IE_COMMON: - msg_string = gmr1_ie_common_strings[idx].strptr; - break; - case GMR1_IE_RR: - msg_string = gmr1_ie_rr_strings[idx].strptr; - break; - default: - DISSECTOR_ASSERT_NOT_REACHED(); - } - - return msg_string; + const char *msg_string = NULL; + + switch (pdu_type) { + case GSM_A_PDU_TYPE_BSSMAP: + msg_string = gsm_bssmap_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_DTAP: + msg_string = gsm_dtap_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_RP: + msg_string = gsm_rp_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_RR: + msg_string = gsm_rr_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_COMMON: + msg_string = gsm_common_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_GM: + msg_string = gsm_gm_elem_strings[idx].strptr; + break; + case GSM_A_PDU_TYPE_BSSLAP: + msg_string = gsm_bsslap_elem_strings[idx].strptr; + break; + case GSM_PDU_TYPE_BSSMAP_LE: + msg_string = gsm_bssmap_le_elem_strings[idx].strptr; + break; + case NAS_PDU_TYPE_COMMON: + msg_string = nas_eps_common_elem_strings[idx].strptr; + break; + case NAS_PDU_TYPE_EMM: + msg_string = nas_emm_elem_strings[idx].strptr; + break; + case NAS_PDU_TYPE_ESM: + msg_string = nas_esm_elem_strings[idx].strptr; + break; + case SGSAP_PDU_TYPE: + msg_string = sgsap_elem_strings[idx].strptr; + break; + case BSSGP_PDU_TYPE: + msg_string = bssgp_elem_strings[idx].strptr; + break; + case GMR1_IE_COMMON: + msg_string = gmr1_ie_common_strings[idx].strptr; + break; + case GMR1_IE_RR: + msg_string = gmr1_ie_rr_strings[idx].strptr; + break; + default: + DISSECTOR_ASSERT_NOT_REACHED(); + } + + return msg_string; } static int get_hf_elem_id(int pdu_type) { - int hf_elem_id = 0; - - switch (pdu_type) { - case GSM_A_PDU_TYPE_BSSMAP: - hf_elem_id = hf_gsm_a_bssmap_elem_id; - break; - case GSM_A_PDU_TYPE_DTAP: - hf_elem_id = hf_gsm_a_dtap_elem_id; - break; - case GSM_A_PDU_TYPE_RP: - hf_elem_id = hf_gsm_a_rp_elem_id; - break; - case GSM_A_PDU_TYPE_RR: - hf_elem_id = hf_gsm_a_rr_elem_id; - break; - case GSM_A_PDU_TYPE_COMMON: - hf_elem_id = hf_gsm_a_common_elem_id; - break; - case GSM_A_PDU_TYPE_GM: - hf_elem_id = hf_gsm_a_gm_elem_id; - break; - case GSM_A_PDU_TYPE_BSSLAP: - hf_elem_id = hf_gsm_a_bsslap_elem_id; - break; - case GSM_PDU_TYPE_BSSMAP_LE: - hf_elem_id = hf_gsm_bssmap_le_elem_id; - break; - case NAS_PDU_TYPE_COMMON: - hf_elem_id = hf_nas_eps_common_elem_id; - break; - case NAS_PDU_TYPE_EMM: - hf_elem_id = hf_nas_eps_emm_elem_id; - break; - case NAS_PDU_TYPE_ESM: - hf_elem_id = hf_nas_eps_esm_elem_id; - break; - case SGSAP_PDU_TYPE: - hf_elem_id = hf_sgsap_elem_id; - break; - case BSSGP_PDU_TYPE: - hf_elem_id = hf_bssgp_elem_id; - break; - case GMR1_IE_COMMON: - case GMR1_IE_RR: - hf_elem_id = hf_gmr1_elem_id; - break; - default: - DISSECTOR_ASSERT_NOT_REACHED(); - } - - return hf_elem_id; + int hf_elem_id = 0; + + switch (pdu_type) { + case GSM_A_PDU_TYPE_BSSMAP: + hf_elem_id = hf_gsm_a_bssmap_elem_id; + break; + case GSM_A_PDU_TYPE_DTAP: + hf_elem_id = hf_gsm_a_dtap_elem_id; + break; + case GSM_A_PDU_TYPE_RP: + hf_elem_id = hf_gsm_a_rp_elem_id; + break; + case GSM_A_PDU_TYPE_RR: + hf_elem_id = hf_gsm_a_rr_elem_id; + break; + case GSM_A_PDU_TYPE_COMMON: + hf_elem_id = hf_gsm_a_common_elem_id; + break; + case GSM_A_PDU_TYPE_GM: + hf_elem_id = hf_gsm_a_gm_elem_id; + break; + case GSM_A_PDU_TYPE_BSSLAP: + hf_elem_id = hf_gsm_a_bsslap_elem_id; + break; + case GSM_PDU_TYPE_BSSMAP_LE: + hf_elem_id = hf_gsm_bssmap_le_elem_id; + break; + case NAS_PDU_TYPE_COMMON: + hf_elem_id = hf_nas_eps_common_elem_id; + break; + case NAS_PDU_TYPE_EMM: + hf_elem_id = hf_nas_eps_emm_elem_id; + break; + case NAS_PDU_TYPE_ESM: + hf_elem_id = hf_nas_eps_esm_elem_id; + break; + case SGSAP_PDU_TYPE: + hf_elem_id = hf_sgsap_elem_id; + break; + case BSSGP_PDU_TYPE: + hf_elem_id = hf_bssgp_elem_id; + break; + case GMR1_IE_COMMON: + case GMR1_IE_RR: + hf_elem_id = hf_gmr1_elem_id; + break; + default: + DISSECTOR_ASSERT_NOT_REACHED(); + } + + return hf_elem_id; } /* @@ -1157,74 +1155,74 @@ static int get_hf_elem_id(int pdu_type) */ guint16 elem_tlv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len _U_, const gchar *name_add) { - guint8 oct; - guint16 parm_len; - guint8 lengt_length = 1; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - oct = tvb_get_guint8(tvb, curr_offset); - - if (oct == iei){ - parm_len = tvb_get_guint8(tvb, curr_offset + 1); - - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1 + lengt_length, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, - get_hf_elem_id(pdu_type), tvb, - curr_offset, 1, oct); - - proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, - curr_offset + 1, lengt_length, parm_len); - - if (parm_len > 0) - { - if (elem_funcs[idx] == NULL) - { - proto_tree_add_text(subtree, - tvb, curr_offset + 1 + lengt_length, parm_len, - "Element Value"); - /* See ASSERT above */ - consumed = (guint8)parm_len; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = - (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 2, - parm_len, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - } - - consumed += 1 + lengt_length; - } - - return(consumed); + guint8 oct; + guint16 parm_len; + guint8 lengt_length = 1; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + oct = tvb_get_guint8(tvb, curr_offset); + + if (oct == iei) { + parm_len = tvb_get_guint8(tvb, curr_offset + 1); + + item = + proto_tree_add_text(tree, + tvb, curr_offset, parm_len + 1 + lengt_length, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, + get_hf_elem_id(pdu_type), tvb, + curr_offset, 1, oct); + + proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, + curr_offset + 1, lengt_length, parm_len); + + if (parm_len > 0) + { + if (elem_funcs[idx] == NULL) + { + proto_tree_add_text(subtree, + tvb, curr_offset + 1 + lengt_length, parm_len, + "Element Value"); + /* See ASSERT above */ + consumed = (guint8)parm_len; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = + (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 2, + parm_len, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + } + + consumed += 1 + lengt_length; + } + + return(consumed); } /* @@ -1237,83 +1235,83 @@ guint16 elem_tlv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei */ guint16 elem_telv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len _U_, const gchar *name_add) { - guint8 oct; - guint16 parm_len; - guint8 lengt_length = 1; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - oct = tvb_get_guint8(tvb, curr_offset); - - if (oct == iei){ - parm_len = tvb_get_guint8(tvb, curr_offset + 1); - if((parm_len&0x80)==0){ - /* length in 2 octets */ - parm_len = tvb_get_ntohs(tvb, curr_offset + 1); - lengt_length = 2; - }else{ - parm_len = parm_len & 0x7f; - } - - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1 + lengt_length, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, - get_hf_elem_id(pdu_type), tvb, - curr_offset, 1, oct); - - proto_tree_add_item(subtree, hf_gsm_a_l_ext, tvb, curr_offset+1, 1, ENC_BIG_ENDIAN); - - proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, - curr_offset + 1, lengt_length, parm_len); - - if (parm_len > 0) - { - if (elem_funcs[idx] == NULL) - { - proto_tree_add_text(subtree, - tvb, curr_offset + 1 + lengt_length, parm_len, - "Element Value"); - /* See ASSERT above */ - consumed = parm_len; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = - (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1 + lengt_length, - parm_len, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - } - - consumed += 1 + lengt_length; - } - - return(consumed); + guint8 oct; + guint16 parm_len; + guint8 lengt_length = 1; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + oct = tvb_get_guint8(tvb, curr_offset); + + if (oct == iei) { + parm_len = tvb_get_guint8(tvb, curr_offset + 1); + if ((parm_len&0x80) == 0) { + /* length in 2 octets */ + parm_len = tvb_get_ntohs(tvb, curr_offset + 1); + lengt_length = 2; + }else{ + parm_len = parm_len & 0x7f; + } + + item = + proto_tree_add_text(tree, + tvb, curr_offset, parm_len + 1 + lengt_length, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, + get_hf_elem_id(pdu_type), tvb, + curr_offset, 1, oct); + + proto_tree_add_item(subtree, hf_gsm_a_l_ext, tvb, curr_offset+1, 1, ENC_BIG_ENDIAN); + + proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, + curr_offset + 1, lengt_length, parm_len); + + if (parm_len > 0) + { + if (elem_funcs[idx] == NULL) + { + proto_tree_add_text(subtree, + tvb, curr_offset + 1 + lengt_length, parm_len, + "Element Value"); + /* See ASSERT above */ + consumed = parm_len; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = + (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1 + lengt_length, + parm_len, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + } + + consumed += 1 + lengt_length; + } + + return(consumed); } /* @@ -1324,71 +1322,71 @@ guint16 elem_telv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 ie */ guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, guint len _U_, const gchar *name_add) { - guint8 oct; - guint16 parm_len; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - oct = tvb_get_guint8(tvb, curr_offset); - - if (oct == iei){ - parm_len = tvb_get_ntohs(tvb, curr_offset + 1); - - item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 1 + 2, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, - get_hf_elem_id(pdu_type), tvb, - curr_offset, 1, oct); - - proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, - curr_offset + 1, 2, parm_len); - - if (parm_len > 0) - { - if (elem_funcs[idx] == NULL) - { - proto_tree_add_text(subtree, - tvb, curr_offset + 1 + 2, parm_len, - "Element Value"); - /* See ASSERT above */ - consumed = parm_len; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = - (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1 + 2, - parm_len, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - } - - consumed += 1 + 2; - } - - return(consumed); + guint8 oct; + guint16 parm_len; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + oct = tvb_get_guint8(tvb, curr_offset); + + if (oct == iei) { + parm_len = tvb_get_ntohs(tvb, curr_offset + 1); + + item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 1 + 2, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, + get_hf_elem_id(pdu_type), tvb, + curr_offset, 1, oct); + + proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, + curr_offset + 1, 2, parm_len); + + if (parm_len > 0) + { + if (elem_funcs[idx] == NULL) + { + proto_tree_add_text(subtree, + tvb, curr_offset + 1 + 2, parm_len, + "Element Value"); + /* See ASSERT above */ + consumed = parm_len; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = + (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1 + 2, + parm_len, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + } + + consumed += 1 + 2; + } + + return(consumed); } /* @@ -1399,67 +1397,67 @@ guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 i */ guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add) { - guint8 oct; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - oct = tvb_get_guint8(tvb, curr_offset); - - if (oct == iei) - { - item = - proto_tree_add_text(tree, - tvb, curr_offset, -1, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, - get_hf_elem_id(pdu_type), tvb, - curr_offset, 1, oct); - - if (elem_funcs[idx] == NULL) - { - /* BAD THING, CANNOT DETERMINE LENGTH */ - - proto_tree_add_text(subtree, - tvb, curr_offset + 1, 1, - "No element dissector, rest of dissection may be incorrect"); - - consumed = 1; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1, -1, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - - consumed++; - - proto_item_set_len(item, consumed); - } - - return(consumed); + guint8 oct; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + oct = tvb_get_guint8(tvb, curr_offset); + + if (oct == iei) + { + item = + proto_tree_add_text(tree, + tvb, curr_offset, -1, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, + get_hf_elem_id(pdu_type), tvb, + curr_offset, 1, oct); + + if (elem_funcs[idx] == NULL) + { + /* BAD THING, CANNOT DETERMINE LENGTH */ + + proto_tree_add_text(subtree, + tvb, curr_offset + 1, 1, + "No element dissector, rest of dissection may be incorrect"); + + consumed = 1; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1, -1, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + + consumed++; + + proto_item_set_len(item, consumed); + } + + return(consumed); } /* @@ -1471,68 +1469,68 @@ guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, */ guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add) { - guint8 oct; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - char buf[10+1]; - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - oct = tvb_get_guint8(tvb, curr_offset); - - if ((oct & 0xf0) == (iei & 0xf0)) - { - item = - proto_tree_add_text(tree, - tvb, curr_offset, -1, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - other_decode_bitfield_value(buf, oct, 0xf0, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s = Element ID", - buf); - - if (elem_funcs[idx] == NULL) - { - /* BAD THING, CANNOT DETERMINE LENGTH */ - - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "No element dissector, rest of dissection may be incorrect"); - - consumed++; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, RIGHT_NIBBLE, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - - proto_item_set_len(item, consumed); - } - - return(consumed); + guint8 oct; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + char buf[10+1]; + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + oct = tvb_get_guint8(tvb, curr_offset); + + if ((oct & 0xf0) == (iei & 0xf0)) + { + item = + proto_tree_add_text(tree, + tvb, curr_offset, -1, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + other_decode_bitfield_value(buf, oct, 0xf0, 8); + proto_tree_add_text(subtree, + tvb, curr_offset, 1, + "%s = Element ID", + buf); + + if (elem_funcs[idx] == NULL) + { + /* BAD THING, CANNOT DETERMINE LENGTH */ + + proto_tree_add_text(subtree, + tvb, curr_offset, 1, + "No element dissector, rest of dissection may be incorrect"); + + consumed++; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, RIGHT_NIBBLE, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + + proto_item_set_len(item, consumed); + } + + return(consumed); } /* @@ -1540,33 +1538,33 @@ guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint */ guint16 elem_t(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint8 iei, gint pdu_type, int idx, guint32 offset, const gchar *name_add) { - guint8 oct; - guint32 curr_offset; - guint16 consumed; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + guint8 oct; + guint32 curr_offset; + guint16 consumed; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - curr_offset = offset; - consumed = 0; + curr_offset = offset; + consumed = 0; - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - oct = tvb_get_guint8(tvb, curr_offset); + oct = tvb_get_guint8(tvb, curr_offset); - if (oct == iei) - { - proto_tree_add_uint_format(tree, - get_hf_elem_id(pdu_type), tvb, - curr_offset, 1, oct, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + if (oct == iei) + { + proto_tree_add_uint_format(tree, + get_hf_elem_id(pdu_type), tvb, + curr_offset, 1, oct, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - consumed = 1; - } + consumed = 1; + } - return(consumed); + return(consumed); } /* @@ -1575,62 +1573,62 @@ guint16 elem_t(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint8 i guint16 elem_lv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len _U_, const gchar *name_add) { - guint8 parm_len; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - parm_len = tvb_get_guint8(tvb, curr_offset); - - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, - curr_offset, 1, parm_len); - - if (parm_len > 0) - { - if (elem_funcs[idx] == NULL) - { - proto_tree_add_text(subtree, - tvb, curr_offset + 1, parm_len, - "Element Value"); - - consumed = parm_len; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = - (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1, - parm_len, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - } - - return(consumed + 1); + guint8 parm_len; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + parm_len = tvb_get_guint8(tvb, curr_offset); + + item = + proto_tree_add_text(tree, + tvb, curr_offset, parm_len + 1, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, + curr_offset, 1, parm_len); + + if (parm_len > 0) + { + if (elem_funcs[idx] == NULL) + { + proto_tree_add_text(subtree, + tvb, curr_offset + 1, parm_len, + "Element Value"); + + consumed = parm_len; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = + (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 1, + parm_len, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + } + + return(consumed + 1); } /* @@ -1638,60 +1636,60 @@ elem_lv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int */ guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint len _U_, const gchar *name_add) { - guint16 parm_len; - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - parm_len = tvb_get_ntohs(tvb, curr_offset); - - item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 2, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, - curr_offset, 2, parm_len); - - if (parm_len > 0) - { - if (elem_funcs[idx] == NULL) - { - proto_tree_add_text(subtree, - tvb, curr_offset + 2, parm_len, - "Element Value"); - - consumed = parm_len; - } - else - { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = - (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 2, - parm_len, a_add_string, 1024); - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - } - } - - return(consumed + 2); + guint16 parm_len; + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + parm_len = tvb_get_ntohs(tvb, curr_offset); + + item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 2, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, + curr_offset, 2, parm_len); + + if (parm_len > 0) + { + if (elem_funcs[idx] == NULL) + { + proto_tree_add_text(subtree, + tvb, curr_offset + 2, parm_len, + "Element Value"); + + consumed = parm_len; + } + else + { + gchar *a_add_string; + + a_add_string = ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = + (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset + 2, + parm_len, a_add_string, 1024); + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + } + } + + return(consumed + 2); } /* * Value (V) element dissector @@ -1701,53 +1699,53 @@ guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_ */ guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, const gchar *name_add) { - guint16 consumed; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); - - curr_offset = offset; - consumed = 0; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - if (elem_funcs[idx] == NULL) - { - /* BAD THING, CANNOT DETERMINE LENGTH */ - - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "No element dissector, rest of dissection may be incorrect"); - - consumed = 1; - } - else - { - gchar *a_add_string; - - item = - proto_tree_add_text(tree, - tvb, curr_offset, 0, - "%s%s", - elem_names[idx].strptr, - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, -1, a_add_string, 1024); - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - proto_item_set_len(item, consumed); - } - - return(consumed); + guint16 consumed; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len); + + curr_offset = offset; + consumed = 0; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + if (elem_funcs[idx] == NULL) + { + /* BAD THING, CANNOT DETERMINE LENGTH */ + + proto_tree_add_text(tree, + tvb, curr_offset, 1, + "No element dissector, rest of dissection may be incorrect"); + + consumed = 1; + } + else + { + gchar *a_add_string; + + item = + proto_tree_add_text(tree, + tvb, curr_offset, 0, + "%s%s", + elem_names[idx].strptr, + (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + a_add_string= ep_alloc(1024); + a_add_string[0] = '\0'; + consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, -1, a_add_string, 1024); + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + proto_item_set_len(item, consumed); + } + + return(consumed); } /* @@ -1759,62 +1757,62 @@ guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_typ guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint32 nibble) { - guint16 consumed = 1; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const value_string *elem_names; - gint *elem_ett; - elem_fcn *elem_funcs; - gchar *a_add_string; - - curr_offset = offset; - - SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); - - item = proto_tree_add_text(tree, - tvb, curr_offset, 0, - "%s%s", - elem_names[idx].strptr, - ""); - - subtree = proto_item_add_subtree(item, elem_ett[idx]); - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - - if (elem_funcs[idx] == NULL) - { - /* NOT NECESSARILY A BAD THING - LENGTH IS HALF OCTET */ - (void)de_spare_nibble(tvb, subtree, pinfo, curr_offset, nibble, a_add_string, 1024); - } - else - { - (void)(*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, nibble, a_add_string, 1024); - } - - if (a_add_string[0] != '\0') - { - proto_item_append_text(item, "%s", a_add_string); - } - proto_item_set_len(item, consumed); - - return(consumed); + guint16 consumed = 1; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const value_string *elem_names; + gint *elem_ett; + elem_fcn *elem_funcs; + gchar *a_add_string; + + curr_offset = offset; + + SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + + item = proto_tree_add_text(tree, + tvb, curr_offset, 0, + "%s%s", + elem_names[idx].strptr, + ""); + + subtree = proto_item_add_subtree(item, elem_ett[idx]); + + a_add_string= ep_alloc(1024); + a_add_string[0] = '\0'; + + if (elem_funcs[idx] == NULL) + { + /* NOT NECESSARILY A BAD THING - LENGTH IS HALF OCTET */ + (void)de_spare_nibble(tvb, subtree, pinfo, curr_offset, nibble, a_add_string, 1024); + } + else + { + (void)(*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, nibble, a_add_string, 1024); + } + + if (a_add_string[0] != '\0') + { + proto_item_append_text(item, "%s", a_add_string); + } + proto_item_set_len(item, consumed); + + return(consumed); } static dgt_set_t Dgt_tbcd = { - { + { /* 0 1 2 3 4 5 6 7 8 9 a b c d e */ - '0','1','2','3','4','5','6','7','8','9','?','B','C','*','#' - } + '0','1','2','3','4','5','6','7','8','9','?','B','C','*','#' + } }; static dgt_set_t Dgt1_9_bcd = { - { + { /* 0 1 2 3 4 5 6 7 8 9 a b c d e */ - '0','1','2','3','4','5','6','7','8','9','?','?','?','?','?' - } + '0','1','2','3','4','5','6','7','8','9','?','?','?','?','?' + } }; /* FUNCTIONS */ @@ -1828,40 +1826,40 @@ static dgt_set_t Dgt1_9_bcd = { */ int my_dgt_tbcd_unpack( - char *out, /* ASCII pattern out */ - guchar *in, /* packed pattern in */ - int num_octs, /* Number of octets to unpack */ - dgt_set_t *dgt /* Digit definitions */ - ) + char *out, /* ASCII pattern out */ + guchar *in, /* packed pattern in */ + int num_octs, /* Number of octets to unpack */ + dgt_set_t *dgt /* Digit definitions */ + ) { - int cnt = 0; - unsigned char i; - - while (num_octs) - { - /* - * unpack first value in byte - */ - i = *in++; - *out++ = dgt->out[i & 0x0f]; - cnt++; - - /* - * unpack second value in byte - */ - i >>= 4; - - if (i == 0x0f) /* odd number bytes - hit filler */ - break; - - *out++ = dgt->out[i]; - cnt++; - num_octs--; - } - - *out = '\0'; - - return(cnt); + int cnt = 0; + unsigned char i; + + while (num_octs) + { + /* + * unpack first value in byte + */ + i = *in++; + *out++ = dgt->out[i & 0x0f]; + cnt++; + + /* + * unpack second value in byte + */ + i >>= 4; + + if (i == 0x0f) /* odd number bytes - hit filler */ + break; + + *out++ = dgt->out[i]; + cnt++; + num_octs--; + } + + *out = '\0'; + + return(cnt); } /* @@ -1870,80 +1868,80 @@ my_dgt_tbcd_unpack( static void mcc_mnc_aux(guint8 *octs, gchar *mcc, gchar *mnc) { - if ((octs[0] & 0x0f) <= 9) - { - mcc[0] = Dgt_tbcd.out[octs[0] & 0x0f]; - } - else - { - mcc[0] = (octs[0] & 0x0f) + 55; - } - - if (((octs[0] & 0xf0) >> 4) <= 9) - { - mcc[1] = Dgt_tbcd.out[(octs[0] & 0xf0) >> 4]; - } - else - { - mcc[1] = ((octs[0] & 0xf0) >> 4) + 55; - } - - if ((octs[1] & 0x0f) <= 9) - { - mcc[2] = Dgt_tbcd.out[octs[1] & 0x0f]; - } - else - { - mcc[2] = (octs[1] & 0x0f) + 55; - } - - mcc[3] = '\0'; - - if (((octs[1] & 0xf0) >> 4) <= 9) - { - mnc[2] = Dgt_tbcd.out[(octs[1] & 0xf0) >> 4]; - } - else - { - mnc[2] = ((octs[1] & 0xf0) >> 4) + 55; - } - - if ((octs[2] & 0x0f) <= 9) - { - mnc[0] = Dgt_tbcd.out[octs[2] & 0x0f]; - } - else - { - mnc[0] = (octs[2] & 0x0f) + 55; - } - - if (((octs[2] & 0xf0) >> 4) <= 9) - { - mnc[1] = Dgt_tbcd.out[(octs[2] & 0xf0) >> 4]; - } - else - { - mnc[1] = ((octs[2] & 0xf0) >> 4) + 55; - } - - if (mnc[1] == 'F') - { - /* - * only a 1 digit MNC (very old) - */ - mnc[1] = '\0'; - } - else if (mnc[2] == 'F') - { - /* - * only a 2 digit MNC - */ - mnc[2] = '\0'; - } - else - { - mnc[3] = '\0'; - } + if ((octs[0] & 0x0f) <= 9) + { + mcc[0] = Dgt_tbcd.out[octs[0] & 0x0f]; + } + else + { + mcc[0] = (octs[0] & 0x0f) + 55; + } + + if (((octs[0] & 0xf0) >> 4) <= 9) + { + mcc[1] = Dgt_tbcd.out[(octs[0] & 0xf0) >> 4]; + } + else + { + mcc[1] = ((octs[0] & 0xf0) >> 4) + 55; + } + + if ((octs[1] & 0x0f) <= 9) + { + mcc[2] = Dgt_tbcd.out[octs[1] & 0x0f]; + } + else + { + mcc[2] = (octs[1] & 0x0f) + 55; + } + + mcc[3] = '\0'; + + if (((octs[1] & 0xf0) >> 4) <= 9) + { + mnc[2] = Dgt_tbcd.out[(octs[1] & 0xf0) >> 4]; + } + else + { + mnc[2] = ((octs[1] & 0xf0) >> 4) + 55; + } + + if ((octs[2] & 0x0f) <= 9) + { + mnc[0] = Dgt_tbcd.out[octs[2] & 0x0f]; + } + else + { + mnc[0] = (octs[2] & 0x0f) + 55; + } + + if (((octs[2] & 0xf0) >> 4) <= 9) + { + mnc[1] = Dgt_tbcd.out[(octs[2] & 0xf0) >> 4]; + } + else + { + mnc[1] = ((octs[2] & 0xf0) >> 4) + 55; + } + + if (mnc[1] == 'F') + { + /* + * only a 1 digit MNC (very old) + */ + mnc[1] = '\0'; + } + else if (mnc[2] == 'F') + { + /* + * only a 2 digit MNC + */ + mnc[2] = '\0'; + } + else + { + mnc[3] = '\0'; + } } /* 3GPP TS 24.008 @@ -1952,17 +1950,17 @@ mcc_mnc_aux(guint8 *octs, gchar *mcc, gchar *mnc) guint16 de_cell_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len) { - guint32 curr_offset; + guint32 curr_offset; - curr_offset = offset; + curr_offset = offset; - curr_offset += - /* 0x02 CI */ - be_cell_id_aux(tvb, tree, pinfo, offset, len, add_string, string_len, 0x02); + curr_offset += + /* 0x02 CI */ + be_cell_id_aux(tvb, tree, pinfo, offset, len, add_string, string_len, 0x02); - /* no length check possible */ + /* no length check possible */ - return(curr_offset - offset); + return(curr_offset - offset); } /* * 10.5.1.2 Ciphering Key Sequence Number @@ -1981,29 +1979,29 @@ de_cell_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offs */ static const value_string gsm_a_key_seq_vals[] = { - { 0, "Cipering key sequence number"}, - { 1, "Cipering key sequence number"}, - { 2, "Cipering key sequence number"}, - { 3, "Cipering key sequence number"}, - { 4, "Cipering key sequence number"}, - { 5, "Cipering key sequence number"}, - { 6, "Cipering key sequence number"}, - { 7, "No key is available (MS to network)"}, - { 0, NULL } + { 0, "Cipering key sequence number"}, + { 1, "Cipering key sequence number"}, + { 2, "Cipering key sequence number"}, + { 3, "Cipering key sequence number"}, + { 4, "Cipering key sequence number"}, + { 5, "Cipering key sequence number"}, + { 6, "Cipering key sequence number"}, + { 7, "No key is available (MS to network)"}, + { 0, NULL } }; guint16 de_ciph_key_seq_num( tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; + guint32 curr_offset; - curr_offset = offset; + curr_offset = offset; - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_key_seq, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_key_seq, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + curr_offset++; - return(curr_offset - offset); + return(curr_offset - offset); } @@ -2014,42 +2012,41 @@ de_ciph_key_seq_num( tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gu guint16 de_lai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint8 octs[3]; - guint16 value; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - gchar mcc[4]; - gchar mnc[4]; + guint8 octs[3]; + guint16 value; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + gchar mcc[4]; + gchar mnc[4]; - curr_offset = offset; + curr_offset = offset; - item = - proto_tree_add_text(tree, - tvb, curr_offset, 5, "%s", - gsm_common_elem_strings[DE_LAI].strptr); + item = proto_tree_add_text(tree, + tvb, curr_offset, 5, "%s", + gsm_common_elem_strings[DE_LAI].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_LAI]); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_LAI]); - octs[0] = tvb_get_guint8(tvb, curr_offset); - octs[1] = tvb_get_guint8(tvb, curr_offset + 1); - octs[2] = tvb_get_guint8(tvb, curr_offset + 2); + octs[0] = tvb_get_guint8(tvb, curr_offset); + octs[1] = tvb_get_guint8(tvb, curr_offset + 1); + octs[2] = tvb_get_guint8(tvb, curr_offset + 2); - mcc_mnc_aux(octs, mcc, mnc); + mcc_mnc_aux(octs, mcc, mnc); - curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, subtree, curr_offset, TRUE); + curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, subtree, curr_offset, TRUE); - value = tvb_get_ntohs(tvb, curr_offset); + value = tvb_get_ntohs(tvb, curr_offset); - proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(item, " - %s/%s/%u", mcc,mnc,value); + proto_item_append_text(item, " - %s/%s/%u", mcc,mnc,value); - curr_offset += 2; + curr_offset += 2; - /* no length check possible */ + /* no length check possible */ - return(curr_offset - offset); + return(curr_offset - offset); } /* @@ -2057,212 +2054,212 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guin * 3GPP TS 24.008 version 7.8.0 Release 7 */ static const true_false_string gsm_a_present_vals = { - "Present" , - "Not present" + "Present" , + "Not present" }; guint16 de_mid(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) { - guint8 oct; - guint32 curr_offset; - guint8 *poctets; - guint32 value; - gboolean odd; + guint8 oct; + guint32 curr_offset; + guint8 *poctets; + guint32 value; + gboolean odd; - curr_offset = offset; + curr_offset = offset; - oct = tvb_get_guint8(tvb, curr_offset); + oct = tvb_get_guint8(tvb, curr_offset); - switch (oct & 0x07) - { - case 0: /* No Identity */ - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s = Unused", - a_bigbuf); + switch (oct & 0x07) + { + case 0: /* No Identity */ + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, + tvb, curr_offset, 1, + "%s = Unused", + a_bigbuf); - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - if (add_string) - g_snprintf(add_string, string_len, " - No Identity Code"); + if (add_string) + g_snprintf(add_string, string_len, " - No Identity Code"); - curr_offset++; + curr_offset++; - if (len > 1) - { - proto_tree_add_text(tree, tvb, curr_offset, len - 1, - "Format not supported"); - } + if (len > 1) + { + proto_tree_add_text(tree, tvb, curr_offset, len - 1, + "Format not supported"); + } - curr_offset += len - 1; - break; + curr_offset += len - 1; + break; - case 3: /* IMEISV */ - /* FALLTHRU */ + case 3: /* IMEISV */ + /* FALLTHRU */ - case 1: /* IMSI */ - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s = Identity Digit 1: %c", - a_bigbuf, - Dgt1_9_bcd.out[(oct & 0xf0) >> 4]); + case 1: /* IMSI */ + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, + tvb, curr_offset, 1, + "%s = Identity Digit 1: %c", + a_bigbuf, + Dgt1_9_bcd.out[(oct & 0xf0) >> 4]); - odd = oct & 0x08; + odd = oct & 0x08; - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - a_bigbuf[0] = Dgt1_9_bcd.out[(oct & 0xf0) >> 4]; - curr_offset++; + a_bigbuf[0] = Dgt1_9_bcd.out[(oct & 0xf0) >> 4]; + curr_offset++; - poctets = tvb_get_ephemeral_string(tvb, curr_offset, len - (curr_offset - offset)); + poctets = tvb_get_ephemeral_string(tvb, curr_offset, len - (curr_offset - offset)); - my_dgt_tbcd_unpack(&a_bigbuf[1], poctets, len - (curr_offset - offset), - &Dgt1_9_bcd); + my_dgt_tbcd_unpack(&a_bigbuf[1], poctets, len - (curr_offset - offset), + &Dgt1_9_bcd); - proto_tree_add_string_format(tree, - ((oct & 0x07) == 3) ? hf_gsm_a_imeisv : hf_gsm_a_imsi, - tvb, curr_offset - 1, len - (curr_offset - offset) + 1, - a_bigbuf, - "BCD Digits: %s", - a_bigbuf); - - if (sccp_assoc && ! sccp_assoc->calling_party) { - sccp_assoc->calling_party = se_strdup_printf( - ((oct & 0x07) == 3) ? "IMEISV: %s" : "IMSI: %s", - a_bigbuf ); - } - - if (add_string) - g_snprintf(add_string, string_len, " - %s (%s)", - ((oct & 0x07) == 3) ? "IMEISV" : "IMSI", - a_bigbuf); - - curr_offset += len - (curr_offset - offset); - - if (!odd) - { - oct = tvb_get_guint8(tvb, curr_offset - 1); - - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset - 1, 1, - "%s = Filler", - a_bigbuf); - } - break; - - case 2: /* IMEI */ - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s = Identity Digit 1: %c", - a_bigbuf, - Dgt1_9_bcd.out[(oct & 0xf0) >> 4]); - - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - a_bigbuf[0] = Dgt1_9_bcd.out[(oct & 0xf0) >> 4]; - curr_offset++; - - poctets = tvb_get_ephemeral_string(tvb, curr_offset, len - (curr_offset - offset)); - - my_dgt_tbcd_unpack(&a_bigbuf[1], poctets, len - (curr_offset - offset), - &Dgt1_9_bcd); - - proto_tree_add_string_format(tree, - hf_gsm_a_imei, - tvb, curr_offset, len - (curr_offset - offset), - a_bigbuf, - "BCD Digits: %s", - a_bigbuf); - - if (add_string) - g_snprintf(add_string, string_len, " - IMEI (%s)", a_bigbuf); - - curr_offset += len - (curr_offset - offset); - break; - - case 4: /* TMSI/P-TMSI */ - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s = Unused", - a_bigbuf); - - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - curr_offset++; - - value = tvb_get_ntohl(tvb, curr_offset); - - proto_tree_add_uint(tree, hf_gsm_a_tmsi, - tvb, curr_offset, 4, - value); - - if (add_string) - g_snprintf(add_string, string_len, " - TMSI/P-TMSI (0x%04x)", value); - - curr_offset += 4; - break; - - case 5: /* TMGI and optional MBMS Session Identity */ - /* Spare bits (octet 3) Bits 8-7 */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN); - /* MBMS Session Identity indication (octet 3) Bit 6 */ - proto_tree_add_item(tree, hf_gsm_a_mbs_ses_id_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* MCC/MNC indication (octet 3) Bit 5 */ - proto_tree_add_item(tree, hf_gsm_a_tmgi_mcc_mnc_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* Odd/even indication (octet 3) Bit 4 */ - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* Type of identity (octet 3) Bits 3-1 */ - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; - /* MBMS Service ID (octet 4, 5 and 6) */ - proto_tree_add_item(tree, hf_gsm_a_mbs_service_id, tvb, curr_offset, 3, ENC_BIG_ENDIAN); - curr_offset += 3; - if((oct&0x10)==0x10){ - /* MCC/MNC*/ - /* MCC, Mobile country code (octet 6a, octet 6b bits 1 to 4)*/ - /* MNC, Mobile network code (octet 6b bits 5 to 8, octet 6c) */ - curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset,TRUE); - } - if((oct&0x20)==0x20){ - /* MBMS Session Identity (octet 7) - * The MBMS Session Identity field is encoded as the value part - * of the MBMS Session Identity IE as specified in 3GPP TS 48.018 [86]. - */ - proto_tree_add_item(tree, hf_gsm_a_mbs_session_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; - } - break; - - default: /* Reserved */ - proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_text(tree, tvb, curr_offset, len, - "Mobile station identity Format %u, Format Unknown",(oct & 0x07)); - - if (add_string) - g_snprintf(add_string, string_len, " - Format Unknown"); - - curr_offset += len; - break; - } - - EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); - - return(curr_offset - offset); + proto_tree_add_string_format(tree, + ((oct & 0x07) == 3) ? hf_gsm_a_imeisv : hf_gsm_a_imsi, + tvb, curr_offset - 1, len - (curr_offset - offset) + 1, + a_bigbuf, + "BCD Digits: %s", + a_bigbuf); + + if (sccp_assoc && ! sccp_assoc->calling_party) { + sccp_assoc->calling_party = se_strdup_printf( + ((oct & 0x07) == 3) ? "IMEISV: %s" : "IMSI: %s", + a_bigbuf ); + } + + if (add_string) + g_snprintf(add_string, string_len, " - %s (%s)", + ((oct & 0x07) == 3) ? "IMEISV" : "IMSI", + a_bigbuf); + + curr_offset += len - (curr_offset - offset); + + if (!odd) + { + oct = tvb_get_guint8(tvb, curr_offset - 1); + + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, + tvb, curr_offset - 1, 1, + "%s = Filler", + a_bigbuf); + } + break; + + case 2: /* IMEI */ + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, + tvb, curr_offset, 1, + "%s = Identity Digit 1: %c", + a_bigbuf, + Dgt1_9_bcd.out[(oct & 0xf0) >> 4]); + + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + + a_bigbuf[0] = Dgt1_9_bcd.out[(oct & 0xf0) >> 4]; + curr_offset++; + + poctets = tvb_get_ephemeral_string(tvb, curr_offset, len - (curr_offset - offset)); + + my_dgt_tbcd_unpack(&a_bigbuf[1], poctets, len - (curr_offset - offset), + &Dgt1_9_bcd); + + proto_tree_add_string_format(tree, + hf_gsm_a_imei, + tvb, curr_offset, len - (curr_offset - offset), + a_bigbuf, + "BCD Digits: %s", + a_bigbuf); + + if (add_string) + g_snprintf(add_string, string_len, " - IMEI (%s)", a_bigbuf); + + curr_offset += len - (curr_offset - offset); + break; + + case 4: /* TMSI/P-TMSI */ + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, + tvb, curr_offset, 1, + "%s = Unused", + a_bigbuf); + + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + + curr_offset++; + + value = tvb_get_ntohl(tvb, curr_offset); + + proto_tree_add_uint(tree, hf_gsm_a_tmsi, + tvb, curr_offset, 4, + value); + + if (add_string) + g_snprintf(add_string, string_len, " - TMSI/P-TMSI (0x%04x)", value); + + curr_offset += 4; + break; + + case 5: /* TMGI and optional MBMS Session Identity */ + /* Spare bits (octet 3) Bits 8-7 */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN); + /* MBMS Session Identity indication (octet 3) Bit 6 */ + proto_tree_add_item(tree, hf_gsm_a_mbs_ses_id_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* MCC/MNC indication (octet 3) Bit 5 */ + proto_tree_add_item(tree, hf_gsm_a_tmgi_mcc_mnc_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* Odd/even indication (octet 3) Bit 4 */ + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* Type of identity (octet 3) Bits 3-1 */ + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + curr_offset++; + /* MBMS Service ID (octet 4, 5 and 6) */ + proto_tree_add_item(tree, hf_gsm_a_mbs_service_id, tvb, curr_offset, 3, ENC_BIG_ENDIAN); + curr_offset += 3; + if ((oct&0x10) == 0x10) { + /* MCC/MNC*/ + /* MCC, Mobile country code (octet 6a, octet 6b bits 1 to 4)*/ + /* MNC, Mobile network code (octet 6b bits 5 to 8, octet 6c) */ + curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, TRUE); + } + if ((oct&0x20) == 0x20) { + /* MBMS Session Identity (octet 7) + * The MBMS Session Identity field is encoded as the value part + * of the MBMS Session Identity IE as specified in 3GPP TS 48.018 [86]. + */ + proto_tree_add_item(tree, hf_gsm_a_mbs_session_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + curr_offset++; + } + break; + + default: /* Reserved */ + proto_tree_add_item(tree, hf_gsm_a_odd_even_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_mobile_identity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_text(tree, tvb, curr_offset, len, + "Mobile station identity Format %u, Format Unknown", (oct & 0x07)); + + if (add_string) + g_snprintf(add_string, string_len, " - Format Unknown"); + + curr_offset += len; + break; + } + + EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); + + return(curr_offset - offset); } /* @@ -2271,34 +2268,34 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guin guint16 de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; - curr_offset = offset; + curr_offset = offset; - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", - gsm_common_elem_strings[DE_MS_CM_1].strptr); + item = + proto_tree_add_text(tree, + tvb, curr_offset, 1, "%s", + gsm_common_elem_strings[DE_MS_CM_1].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_1]); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_1]); - proto_tree_add_item(subtree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_gsm_a_ES_IND, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_ES_IND, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_gsm_a_A5_1_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_A5_1_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_gsm_a_RF_power_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_gsm_a_RF_power_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + curr_offset++; - /* no length check possible */ + /* no length check possible */ - return(curr_offset - offset); + return(curr_offset - offset); } /* @@ -2308,64 +2305,64 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offs guint16 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; - curr_offset = offset; + guint32 curr_offset; + curr_offset = offset; - proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_ES_IND, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_ES_IND, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_A5_1_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_A5_1_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_RF_power_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_RF_power_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + curr_offset++; - NO_MORE_DATA_CHECK(len); + NO_MORE_DATA_CHECK(len); - proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_ps_sup_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_ps_sup_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_SS_screening_indicator, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_SS_screening_indicator, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* SM capability (MT SMS pt to pt capability) (octet 4)*/ - proto_tree_add_item(tree, hf_gsm_a_SM_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* VBS notification reception (octet 4) */ - proto_tree_add_item(tree, hf_gsm_a_VBS_notification_rec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /*VGCS notification reception (octet 4)*/ - proto_tree_add_item(tree, hf_gsm_a_VGCS_notification_rec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* FC Frequency Capability (octet 4 ) */ - proto_tree_add_item(tree, hf_gsm_a_FC_frequency_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* SM capability (MT SMS pt to pt capability) (octet 4)*/ + proto_tree_add_item(tree, hf_gsm_a_SM_capability, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* VBS notification reception (octet 4) */ + proto_tree_add_item(tree, hf_gsm_a_VBS_notification_rec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /*VGCS notification reception (octet 4)*/ + proto_tree_add_item(tree, hf_gsm_a_VGCS_notification_rec, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* FC Frequency Capability (octet 4 ) */ + proto_tree_add_item(tree, hf_gsm_a_FC_frequency_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + curr_offset++; - NO_MORE_DATA_CHECK(len); + NO_MORE_DATA_CHECK(len); - /* CM3 (octet 5, bit 8) */ - proto_tree_add_item(tree, hf_gsm_a_CM3, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* spare bit 7 */ - proto_tree_add_item(tree, hf_gsm_a_b7spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */ - proto_tree_add_item(tree, hf_gsm_a_LCS_VA_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* UCS2 treatment (octet 5, bit 5) */ - proto_tree_add_item(tree, hf_gsm_a_UCS2_treatment, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* SoLSA (octet 5, bit 4) */ - proto_tree_add_item(tree, hf_gsm_a_SoLSA, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* CMSP: CM Service Prompt (octet 5, bit 3) */ - proto_tree_add_item(tree, hf_gsm_a_CMSP, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* A5/3 algorithm supported (octet 5, bit 2) */ - proto_tree_add_item(tree, hf_gsm_a_A5_3_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* A5/2 algorithm supported (octet 5, bit 1) */ - proto_tree_add_item(tree, hf_gsm_a_A5_2_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* CM3 (octet 5, bit 8) */ + proto_tree_add_item(tree, hf_gsm_a_CM3, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* spare bit 7 */ + proto_tree_add_item(tree, hf_gsm_a_b7spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* LCS VA capability (LCS value added location request notification capability) (octet 5,bit 6) */ + proto_tree_add_item(tree, hf_gsm_a_LCS_VA_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* UCS2 treatment (octet 5, bit 5) */ + proto_tree_add_item(tree, hf_gsm_a_UCS2_treatment, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* SoLSA (octet 5, bit 4) */ + proto_tree_add_item(tree, hf_gsm_a_SoLSA, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* CMSP: CM Service Prompt (octet 5, bit 3) */ + proto_tree_add_item(tree, hf_gsm_a_CMSP, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* A5/3 algorithm supported (octet 5, bit 2) */ + proto_tree_add_item(tree, hf_gsm_a_A5_3_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + /* A5/2 algorithm supported (octet 5, bit 1) */ + proto_tree_add_item(tree, hf_gsm_a_A5_2_algorithm_sup, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + curr_offset++; - EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset,pinfo); + EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset,pinfo); - return(curr_offset - offset); + return(curr_offset - offset); } /* @@ -2373,667 +2370,672 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, * 3GPP TS 24.008 version 9.6.0 Release 9 */ #define AVAILABLE_BITS_CHECK(n) \ - bits_left = ((len + offset) << 3) - bit_offset; \ - if (bits_left < (n)) { \ - if (bits_left) \ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, bits_left, ENC_BIG_ENDIAN); \ - return(len); \ - } + bits_left = ((len + offset) << 3) - bit_offset; \ + if (bits_left < (n)) { \ + if (bits_left) \ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, bits_left, ENC_BIG_ENDIAN); \ + return(len); \ + } guint16 de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; - guint32 bit_offset; /* Offset in bits */ - guint8 length; - proto_tree *subtree; - proto_item *item; - guint32 bits_left, target_bit_offset; - guint64 multi_bnd_sup_fields, rsupport, multislotCapability, msMeasurementCapability, msPosMethodCapPresent; - guint64 ecsdMultiSlotCapability, eightPskStructPresent, gsm400BandInfoPresent, gsm850AssocRadioCapabilityPresent; - guint64 gsm1900AssocRadioCapabilityPresent, dtmEGprsMultiSlotInfoPresent, dtmEgprsMultiSlotClassPresent, singleBandSupport; - guint64 gsm750AssocRadioCapabilityPresent, extDtmEGprsMultiSlotInfoPresent, highMultislotCapPresent, geranIuModeSupport; - guint64 tGsm400BandInfoPresent, tGsm900AssocRadioCapabilityPresent, dtmEGprsHighMultiSlotInfoPresent; - guint64 dtmEgprsHighMultiSlotClassPresent, gsm710AssocRadioCapabilityPresent, tGsm810AssocRadioCapabilityPresent; - - curr_offset = offset; - - bit_offset = curr_offset << 3; - - /* Spare bit */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - /* Multiband supported field - * { < Multiband supported : { 000 } > - * < A5 bits > - * | < Multiband supported : { 101 | 110 } > - * < A5 bits > - * < Associated Radio Capability 2 : bit(4) > - * < Associated Radio Capability 1 : bit(4) > - * | < Multiband supported : { 001 | 010 | 100 } > - * < A5 bits > - * < spare bit >(4) - * < Associated Radio Capability 1 : bit(4) > } - */ - - item = proto_tree_add_bits_ret_val(tree, hf_gsm_a_multi_bnd_sup_fields, tvb, bit_offset, 3, &multi_bnd_sup_fields, ENC_BIG_ENDIAN); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); - - proto_tree_add_bits_item(subtree, hf_gsm_a_gsm1800_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_egsm_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_pgsm_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - item = proto_tree_add_bits_item(tree, hf_gsm_a_cm3_A5_bits, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); - - /* < A5 bits > */ - proto_tree_add_bits_item(subtree, hf_gsm_a_A5_7_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(subtree, hf_gsm_a_A5_6_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(subtree, hf_gsm_a_A5_5_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - proto_tree_add_bits_item(subtree, hf_gsm_a_A5_4_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - switch(multi_bnd_sup_fields){ - case 0: - /* A5 bits dissected is done */ - break; - /* - * | < Multiband supported : { 001 | 010 | 100 } > - */ - case 1: - case 2: - case 4: - /* < spare bit >(4) */ - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset+=4; - /* < Associated Radio Capability 1 : bit(4) > */ - proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset+=4; - break; - /* < Multiband supported : { 101 | 110 } > */ - case 5: - /* fall trough */ - case 6: - /* < Associated Radio Capability 2 : bit(4) > */ - proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap2, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset+=4; - /* < Associated Radio Capability 1 : bit(4) > */ - proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset+=4; - break; - default: - break; - } - /* Extract R Support */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_rsupport, tvb, bit_offset, 1, &rsupport, ENC_BIG_ENDIAN); - bit_offset++; - - if(rsupport == 1) - { - /* - * { 0 | 1 < R Support > } - * Extract R Capabilities - */ - proto_tree_add_bits_item(tree, hf_gsm_a_r_capabilities, tvb, bit_offset, 3, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 3; - } - - /* - * { 0 | 1 < HSCSD Multi Slot Capability > } - * Extract Multislot capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_multislot_capabilities, tvb, bit_offset, 1, &multislotCapability, ENC_BIG_ENDIAN); - bit_offset++; - - if(multislotCapability == 1) - { - /* Extract Multislot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_multislot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 5; - } - - /* < UCS2 treatment: bit > */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_ucs2_treatment, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < Extended Measurement Capability : bit > */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_extended_measurement_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* { 0 | 1 < MS measurement capability > } - * Extract MS Measurement capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_ms_measurement_capability, tvb, bit_offset, 1, &msMeasurementCapability, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(msMeasurementCapability == 1) - { - /* Extract SMS Value n/4 */ - proto_tree_add_bits_item(tree, hf_gsm_a_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - - /* Extract SM Value n/4 */ - proto_tree_add_bits_item(tree, hf_gsm_a_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 < MS Positioning Method Capability > } - * Extract MS Positioning Method Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_ms_pos_method_cap_present, tvb, bit_offset, 1, &msPosMethodCapPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(msPosMethodCapPresent == 1) - { - /* Extract MS Positioning Method */ - item = proto_tree_add_bits_item(tree, hf_gsm_a_ms_pos_method, tvb, bit_offset, 5, ENC_BIG_ENDIAN); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); - - proto_tree_add_bits_item(subtree, hf_gsm_a_ms_assisted_e_otd, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_ms_based_e_otd, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_ms_assisted_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_ms_based_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - - proto_tree_add_bits_item(subtree, hf_gsm_a_ms_conventional_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset++; - } - - /* { 0 | 1 < ECSD Multi Slot Capability > } - * Extract ECSD Multi Slot Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_ecsd_multi_slot_capability, tvb, bit_offset, 1, &ecsdMultiSlotCapability, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(ecsdMultiSlotCapability == 1) - { - /* Extract ECSD Multi Slot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 5; - } - - /* { 0 | 1 < 8-PSK Struct > } - * Extract 8-PSK struct presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_8_psk_struct_present, tvb, bit_offset, 1, &eightPskStructPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(eightPskStructPresent == 1) - { - /* Extract 8-PSK struct */ - item = proto_tree_add_bits_item(tree, hf_gsm_a_8_psk_struct, tvb, bit_offset, 5, ENC_BIG_ENDIAN); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); - - /* Extract Modulation Capability */ - proto_tree_add_bits_item(subtree, hf_gsm_a_modulation_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* Extract 8_PSK RF Power Capability 1 */ - proto_tree_add_bits_item(subtree, hf_gsm_a_8_psk_rf_power_capability_1, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* Extract 8_PSK RF Power Capability 2 */ - proto_tree_add_bits_item(subtree, hf_gsm_a_8_psk_rf_power_capability_2, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - } - - /* { 0 | 1 < GSM 400 Bands Supported : { 01 | 10 | 11 } > - * < GSM 400 Associated Radio Capability: bit(4) > } - * Extract GSM 400 Band Information presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_400_band_info_present, tvb, bit_offset, 1, &gsm400BandInfoPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(gsm400BandInfoPresent == 1) - { - /* Extract GSM 400 Bands Supported */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_400_bands_supported, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* Extract GSM 400 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_400_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 <GSM 850 Associated Radio Capability : bit(4) > } - * Extract GSM 850 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_850_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm850AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(gsm850AssocRadioCapabilityPresent == 1) - { - /* Extract GSM 850 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_850_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 <GSM 1900 Associated Radio Capability : bit(4) > } - * Extract GSM 1900 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_1900_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm1900AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(gsm1900AssocRadioCapabilityPresent == 1) - { - /* Extract GSM 1900 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_1900_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* < UMTS FDD Radio Access Technology Capability : bit > - * Extract UMTS FDD Radio Access Technology Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_umts_fdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < UMTS 3.84 Mcps TDD Radio Access Technology Capability : bit > - * Extract UMTS 3.84 Mcps TDD Radio Access Technology Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_umts_384_mcps_tdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < CDMA 2000 Radio Access Technology Capability : bit > - * Extract CDMA 2000 Radio Access Technology Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_cdma_2000_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* { 0 | 1 < DTM GPRS Multi Slot Class : bit(2) > - * < Single Slot DTM : bit > - * {0 | 1< DTM EGPRS Multi Slot Class : bit(2) > } } - * Extract DTM E/GPRS Information presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_e_gprs_multi_slot_info_present, tvb, bit_offset, 1, &dtmEGprsMultiSlotInfoPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(dtmEGprsMultiSlotInfoPresent == 1) - { - /* Extract DTM GPRS Multi Slot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* Extract Single Slot DTM */ - proto_tree_add_bits_item(tree, hf_gsm_a_single_slot_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* Extract DTM EGPRS Multi Slot Class Presence */ - proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_egprs_multi_slot_class_present, tvb, bit_offset, 1, &dtmEgprsMultiSlotClassPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* Extract DTM EGPRS Multi Slot Class */ - if (dtmEgprsMultiSlotClassPresent == 1) - { - proto_tree_add_bits_item(tree, hf_gsm_a_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - } - } - - /* - * Release 4 starts here - * - * { 0 | 1 < Single Band Support > } -- Release 4 starts here: - * Extract Single Band Support - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_single_band_support, tvb, bit_offset, 1, &singleBandSupport, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(singleBandSupport == 1) - { - /* Extract Single Band Support */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_band, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 <GSM 750 Associated Radio Capability : bit(4) > } - * Extract GSM 750 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_750_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm750AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(gsm750AssocRadioCapabilityPresent == 1) - { - /* Extract GSM 750 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_750_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* < UMTS 1.28 Mcps TDD Radio Access Technology Capability : bit > - * Extract UMTS 1.28 Mcps TDD Radio Access Technology Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_umts_128_mcps_tdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < GERAN Feature Package 1 : bit > - * Extract GERAN Feature Package 1 - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_geran_feature_package_1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* { 0 | 1 < Extended DTM GPRS Multi Slot Class : bit(2) > - * < Extended DTM EGPRS Multi Slot Class : bit(2) > } - * Extract Extended DTM E/GPRS Information presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present, tvb, bit_offset, 1, &extDtmEGprsMultiSlotInfoPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(extDtmEGprsMultiSlotInfoPresent == 1) - { - /* Extract Extended DTM GPRS Multi Slot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_ext_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* Extract Extended DTM EGPRS Multi Slot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_ext_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - } - - /* - * Release 5 starts here - * - * { 0 | 1 < High Multislot Capability : bit(2) > } -- Release 5 starts here. - * Extract High Multislot Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_high_multislot_cap_present, tvb, bit_offset, 1, &highMultislotCapPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(highMultislotCapPresent == 1) - { - /* Extract High Multislot Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_high_multislot_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - } - - /* - * { 0 | 1 < GERAN Iu Mode Capabilities > } -- "1" also means support of GERAN Iu mode - * Extract GERAN Iu Mode Capabilities presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_geran_iu_mode_support, tvb, bit_offset, 1, &geranIuModeSupport, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(geranIuModeSupport == 1) - { - /* Extract GERAN Iu Mode Capabilities Length */ - length = tvb_get_bits8(tvb, bit_offset, 4); - - /* Extract GERAN Iu Mode Capabilities */ - item = proto_tree_add_bits_item(tree, hf_gsm_a_geran_iu_mode_cap, tvb, bit_offset, length + 4, ENC_BIG_ENDIAN); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); - - /* Add GERAN Iu Mode Capabilities Length in subtree */ - proto_tree_add_bits_item(subtree, hf_gsm_a_geran_iu_mode_cap_length, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset += 4; - target_bit_offset = bit_offset + length; - - /* Extract FLO Iu Capability */ - proto_tree_add_bits_item(subtree, hf_gsm_a_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset += 1; - - /* If needed, add spare bits */ - if (target_bit_offset > bit_offset) - { - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, bit_offset, target_bit_offset - bit_offset, ENC_BIG_ENDIAN); - bit_offset = target_bit_offset; - } - } - - /* < GERAN Feature Package 2 : bit > - * Extract GERAN Feature Package 2 - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_geran_feature_package_2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < GMSK Multislot Power Profile : bit (2) > - * Extract GMSK Multislot Power Profile - */ - AVAILABLE_BITS_CHECK(2); - proto_tree_add_bits_item(tree, hf_gsm_a_gmsk_multislot_power_prof, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* < 8-PSK Multislot Power Profile : bit (2) > - * Extract GMSK Multislot Power Profile - */ - AVAILABLE_BITS_CHECK(2); - proto_tree_add_bits_item(tree, hf_gsm_a_8_psk_multislot_power_prof, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* - * Release 6 starts here - * - * { 0 | 1 < T-GSM 400 Bands Supported : { 01 | 10 | 11 } > -- Release 6 starts here. - * < T-GSM 400 Associated Radio Capability: bit(4) > } - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_400_band_info_present, tvb, bit_offset, 1, &tGsm400BandInfoPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(tGsm400BandInfoPresent == 1) - { - /* Extract T-GSM 400 Bands Supported */ - proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_400_bands_supported, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* Extract T-GSM 400 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_400_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 < T-GSM 900 Associated Radio Capability: bit(4) > } - * Extract T-GSM 900 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_900_assoc_radio_cap_present, tvb, bit_offset, 1, &tGsm900AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(tGsm900AssocRadioCapabilityPresent == 1) - { - /* Extract T-GSM 900 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_900_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* < Downlink Advanced Receiver Performance : bit (2)> - * Extract Downlink Advanced Receiver Performance - */ - AVAILABLE_BITS_CHECK(2); - proto_tree_add_bits_item(tree, hf_gsm_a_downlink_adv_receiver_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* < DTM Enhancements Capability : bit > - * Extract DTM Enhancements Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_dtm_enhancements_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* { 0 | 1 < DTM GPRS High Multi Slot Class : bit(3) > - * < Offset required : bit> - * { 0 | 1 < DTM EGPRS High Multi Slot Class : bit(3) > } } - * Extract DTM E/GPRS High Multi Slot Information presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present, tvb, bit_offset, 1, &dtmEGprsHighMultiSlotInfoPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(dtmEGprsHighMultiSlotInfoPresent == 1) - { - /* Extract DTM GPRS High Multi Slot Class */ - proto_tree_add_bits_item(tree, hf_gsm_a_dtm_gprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 3; - - /* Extract Offset Required */ - proto_tree_add_bits_item(tree, hf_gsm_a_offset_required, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* Extract DTM EGPRS High Multi Slot Class Presence */ - proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_egprs_high_multi_slot_class_present, tvb, bit_offset, 1, &dtmEgprsHighMultiSlotClassPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* Extract DTM EGPRS High Multi Slot Class */ - if (dtmEgprsHighMultiSlotClassPresent == 1) - { - proto_tree_add_bits_item(tree, hf_gsm_a_dtm_egprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 3; - } - } - - /* < Repeated ACCH Capability : bit > - * Extract Repeated ACCH Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_repeated_acch_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * Release 7 starts here - * - * { 0 | 1 <GSM 710 Associated Radio Capability : bit(4) > } -- Release 7 starts here. - * Extract GSM 710 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_710_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm710AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(gsm710AssocRadioCapabilityPresent == 1) - { - /* Extract GSM 710 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_gsm_710_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* { 0 | 1 < T-GSM 810 Associated Radio Capability: bit(4) > } - * Extract T-GSM 810 Associated Radio Capability presence - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_810_assoc_radio_cap_present, tvb, bit_offset, 1, &tGsm810AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - if(tGsm810AssocRadioCapabilityPresent == 1) - { - /* Extract T-GSM 810 Associated Radio Capability */ - proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_810_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 4; - } - - /* < Ciphering Mode Setting Capability : bit > - * Extract Ciphering Mode Setting Capability - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_ciphering_mode_setting_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* < Additional Positioning Capabilities : bit > - * Extract Additional Positioning Capabilities - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_additional_positioning_caps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * Release 8 starts here - * - * <E-UTRA FDD support : bit > -- Release 8 starts here. - * Extract E-UTRA FDD support - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * <E-UTRA TDD support : bit > - * Extract E-UTRA TDD support - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * <E-UTRA Measurement and Reporting support : bit > - * Extract E-UTRA Measurement and Reporting support - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_meas_and_report_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * <Priority-based reselection support : bit > - * Extract Priority-based reselection support - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * Release 9 starts here - * - * <UTRA CSG Cells Reporting : bit > -- Release 9 starts here. - * Extract UTRA CSG Cells Reporting - */ - AVAILABLE_BITS_CHECK(1); - proto_tree_add_bits_item(tree, hf_gsm_a_utra_csg_cells_reporting, tvb, bit_offset, 1, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 1; - - /* - * <VAMOS Level : bit(2) > - * Extract VAMOS Level - */ - AVAILABLE_BITS_CHECK(2); - proto_tree_add_bits_item(tree, hf_gsm_a_vamos_level, tvb, bit_offset, 2, ENC_BIG_ENDIAN); - bit_offset = bit_offset + 2; - - /* - * Add spare bits until we reach an octet boundary - */ - bits_left = (((len + offset) << 3) - bit_offset) & 0x07; - if (bits_left != 0) - { - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, bits_left, ENC_BIG_ENDIAN); - bit_offset += bits_left; - } - - /* translate to byte offset (we already know that we are on an octet boundary) */ - curr_offset = bit_offset >> 3; - EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); - - return(len); + guint32 curr_offset; + guint32 bit_offset; /* Offset in bits */ + guint8 length; + proto_tree *subtree; + proto_item *item; + guint32 bits_left, target_bit_offset; + guint64 multi_bnd_sup_fields, rsupport, multislotCapability; + guint64 msMeasurementCapability, msPosMethodCapPresent; + guint64 ecsdMultiSlotCapability, eightPskStructPresent; + guint64 gsm400BandInfoPresent, gsm850AssocRadioCapabilityPresent; + guint64 gsm1900AssocRadioCapabilityPresent, dtmEGprsMultiSlotInfoPresent; + guint64 dtmEgprsMultiSlotClassPresent, singleBandSupport; + guint64 gsm750AssocRadioCapabilityPresent, extDtmEGprsMultiSlotInfoPresent; + guint64 highMultislotCapPresent, geranIuModeSupport; + guint64 tGsm400BandInfoPresent, tGsm900AssocRadioCapabilityPresent, dtmEGprsHighMultiSlotInfoPresent; + guint64 dtmEgprsHighMultiSlotClassPresent, gsm710AssocRadioCapabilityPresent; + guint64 tGsm810AssocRadioCapabilityPresent; + + curr_offset = offset; + + bit_offset = curr_offset << 3; + + /* Spare bit */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + /* Multiband supported field + * { < Multiband supported : { 000 } > + * < A5 bits > + * | < Multiband supported : { 101 | 110 } > + * < A5 bits > + * < Associated Radio Capability 2 : bit(4) > + * < Associated Radio Capability 1 : bit(4) > + * | < Multiband supported : { 001 | 010 | 100 } > + * < A5 bits > + * < spare bit >(4) + * < Associated Radio Capability 1 : bit(4) > } + */ + + item = proto_tree_add_bits_ret_val(tree, hf_gsm_a_multi_bnd_sup_fields, tvb, bit_offset, 3, &multi_bnd_sup_fields, ENC_BIG_ENDIAN); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); + + proto_tree_add_bits_item(subtree, hf_gsm_a_gsm1800_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_egsm_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_pgsm_supported, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + item = proto_tree_add_bits_item(tree, hf_gsm_a_cm3_A5_bits, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); + + /* < A5 bits > */ + proto_tree_add_bits_item(subtree, hf_gsm_a_A5_7_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(subtree, hf_gsm_a_A5_6_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(subtree, hf_gsm_a_A5_5_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(subtree, hf_gsm_a_A5_4_algorithm_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + switch (multi_bnd_sup_fields) { + case 0: + /* A5 bits dissected is done */ + break; + /* + * | < Multiband supported : { 001 | 010 | 100 } > + */ + case 1: + case 2: + case 4: + /* < spare bit >(4) */ + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset += 4; + /* < Associated Radio Capability 1 : bit(4) > */ + proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset += 4; + break; + /* < Multiband supported : { 101 | 110 } > */ + case 5: + /* fall trough */ + case 6: + /* < Associated Radio Capability 2 : bit(4) > */ + proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap2, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset += 4; + /* < Associated Radio Capability 1 : bit(4) > */ + proto_tree_add_bits_item(tree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset += 4; + break; + default: + break; + } + /* Extract R Support */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_rsupport, tvb, bit_offset, 1, &rsupport, ENC_BIG_ENDIAN); + bit_offset++; + + if (rsupport == 1) + { + /* + * { 0 | 1 < R Support > } + * Extract R Capabilities + */ + proto_tree_add_bits_item(tree, hf_gsm_a_r_capabilities, tvb, bit_offset, 3, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 3; + } + + /* + * { 0 | 1 < HSCSD Multi Slot Capability > } + * Extract Multislot capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_multislot_capabilities, tvb, bit_offset, 1, &multislotCapability, ENC_BIG_ENDIAN); + bit_offset++; + + if (multislotCapability == 1) + { + /* Extract Multislot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_multislot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 5; + } + + /* < UCS2 treatment: bit > */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_ucs2_treatment, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < Extended Measurement Capability : bit > */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_extended_measurement_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* { 0 | 1 < MS measurement capability > } + * Extract MS Measurement capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_ms_measurement_capability, tvb, bit_offset, 1, &msMeasurementCapability, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (msMeasurementCapability == 1) + { + /* Extract SMS Value n/4 */ + proto_tree_add_bits_item(tree, hf_gsm_a_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + + /* Extract SM Value n/4 */ + proto_tree_add_bits_item(tree, hf_gsm_a_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 < MS Positioning Method Capability > } + * Extract MS Positioning Method Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_ms_pos_method_cap_present, tvb, bit_offset, 1, &msPosMethodCapPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (msPosMethodCapPresent == 1) + { + /* Extract MS Positioning Method */ + item = proto_tree_add_bits_item(tree, hf_gsm_a_ms_pos_method, tvb, bit_offset, 5, ENC_BIG_ENDIAN); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); + + proto_tree_add_bits_item(subtree, hf_gsm_a_ms_assisted_e_otd, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_ms_based_e_otd, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_ms_assisted_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_ms_based_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_ms_conventional_gps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + } + + /* { 0 | 1 < ECSD Multi Slot Capability > } + * Extract ECSD Multi Slot Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_ecsd_multi_slot_capability, tvb, bit_offset, 1, &ecsdMultiSlotCapability, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (ecsdMultiSlotCapability == 1) + { + /* Extract ECSD Multi Slot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 5; + } + + /* { 0 | 1 < 8-PSK Struct > } + * Extract 8-PSK struct presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_8_psk_struct_present, tvb, bit_offset, 1, &eightPskStructPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (eightPskStructPresent == 1) + { + /* Extract 8-PSK struct */ + item = proto_tree_add_bits_item(tree, hf_gsm_a_8_psk_struct, tvb, bit_offset, 5, ENC_BIG_ENDIAN); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); + + /* Extract Modulation Capability */ + proto_tree_add_bits_item(subtree, hf_gsm_a_modulation_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* Extract 8_PSK RF Power Capability 1 */ + proto_tree_add_bits_item(subtree, hf_gsm_a_8_psk_rf_power_capability_1, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* Extract 8_PSK RF Power Capability 2 */ + proto_tree_add_bits_item(subtree, hf_gsm_a_8_psk_rf_power_capability_2, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + } + + /* { 0 | 1 < GSM 400 Bands Supported : { 01 | 10 | 11 } > + * < GSM 400 Associated Radio Capability: bit(4) > } + * Extract GSM 400 Band Information presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_400_band_info_present, tvb, bit_offset, 1, &gsm400BandInfoPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (gsm400BandInfoPresent == 1) + { + /* Extract GSM 400 Bands Supported */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_400_bands_supported, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* Extract GSM 400 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_400_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 <GSM 850 Associated Radio Capability : bit(4) > } + * Extract GSM 850 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_850_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm850AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (gsm850AssocRadioCapabilityPresent == 1) + { + /* Extract GSM 850 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_850_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 <GSM 1900 Associated Radio Capability : bit(4) > } + * Extract GSM 1900 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_1900_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm1900AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (gsm1900AssocRadioCapabilityPresent == 1) + { + /* Extract GSM 1900 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_1900_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* < UMTS FDD Radio Access Technology Capability : bit > + * Extract UMTS FDD Radio Access Technology Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_umts_fdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < UMTS 3.84 Mcps TDD Radio Access Technology Capability : bit > + * Extract UMTS 3.84 Mcps TDD Radio Access Technology Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_umts_384_mcps_tdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < CDMA 2000 Radio Access Technology Capability : bit > + * Extract CDMA 2000 Radio Access Technology Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_cdma_2000_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* { 0 | 1 < DTM GPRS Multi Slot Class : bit(2) > + * < Single Slot DTM : bit > + * {0 | 1< DTM EGPRS Multi Slot Class : bit(2) > } } + * Extract DTM E/GPRS Information presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_e_gprs_multi_slot_info_present, tvb, bit_offset, 1, &dtmEGprsMultiSlotInfoPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (dtmEGprsMultiSlotInfoPresent == 1) + { + /* Extract DTM GPRS Multi Slot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* Extract Single Slot DTM */ + proto_tree_add_bits_item(tree, hf_gsm_a_single_slot_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* Extract DTM EGPRS Multi Slot Class Presence */ + proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_egprs_multi_slot_class_present, tvb, bit_offset, 1, &dtmEgprsMultiSlotClassPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* Extract DTM EGPRS Multi Slot Class */ + if (dtmEgprsMultiSlotClassPresent == 1) + { + proto_tree_add_bits_item(tree, hf_gsm_a_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + } + } + + /* + * Release 4 starts here + * + * { 0 | 1 < Single Band Support > } -- Release 4 starts here: + * Extract Single Band Support + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_single_band_support, tvb, bit_offset, 1, &singleBandSupport, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (singleBandSupport == 1) + { + /* Extract Single Band Support */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_band, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 <GSM 750 Associated Radio Capability : bit(4) > } + * Extract GSM 750 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_750_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm750AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (gsm750AssocRadioCapabilityPresent == 1) + { + /* Extract GSM 750 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_750_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* < UMTS 1.28 Mcps TDD Radio Access Technology Capability : bit > + * Extract UMTS 1.28 Mcps TDD Radio Access Technology Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_umts_128_mcps_tdd_rat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < GERAN Feature Package 1 : bit > + * Extract GERAN Feature Package 1 + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_geran_feature_package_1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* { 0 | 1 < Extended DTM GPRS Multi Slot Class : bit(2) > + * < Extended DTM EGPRS Multi Slot Class : bit(2) > } + * Extract Extended DTM E/GPRS Information presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present, tvb, bit_offset, 1, &extDtmEGprsMultiSlotInfoPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (extDtmEGprsMultiSlotInfoPresent == 1) + { + /* Extract Extended DTM GPRS Multi Slot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_ext_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* Extract Extended DTM EGPRS Multi Slot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_ext_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + } + + /* + * Release 5 starts here + * + * { 0 | 1 < High Multislot Capability : bit(2) > } -- Release 5 starts here. + * Extract High Multislot Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_high_multislot_cap_present, tvb, bit_offset, 1, &highMultislotCapPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (highMultislotCapPresent == 1) + { + /* Extract High Multislot Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_high_multislot_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + } + + /* + * { 0 | 1 < GERAN Iu Mode Capabilities > } -- "1" also means support of GERAN Iu mode + * Extract GERAN Iu Mode Capabilities presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_geran_iu_mode_support, tvb, bit_offset, 1, &geranIuModeSupport, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (geranIuModeSupport == 1) + { + /* Extract GERAN Iu Mode Capabilities Length */ + length = tvb_get_bits8(tvb, bit_offset, 4); + + /* Extract GERAN Iu Mode Capabilities */ + item = proto_tree_add_bits_item(tree, hf_gsm_a_geran_iu_mode_cap, tvb, bit_offset, length + 4, ENC_BIG_ENDIAN); + subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_3]); + + /* Add GERAN Iu Mode Capabilities Length in subtree */ + proto_tree_add_bits_item(subtree, hf_gsm_a_geran_iu_mode_cap_length, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset += 4; + target_bit_offset = bit_offset + length; + + /* Extract FLO Iu Capability */ + proto_tree_add_bits_item(subtree, hf_gsm_a_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset += 1; + + /* If needed, add spare bits */ + if (target_bit_offset > bit_offset) + { + proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, bit_offset, target_bit_offset - bit_offset, ENC_BIG_ENDIAN); + bit_offset = target_bit_offset; + } + } + + /* < GERAN Feature Package 2 : bit > + * Extract GERAN Feature Package 2 + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_geran_feature_package_2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < GMSK Multislot Power Profile : bit (2) > + * Extract GMSK Multislot Power Profile + */ + AVAILABLE_BITS_CHECK(2); + proto_tree_add_bits_item(tree, hf_gsm_a_gmsk_multislot_power_prof, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* < 8-PSK Multislot Power Profile : bit (2) > + * Extract GMSK Multislot Power Profile + */ + AVAILABLE_BITS_CHECK(2); + proto_tree_add_bits_item(tree, hf_gsm_a_8_psk_multislot_power_prof, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* + * Release 6 starts here + * + * { 0 | 1 < T-GSM 400 Bands Supported : { 01 | 10 | 11 } > -- Release 6 starts here. + * < T-GSM 400 Associated Radio Capability: bit(4) > } + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_400_band_info_present, tvb, bit_offset, 1, &tGsm400BandInfoPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (tGsm400BandInfoPresent == 1) + { + /* Extract T-GSM 400 Bands Supported */ + proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_400_bands_supported, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* Extract T-GSM 400 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_400_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 < T-GSM 900 Associated Radio Capability: bit(4) > } + * Extract T-GSM 900 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_900_assoc_radio_cap_present, tvb, bit_offset, 1, &tGsm900AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (tGsm900AssocRadioCapabilityPresent == 1) + { + /* Extract T-GSM 900 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_900_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* < Downlink Advanced Receiver Performance : bit (2)> + * Extract Downlink Advanced Receiver Performance + */ + AVAILABLE_BITS_CHECK(2); + proto_tree_add_bits_item(tree, hf_gsm_a_downlink_adv_receiver_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* < DTM Enhancements Capability : bit > + * Extract DTM Enhancements Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_dtm_enhancements_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* { 0 | 1 < DTM GPRS High Multi Slot Class : bit(3) > + * < Offset required : bit> + * { 0 | 1 < DTM EGPRS High Multi Slot Class : bit(3) > } } + * Extract DTM E/GPRS High Multi Slot Information presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present, tvb, bit_offset, 1, &dtmEGprsHighMultiSlotInfoPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (dtmEGprsHighMultiSlotInfoPresent == 1) + { + /* Extract DTM GPRS High Multi Slot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_dtm_gprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 3; + + /* Extract Offset Required */ + proto_tree_add_bits_item(tree, hf_gsm_a_offset_required, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* Extract DTM EGPRS High Multi Slot Class Presence */ + proto_tree_add_bits_ret_val(tree, hf_gsm_a_dtm_egprs_high_multi_slot_class_present, tvb, bit_offset, 1, &dtmEgprsHighMultiSlotClassPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* Extract DTM EGPRS High Multi Slot Class */ + if (dtmEgprsHighMultiSlotClassPresent == 1) + { + proto_tree_add_bits_item(tree, hf_gsm_a_dtm_egprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 3; + } + } + + /* < Repeated ACCH Capability : bit > + * Extract Repeated ACCH Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_repeated_acch_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * Release 7 starts here + * + * { 0 | 1 <GSM 710 Associated Radio Capability : bit(4) > } -- Release 7 starts here. + * Extract GSM 710 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_gsm_710_assoc_radio_cap_present, tvb, bit_offset, 1, &gsm710AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (gsm710AssocRadioCapabilityPresent == 1) + { + /* Extract GSM 710 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_gsm_710_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* { 0 | 1 < T-GSM 810 Associated Radio Capability: bit(4) > } + * Extract T-GSM 810 Associated Radio Capability presence + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_ret_val(tree, hf_gsm_a_t_gsm_810_assoc_radio_cap_present, tvb, bit_offset, 1, &tGsm810AssocRadioCapabilityPresent, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + if (tGsm810AssocRadioCapabilityPresent == 1) + { + /* Extract T-GSM 810 Associated Radio Capability */ + proto_tree_add_bits_item(tree, hf_gsm_a_t_gsm_810_assoc_radio_cap, tvb, bit_offset, 4, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 4; + } + + /* < Ciphering Mode Setting Capability : bit > + * Extract Ciphering Mode Setting Capability + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_ciphering_mode_setting_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* < Additional Positioning Capabilities : bit > + * Extract Additional Positioning Capabilities + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_additional_positioning_caps, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * Release 8 starts here + * + * <E-UTRA FDD support : bit > -- Release 8 starts here. + * Extract E-UTRA FDD support + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * <E-UTRA TDD support : bit > + * Extract E-UTRA TDD support + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * <E-UTRA Measurement and Reporting support : bit > + * Extract E-UTRA Measurement and Reporting support + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_e_utra_meas_and_report_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * <Priority-based reselection support : bit > + * Extract Priority-based reselection support + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * Release 9 starts here + * + * <UTRA CSG Cells Reporting : bit > -- Release 9 starts here. + * Extract UTRA CSG Cells Reporting + */ + AVAILABLE_BITS_CHECK(1); + proto_tree_add_bits_item(tree, hf_gsm_a_utra_csg_cells_reporting, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 1; + + /* + * <VAMOS Level : bit(2) > + * Extract VAMOS Level + */ + AVAILABLE_BITS_CHECK(2); + proto_tree_add_bits_item(tree, hf_gsm_a_vamos_level, tvb, bit_offset, 2, ENC_BIG_ENDIAN); + bit_offset = bit_offset + 2; + + /* + * Add spare bits until we reach an octet boundary + */ + bits_left = (((len + offset) << 3) - bit_offset) & 0x07; + if (bits_left != 0) + { + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, bits_left, ENC_BIG_ENDIAN); + bit_offset += bits_left; + } + + /* translate to byte offset (we already know that we are on an octet boundary) */ + curr_offset = bit_offset >> 3; + EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); + + return(len); } /* * [3] 10.5.1.8 @@ -3044,7 +3046,7 @@ guint16 de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gint bit_offset; curr_offset = offset; - if (RIGHT_NIBBLE==len) + if (RIGHT_NIBBLE == len) bit_offset = 4; else bit_offset = 0; @@ -3061,70 +3063,70 @@ guint16 de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint16 de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint8 oct; - guint32 value; - guint32 curr_offset; - const gchar *str; - - curr_offset = offset; - - value = tvb_get_ntohl(tvb, curr_offset); - - other_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32); - proto_tree_add_text(tree, tvb, curr_offset, 4, - "%s = Group or Broadcast call reference: %u (0x%04x)", - a_bigbuf, - (value & 0xffffffe0) >> 5, - (value & 0xffffffe0) >> 5); - - other_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32); - proto_tree_add_text(tree, tvb, curr_offset, 4, - "%s = SF Service Flag: %s", - a_bigbuf, - (value & 0x00000010) ? - "VGCS (Group call reference)" : "VBS (Broadcast call reference)"); - - other_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32); - proto_tree_add_text(tree, tvb, curr_offset, 4, - "%s = AF Acknowledgement Flag: acknowledgment is %srequired", - a_bigbuf, - (value & 0x00000008) ? "" : "not "); - - switch (value & 0x00000007) - { - case 1: str = "call priority level 4"; break; - case 2: str = "call priority level 3"; break; - case 3: str = "call priority level 2"; break; - case 4: str = "call priority level 1"; break; - case 5: str = "call priority level 0"; break; - case 6: str = "call priority level B"; break; - case 7: str = "call priority level A"; break; - default: - str = "no priority applied"; - break; - } - - other_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32); - proto_tree_add_text(tree, tvb, curr_offset, 4, - "%s = Call Priority: %s", - a_bigbuf, - str); - - curr_offset += 4; - - oct = tvb_get_guint8(tvb, curr_offset); - - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, tvb, curr_offset, 1, - "%s = Ciphering Information", - a_bigbuf); - - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 4, ENC_BIG_ENDIAN); - curr_offset++; - - /* no length check possible */ - - return(curr_offset - offset); + guint8 oct; + guint32 value; + guint32 curr_offset; + const gchar *str; + + curr_offset = offset; + + value = tvb_get_ntohl(tvb, curr_offset); + + other_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32); + proto_tree_add_text(tree, tvb, curr_offset, 4, + "%s = Group or Broadcast call reference: %u (0x%04x)", + a_bigbuf, + (value & 0xffffffe0) >> 5, + (value & 0xffffffe0) >> 5); + + other_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32); + proto_tree_add_text(tree, tvb, curr_offset, 4, + "%s = SF Service Flag: %s", + a_bigbuf, + (value & 0x00000010) ? + "VGCS (Group call reference)" : "VBS (Broadcast call reference)"); + + other_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32); + proto_tree_add_text(tree, tvb, curr_offset, 4, + "%s = AF Acknowledgement Flag: acknowledgment is %srequired", + a_bigbuf, + (value & 0x00000008) ? "" : "not "); + + switch (value & 0x00000007) + { + case 1: str = "call priority level 4"; break; + case 2: str = "call priority level 3"; break; + case 3: str = "call priority level 2"; break; + case 4: str = "call priority level 1"; break; + case 5: str = "call priority level 0"; break; + case 6: str = "call priority level B"; break; + case 7: str = "call priority level A"; break; + default: + str = "no priority applied"; + break; + } + + other_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32); + proto_tree_add_text(tree, tvb, curr_offset, 4, + "%s = Call Priority: %s", + a_bigbuf, + str); + + curr_offset += 4; + + oct = tvb_get_guint8(tvb, curr_offset); + + other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); + proto_tree_add_text(tree, tvb, curr_offset, 1, + "%s = Ciphering Information", + a_bigbuf); + + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 4, ENC_BIG_ENDIAN); + curr_offset++; + + /* no length check possible */ + + return(curr_offset - offset); } /* @@ -3133,78 +3135,78 @@ de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint3 static guint16 de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint8 oct; - guint32 curr_offset; - proto_tree *subtree; - proto_item *item; - const gchar *str; + guint8 oct; + guint32 curr_offset; + proto_tree *subtree; + proto_item *item; + const gchar *str; - curr_offset = offset; + curr_offset = offset; - oct = tvb_get_guint8(tvb, curr_offset); + oct = tvb_get_guint8(tvb, curr_offset); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", - gsm_dtap_elem_strings[DE_PD_SAPI].strptr); + item = + proto_tree_add_text(tree, + tvb, curr_offset, 1, "%s", + gsm_dtap_elem_strings[DE_PD_SAPI].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]); + subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]); - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN); + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN); - switch ((oct & 0x30) >> 4) - { - case 0: str = "SAPI 0"; break; - case 3: str = "SAPI 3"; break; - default: - str = "Reserved"; - break; - } + switch ((oct & 0x30) >> 4) + { + case 0: str = "SAPI 0"; break; + case 3: str = "SAPI 3"; break; + default: + str = "Reserved"; + break; + } - other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8); - proto_tree_add_text(subtree, tvb, curr_offset, 1, - "%s = SAPI (Service Access Point Identifier): %s", - a_bigbuf, - str); + other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8); + proto_tree_add_text(subtree, tvb, curr_offset, 1, + "%s = SAPI (Service Access Point Identifier): %s", + a_bigbuf, + str); - proto_tree_add_item(tree, hf_gsm_a_L3_protocol_discriminator, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_L3_protocol_discriminator, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + curr_offset++; - /* no length check possible */ + /* no length check possible */ - return(curr_offset - offset); + return(curr_offset - offset); } /* * [3] 10.5.1.11 Priority Level */ static const value_string gsm_a_call_prio_vals[] = { - { 0x00, "no priority applied" }, - { 0x01, "call priority level 4" }, - { 0x02, "call priority level 3" }, - { 0x03, "call priority level 2" }, - { 0x04, "call priority level 1" }, - { 0x05, "call priority level 0" }, - { 0x06, "call priority level B" }, - { 0x07, "call priority level A" }, - { 0, NULL } + { 0x00, "no priority applied" }, + { 0x01, "call priority level 4" }, + { 0x02, "call priority level 3" }, + { 0x03, "call priority level 2" }, + { 0x04, "call priority level 1" }, + { 0x05, "call priority level 0" }, + { 0x06, "call priority level B" }, + { 0x07, "call priority level A" }, + { 0, NULL } }; static guint16 de_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; + guint32 curr_offset; - curr_offset = offset; + curr_offset = offset; - proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_bits_item(tree, hf_gsm_a_call_prio, tvb, (curr_offset<<3)+5, 3, ENC_BIG_ENDIAN); - curr_offset++; + proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_bits_item(tree, hf_gsm_a_call_prio, tvb, (curr_offset<<3)+5, 3, ENC_BIG_ENDIAN); + curr_offset++; - /* no length check possible */ + /* no length check possible */ - return(curr_offset - offset); + return(curr_offset - offset); } /* @@ -3213,42 +3215,42 @@ de_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint16 de_plmn_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) { - guint8 octs[3]; - guint32 curr_offset; - gchar mcc[4]; - gchar mnc[4]; - guint8 num_plmn; + guint8 octs[3]; + guint32 curr_offset; + gchar mcc[4]; + gchar mnc[4]; + guint8 num_plmn; - curr_offset = offset; + curr_offset = offset; - num_plmn = 0; - while ((len - (curr_offset - offset)) >= 3) - { - octs[0] = tvb_get_guint8(tvb, curr_offset); - octs[1] = tvb_get_guint8(tvb, curr_offset + 1); - octs[2] = tvb_get_guint8(tvb, curr_offset + 2); + num_plmn = 0; + while ((len - (curr_offset - offset)) >= 3) + { + octs[0] = tvb_get_guint8(tvb, curr_offset); + octs[1] = tvb_get_guint8(tvb, curr_offset + 1); + octs[2] = tvb_get_guint8(tvb, curr_offset + 2); - mcc_mnc_aux(octs, mcc, mnc); + mcc_mnc_aux(octs, mcc, mnc); - proto_tree_add_text(tree, - tvb, curr_offset, 3, - "PLMN[%u] Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s", - num_plmn + 1, - mcc, - mnc); + proto_tree_add_text(tree, + tvb, curr_offset, 3, + "PLMN[%u] Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s", + num_plmn + 1, + mcc, + mnc); - curr_offset += 3; + curr_offset += 3; - num_plmn++; - } + num_plmn++; + } - if (add_string) - g_snprintf(add_string, string_len, " - %u PLMN%s", - num_plmn, plurality(num_plmn, "", "s")); + if (add_string) + g_snprintf(add_string, string_len, " - %u PLMN%s", + num_plmn, plurality(num_plmn, "", "s")); - EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); + EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); - return(curr_offset - offset); + return(curr_offset - offset); } /* * 10.5.1.14 NAS container for PS HO @@ -3256,887 +3258,882 @@ de_plmn_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset static const value_string gsm_a_pld_xid_vals[] = { - { 0x00, "The MS shall perform a Reset of LLC and SNDCP without old XID indicator" }, - { 0x01, "The MS shall perform a Reset of LLC and SNDCP with old XID indicator" }, - { 0, NULL } + { 0x00, "The MS shall perform a Reset of LLC and SNDCP without old XID indicator" }, + { 0x01, "The MS shall perform a Reset of LLC and SNDCP with old XID indicator" }, + { 0, NULL } }; guint16 de_nas_cont_for_ps_ho(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; + guint32 curr_offset; - curr_offset = offset; + curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len, "IE not dissected yet"); - /* 8 7 6 5 4 3 2 1 - * 0 0 0 old 0 Type of ciphering - * spare spare spare XID spare algorithm - */ - proto_tree_add_item(tree, hf_gsm_a_old_xid, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_gsm_a_type_of_ciph_alg, tvb, curr_offset, 1, ENC_BIG_ENDIAN); - curr_offset++; + proto_tree_add_text(tree, tvb, curr_offset, len, "IE not dissected yet"); + /* 8 7 6 5 4 3 2 1 + * 0 0 0 old 0 Type of ciphering + * spare spare spare XID spare algorithm + */ + proto_tree_add_item(tree, hf_gsm_a_old_xid, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_gsm_a_type_of_ciph_alg, tvb, curr_offset, 1, ENC_BIG_ENDIAN); + curr_offset++; - /* IOV-UI value (octet 2 to 5) - * The IOV-UI value consists of 32 bits, the format is defined in 3GPP TS 44.064 [78a]. - */ - proto_tree_add_item(tree, hf_gsm_a_iov_ui, tvb, curr_offset, 4, ENC_BIG_ENDIAN); - curr_offset+=4; + /* IOV-UI value (octet 2 to 5) + * The IOV-UI value consists of 32 bits, the format is defined in 3GPP TS 44.064 [78a]. + */ + proto_tree_add_item(tree, hf_gsm_a_iov_ui, tvb, curr_offset, 4, ENC_BIG_ENDIAN); + curr_offset += 4; - EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); + EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo); - return(curr_offset - offset); + return(curr_offset - offset); } guint16 (*common_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) = { - /* Common Information Elements 10.5.1 */ - de_cell_id, /* Cell Identity */ - de_ciph_key_seq_num, /* Ciphering Key Sequence Number */ - de_lai, /* Location Area Identification */ - de_mid, /* Mobile Identity */ - de_ms_cm_1, /* Mobile Station Classmark 1 */ - de_ms_cm_2, /* Mobile Station Classmark 2 */ - de_ms_cm_3, /* Mobile Station Classmark 3 */ - de_spare_nibble, /* Spare Half Octet */ - de_d_gb_call_ref, /* Descriptive group or broadcast call reference */ - NULL /* handled inline */, /* Group Cipher Key Number */ - de_pd_sapi, /* PD and SAPI $(CCBS)$ */ - /* Pos 10 */ - de_prio /* handled inline */, /* Priority Level */ - de_plmn_list, /* 10.5.1.13 PLMN list */ - de_nas_cont_for_ps_ho, /* 10.5.1.14 NAS container for PS HO */ - NULL, /* NONE */ + /* Common Information Elements 10.5.1 */ + de_cell_id, /* Cell Identity */ + de_ciph_key_seq_num, /* Ciphering Key Sequence Number */ + de_lai, /* Location Area Identification */ + de_mid, /* Mobile Identity */ + de_ms_cm_1, /* Mobile Station Classmark 1 */ + de_ms_cm_2, /* Mobile Station Classmark 2 */ + de_ms_cm_3, /* Mobile Station Classmark 3 */ + de_spare_nibble, /* Spare Half Octet */ + de_d_gb_call_ref, /* Descriptive group or broadcast call reference */ + NULL /* handled inline */, /* Group Cipher Key Number */ + de_pd_sapi, /* PD and SAPI $(CCBS)$ */ + /* Pos 10 */ + de_prio /* handled inline */, /* Priority Level */ + de_plmn_list, /* 10.5.1.13 PLMN list */ + de_nas_cont_for_ps_ho, /* 10.5.1.14 NAS container for PS HO */ + NULL, /* NONE */ }; /* Register the protocol with Wireshark */ void proto_register_gsm_a_common(void) { - guint i; - guint last_offset; - - /* Setup list of header fields */ - static hf_register_info hf[] = - { - { &hf_gsm_a_common_elem_id, - { "Element ID", "gsm_a_common.elem_id", - FT_UINT8, BASE_DEC, NULL, 0, - NULL, HFILL } - }, - { &hf_gsm_a_l_ext, - { "ext", "gsm_a_common.l_ext", - FT_UINT8, BASE_DEC, NULL, 0x80, - NULL, HFILL } - }, - { &hf_gsm_a_imsi, - { "IMSI", "gsm_a.imsi", - FT_STRING, BASE_NONE, 0, 0, - NULL, HFILL } - }, - { &hf_gsm_a_tmsi, - { "TMSI/P-TMSI", "gsm_a.tmsi", - FT_UINT32, BASE_HEX, 0, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_imei, - { "IMEI", "gsm_a.imei", - FT_STRING, BASE_NONE, 0, 0, - NULL, HFILL } - }, - { &hf_gsm_a_imeisv, - { "IMEISV", "gsm_a.imeisv", - FT_STRING, BASE_NONE, 0, 0, - NULL, HFILL } - }, - { &hf_gsm_a_MSC_rev, - { "Revision Level","gsm_a.MSC2_rev", - FT_UINT8,BASE_DEC, VALS(gsm_a_msc_rev_vals), 0x60, - NULL, HFILL } - }, - { &hf_gsm_a_ES_IND, - { "ES IND","gsm_a.MSC2_rev", - FT_BOOLEAN,8, TFS(&ES_IND_vals), 0x10, - NULL, HFILL } - }, - { &hf_gsm_a_A5_1_algorithm_sup, - { "A5/1 algorithm supported","gsm_a.MSC2_rev", - FT_BOOLEAN,8, TFS(&A5_1_algorithm_sup_vals), 0x08, - NULL, HFILL } - }, - { &hf_gsm_a_RF_power_capability, - { "RF Power Capability","gsm_a.MSC2_rev", - FT_UINT8,BASE_DEC, VALS(RF_power_capability_vals), 0x07, - NULL, HFILL } - }, - { &hf_gsm_a_ps_sup_cap, - { "PS capability (pseudo-synchronization capability)","gsm_a.ps_sup_cap", - FT_BOOLEAN,8, TFS(&ps_sup_cap_vals), 0x40, - NULL, HFILL } - }, - { &hf_gsm_a_SS_screening_indicator, - { "SS Screening Indicator","gsm_a.SS_screening_indicator", - FT_UINT8,BASE_DEC, VALS(SS_screening_indicator_vals), 0x30, - NULL, HFILL } - }, - { &hf_gsm_a_SM_capability, - { "SM capability (MT SMS pt to pt capability)","gsm_a.SM_cap", - FT_BOOLEAN,8, TFS(&SM_capability_vals), 0x08, - NULL, HFILL } - }, - { &hf_gsm_a_VBS_notification_rec, - { "VBS notification reception","gsm_a.VBS_notification_rec", - FT_BOOLEAN,8, TFS(&VBS_notification_rec_vals), 0x04, - NULL, HFILL } - }, - { &hf_gsm_a_VGCS_notification_rec, - { "VGCS notification reception","gsm_a.VGCS_notification_rec", - FT_BOOLEAN,8, TFS(&VGCS_notification_rec_vals), 0x02, - NULL, HFILL } - }, - { &hf_gsm_a_FC_frequency_cap, - { "FC Frequency Capability","gsm_a.FC_frequency_cap", - FT_BOOLEAN,8, TFS(&FC_frequency_cap_vals), 0x01, - NULL, HFILL } - }, - { &hf_gsm_a_CM3, - { "CM3","gsm_a.CM3", - FT_BOOLEAN,8, TFS(&CM3_vals), 0x80, - NULL, HFILL } - }, - { &hf_gsm_a_LCS_VA_cap, - { "LCS VA capability (LCS value added location request notification capability)","gsm_a.LCS_VA_cap", - FT_BOOLEAN,8, TFS(&LCS_VA_cap_vals), 0x20, - NULL, HFILL } - }, - { &hf_gsm_a_UCS2_treatment, - { "UCS2 treatment","gsm_a.UCS2_treatment", - FT_BOOLEAN,8, TFS(&UCS2_treatment_vals), 0x10, - NULL, HFILL } - }, - { &hf_gsm_a_SoLSA, - { "SoLSA","gsm_a.SoLSA", - FT_BOOLEAN,8, TFS(&SoLSA_vals), 0x08, - NULL, HFILL } - }, - { &hf_gsm_a_CMSP, - { "CMSP: CM Service Prompt","gsm_a.CMSP", - FT_BOOLEAN,8, TFS(&CMSP_vals), 0x04, - NULL, HFILL } - }, - { &hf_gsm_a_A5_7_algorithm_sup, - { "A5/7 algorithm supported","gsm_a.A5_7_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_7_algorithm_sup_vals), 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_A5_6_algorithm_sup, - { "A5/6 algorithm supported","gsm_a.A5_6_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_6_algorithm_sup_vals), 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_A5_5_algorithm_sup, - { "A5/5 algorithm supported","gsm_a.A5_5_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_5_algorithm_sup_vals), 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_A5_4_algorithm_sup, - { "A5/4 algorithm supported","gsm_a.A5_4_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_4_algorithm_sup_vals), 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_A5_3_algorithm_sup, - { "A5/3 algorithm supported","gsm_a.A5_3_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_3_algorithm_sup_vals), 0x02, - NULL, HFILL } - }, - { &hf_gsm_a_A5_2_algorithm_sup, - { "A5/2 algorithm supported","gsm_a.A5_2_algorithm_sup", - FT_BOOLEAN,8, TFS(&A5_2_algorithm_sup_vals), 0x01, - NULL, HFILL } - }, - { &hf_gsm_a_mobile_identity_type, - { "Mobile Identity Type","gsm_a.ie.mobileid.type", - FT_UINT8, BASE_DEC, VALS(mobile_identity_type_vals), 0x07, - NULL, HFILL } - }, - { &hf_gsm_a_odd_even_ind, - { "Odd/even indication","gsm_a.oddevenind", - FT_BOOLEAN, 8, TFS(&oddevenind_vals), 0x08, - NULL, HFILL } - }, - { &hf_gsm_a_tmgi_mcc_mnc_ind, - { "MCC/MNC indication", "gsm_a.tmgi_mcc_mnc_ind", - FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x10, - NULL, HFILL} - }, - { &hf_gsm_a_mbs_ses_id_ind, - { "MBMS Session Identity indication", "gsm_a.mbs_session_id_ind", - FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x20, - NULL, HFILL} - }, - { &hf_gsm_a_mbs_service_id, - { "MBMS Service ID", "gsm_a.mbs_service_id", - FT_UINT24, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_mbs_session_id, - { "MBMS Session ID", "gsm_a.mbs_session_id", - FT_UINT8, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_L3_protocol_discriminator, - { "Protocol discriminator","gsm_a.L3_protocol_discriminator", - FT_UINT8,BASE_DEC, VALS(protocol_discriminator_vals), 0x0f, - NULL, HFILL } - }, - { &hf_gsm_a_call_prio, - { "Call priority", "gsm_a.call_prio", - FT_UINT8, BASE_DEC, VALS(gsm_a_call_prio_vals), 0x00, - NULL, HFILL } - }, - { &hf_gsm_a_type_of_ciph_alg, - { "Call priority", "gsm_a.call_prio", - FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_ciph_alg_vals), 0x07, - NULL, HFILL } - }, - { &hf_gsm_a_old_xid, - { "Old XID", "gsm_a.old_xid", - FT_UINT8, BASE_DEC, VALS(gsm_a_pld_xid_vals), 0x10, - NULL, HFILL } - }, - { &hf_gsm_a_iov_ui, - { "IOV-UI", "gsm_a.iov_ui", - FT_UINT32, BASE_HEX, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_skip_ind, - { "Skip Indicator", "gsm_a.skip.ind", - FT_UINT8, BASE_DEC, NULL, 0xf0, - NULL, HFILL } - }, - { &hf_gsm_a_b7spare, - { "Spare","gsm_a.spareb7", - FT_UINT8,BASE_DEC, NULL, 0x40, - NULL, HFILL } - }, - { &hf_gsm_a_b8spare, - { "Spare","gsm_a.spareb8", - FT_UINT8,BASE_DEC, NULL, 0x80, - NULL, HFILL } - }, - { &hf_gsm_a_spare_bits, - { "Spare bit(s)","gsm_a.spare_bits", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_multi_bnd_sup_fields, - { "Multiband supported field","gsm_a.multi_bnd_sup_fields", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_pgsm_supported, - { "P-GSM Supported", "gsm_a.classmark3.pgsmSupported", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_egsm_supported, - { "E-GSM or R-GSM Supported", "gsm_a.classmark3.egsmSupported", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_gsm1800_supported, - { "GSM 1800 Supported", "gsm_a.classmark3.gsm1800Supported", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ass_radio_cap1, - { "Associated Radio Capability 1", "gsm_a.classmark3.ass_radio_cap1", - FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ass_radio_cap2, - { "Associated Radio Capability 2", "gsm_a.classmark3.ass_radio_cap2", - FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_cm3_A5_bits, - { "A5 bits", "gsm_a.classmark3.a5_bits", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_rsupport, - { "R Support", "gsm_a.classmark3.rsupport", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_r_capabilities, - { "R-GSM band Associated Radio Capability", "gsm_a.classmark3.r_capabilities", - FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_multislot_capabilities, - { "HSCSD Multi Slot Capability", "gsm_a.classmark3.multislot_capabilities", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_multislot_class, - { "HSCSD Multi Slot Class", "gsm_a.classmark3.multislot_cap", - FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ucs2_treatment, - { "UCS2 treatment","gsm_a.UCS2_treatment", - FT_BOOLEAN,8, TFS(&UCS2_treatment_vals), 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_extended_measurement_cap, - { "Extended Measurement Capability", "gsm_a.classmark3.ext_meas_cap", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_measurement_capability, - { "MS measurement capability", "gsm_a.classmark3.ms_measurement_capability", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_sms_value, - { "SMS_VALUE (Switch-Measure-Switch)", "gsm_a.classmark3.sms_value", - FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_sm_value, - { "SM_VALUE (Switch-Measure)", "gsm_a.classmark3.sm_value", - FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_pos_method_cap_present, - { "MS Positioning Method Capability present", "gsm_a.classmark3.ms_pos_method_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ms_pos_method, - { "MS Positioning Method", "gsm_a.classmark3.ms_pos_method", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ms_assisted_e_otd, - { "MS assisted E-OTD", "gsm_a.classmark3.ms_assisted_e_otd", - FT_BOOLEAN, 8, TFS(&ms_assisted_e_otd_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_based_e_otd, - { "MS based E-OTD", "gsm_a.classmark3.ms_based_e_otd", - FT_BOOLEAN, 8, TFS(&ms_based_e_otd_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_assisted_gps, - { "MS assisted GPS", "gsm_a.classmark3.ms_assisted_gps", - FT_BOOLEAN, 8, TFS(&ms_assisted_gps_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_based_gps, - { "MS based GPS", "gsm_a.classmark3.ms_based_gps", - FT_BOOLEAN, 8, TFS(&ms_based_gps_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ms_conventional_gps, - { "MS Conventional GPS", "gsm_a.classmark3.ms_conventional_gps", - FT_BOOLEAN, 8, TFS(&ms_conventional_gps_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_ecsd_multi_slot_capability, - { "ECSD Multi Slot Capability present", "gsm_a.classmark3.ecsd_multi_slot_capability", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ecsd_multi_slot_class, - { "ECSD Multi Slot Class", "gsm_a.classmark3.ecsd_multi_slot_class", - FT_UINT8, BASE_DEC, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_8_psk_struct_present, - { "8-PSK Struct present", "gsm_a.classmark3.8_psk_struct_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_8_psk_struct, - { "8-PSK Struct", "gsm_a.classmark3.8_psk_struct", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_modulation_capability, - { "Modulation Capability", "gsm_a.classmark3.modulation_capability", - FT_BOOLEAN, 8, TFS(&modulation_capability_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_8_psk_rf_power_capability_1, - { "8-PSK RF Power Capability 1", "gsm_a.classmark3.8_psk_rf_power_capability_1", - FT_UINT8, BASE_HEX, VALS(eight_psk_rf_power_capability_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_8_psk_rf_power_capability_2, - { "8-PSK RF Power Capability 2", "gsm_a.classmark3.8_psk_rf_power_capability_2", - FT_UINT8, BASE_HEX, VALS(eight_psk_rf_power_capability_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_400_band_info_present, - { "GSM 400 Band Information present", "gsm_a.classmark3.gsm_400_band_info_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_400_bands_supported, - { "GSM 400 Bands Supported", "gsm_a.classmark3.gsm_400_bands_supported", - FT_UINT8, BASE_HEX, VALS(gsm_400_bands_supported_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_400_assoc_radio_cap, - { "GSM 400 Associated Radio Capability", "gsm_a.classmark3.gsm_400_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_850_assoc_radio_cap_present, - { "GSM 850 Associated Radio Capability present", "gsm_a.classmark3.gsm_850_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_850_assoc_radio_cap, - { "GSM 850 Associated Radio Capability", "gsm_a.classmark3.gsm_850_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_1900_assoc_radio_cap_present, - { "GSM 1900 Associated Radio Capability present", "gsm_a.classmark3.gsm_1900_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_1900_assoc_radio_cap, - { "GSM 1900 Associated Radio Capability", "gsm_a.classmark3.gsm_1900_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_umts_fdd_rat_cap, - { "UMTS FDD Radio Access Technology Capability", "gsm_a.classmark3.umts_fdd_rat_cap", - FT_BOOLEAN, 8, TFS(&umts_fdd_rat_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_umts_384_mcps_tdd_rat_cap, - { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.classmark3.umts_384_mcps_tdd_rat_cap", - FT_BOOLEAN, 8, TFS(&umts_384_mcps_tdd_rat_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_cdma_2000_rat_cap, - { "CDMA 2000 Radio Access Technology Capability", "gsm_a.classmark3.cdma_2000_rat_cap", - FT_BOOLEAN, 8, TFS(&cdma_2000_rat_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_e_gprs_multi_slot_info_present, - { "DTM E/GPRS Multi Slot Information present", "gsm_a.classmark3.dtm_e_gprs_multi_slot_info_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_gprs_multi_slot_class, - { "DTM GPRS Multi Slot Class", "gsm_a.classmark3.dtm_gprs_multi_slot_class", - FT_UINT8, BASE_DEC, VALS(dtm_gprs_multi_slot_class_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_single_slot_dtm, - { "Single Slot DTM", "gsm_a.classmark3.single_slot_dtm_supported", - FT_BOOLEAN, 8, TFS(&single_slot_dtm_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_egprs_multi_slot_class_present, - { "DTM EGPRS Multi Slot Class present", "gsm_a.classmark3.dtm_egprs_multi_slot_class_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_egprs_multi_slot_class, - { "DTM EGPRS Multi Slot Class", "gsm_a.classmark3.dtm_egprs_multi_slot_class", - FT_UINT8, BASE_DEC, VALS(dtm_gprs_multi_slot_class_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_single_band_support, - { "Single Band Support", "gsm_a.classmark3.single_band_support", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_band, - { "GSM Band", "gsm_a.classmark3.gsm_band", - FT_UINT8, BASE_DEC, VALS(gsm_band_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_750_assoc_radio_cap_present, - { "GSM 750 Associated Radio Capability present", "gsm_a.classmark3.gsm_750_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_750_assoc_radio_cap, - { "GSM 750 Associated Radio Capability", "gsm_a.classmark3.gsm_750_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_umts_128_mcps_tdd_rat_cap, - { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.classmark3.umts_128_mcps_tdd_rat_cap", - FT_BOOLEAN, 8, TFS(&umts_128_mcps_tdd_rat_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geran_feature_package_1, - { "GERAN Feature Package 1", "gsm_a.classmark3.geran_feature_package_1", - FT_BOOLEAN, 8, TFS(&geran_feature_package_1_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present, - { "Extended DTM E/GPRS Multi Slot Information present", "gsm_a.classmark3.ext_dtm_e_gprs_info_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ext_dtm_gprs_multi_slot_class, - { "Extended DTM GPRS Multi Slot Class", "gsm_a.classmark3.ext_dtm_gprs_multi_slot_class", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ext_dtm_egprs_multi_slot_class, - { "Extended DTM EGPRS Multi Slot Class", "gsm_a.classmark3.ext_dtm_egprs_multi_slot_class", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_high_multislot_cap_present, - { "High Multislot Capability present", "gsm_a.classmark3.high_multislot_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_high_multislot_cap, - { "High Multislot Capability", "gsm_a.classmark3.high_multislot_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geran_iu_mode_support, - { "GERAN Iu Mode Support", "gsm_a.classmark3.geran_iu_mode_support", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geran_iu_mode_cap, - { "GERAN Iu Mode Capabilities", "gsm_a.classmark3.geran_iu_mode_cap", - FT_UINT24, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geran_iu_mode_cap_length, - { "Length", "gsm_a.classmark3.geran_iu_mode_cap.length", - FT_UINT8, BASE_DEC, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_flo_iu_cap, - { "FLO Iu Capability", "gsm_a.classmark3.geran_iu_mode_cap.flo_iu_cap", - FT_BOOLEAN, 8, TFS(&flo_iu_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geran_feature_package_2, - { "GERAN Feature Package 2", "gsm_a.classmark3.geran_feature_package_2", - FT_BOOLEAN, 8, TFS(&geran_feature_package_2_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gmsk_multislot_power_prof, - { "GMSK Multislot Power Profile", "gsm_a.classmark3.gmsk_multislot_power_prof", - FT_UINT8, BASE_DEC, VALS(gmsk_multislot_power_prof_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_8_psk_multislot_power_prof, - { "8-PSK Multislot Power Profile", "gsm_a.classmark3.8_psk_multislot_power_prof", - FT_UINT8, BASE_DEC, VALS(eight_psk_multislot_power_prof_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_400_band_info_present, - { "T-GSM 400 Band Information present", "gsm_a.classmark3.gsm_400_band_info_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_400_bands_supported, - { "T-GSM 400 Bands Supported", "gsm_a.classmark3.t_gsm_400_bands_supported", - FT_UINT8, BASE_HEX, VALS(t_gsm_400_bands_supported_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_400_assoc_radio_cap, - { "T-GSM 400 Associated Radio Capability", "gsm_a.classmark3.t_gsm_400_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_900_assoc_radio_cap_present, - { "T-GSM 900 Associated Radio Capability present", "gsm_a.classmark3.t_gsm_900_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_900_assoc_radio_cap, - { "T-GSM 900 Associated Radio Capability", "gsm_a.classmark3.t_gsm_900_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_downlink_adv_receiver_perf, - { "Downlink Advanced Receiver Performance", "gsm_a.classmark3.downlink_adv_receiver_perf", - FT_UINT8, BASE_DEC, VALS(downlink_adv_receiver_perf_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_enhancements_cap, - { "DTM Enhancements Capability", "gsm_a.classmark3.dtm_enhancements_capability", - FT_BOOLEAN, 8, TFS(&dtm_enhancements_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present, - { "DTM E/GPRS High Multi Slot Information present", "gsm_a.classmark3.dtm_e_gprs_high_mutli_slot_info_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_gprs_high_multi_slot_class, - { "DTM GPRS Multi Slot Class", "gsm_a.classmark3.dtm_gprs_multi_slot_class", - FT_UINT8, BASE_DEC, VALS(dtm_gprs_high_multi_slot_class_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_offset_required, - { "Offset required", "gsm_a.classmark3.offset_required", - FT_BOOLEAN, 8, TFS(&offset_required_vals), 0x0, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_egprs_high_multi_slot_class_present, - { "DTM EGPRS High Multi Slot Class present", "gsm_a.classmark3.dtm_egprs_high_multi_slot_class_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_dtm_egprs_high_multi_slot_class, - { "DTM EGPRS High Multi Slot Class", "gsm_a.classmark3.dtm_egprs_high_multi_slot_class", - FT_UINT8, BASE_DEC, VALS(dtm_gprs_high_multi_slot_class_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_repeated_acch_cap, - { "Repeated ACCH Capability", "gsm_a.classmark3.repeated_acch_cap", - FT_BOOLEAN, 8, TFS(&repeated_acch_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_710_assoc_radio_cap_present, - { "GSM 710 Associated Radio Capability present", "gsm_a.classmark3.gsm_710_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_gsm_710_assoc_radio_cap, - { "GSM 710 Associated Radio Capability", "gsm_a.classmark3.gsm_710_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_810_assoc_radio_cap_present, - { "T-GSM 810 Associated Radio Capability present", "gsm_a.classmark3.t_gsm_810_assoc_radio_cap_present", - FT_BOOLEAN, 8, TFS(&true_false_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_t_gsm_810_assoc_radio_cap, - { "T-GSM 810 Associated Radio Capability", "gsm_a.classmark3.t_gsm_810_assoc_radio_cap", - FT_UINT8, BASE_HEX, NULL, 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_ciphering_mode_setting_cap, - { "Ciphering Mode Setting Capability", "gsm_a.classmark3.ciphering_mode_setting_cap", - FT_BOOLEAN, 8, TFS(&ciphering_mode_setting_cap_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_additional_positioning_caps, - { "Additional Positioning Capabilities", "gsm_a.classmark3.additional_positioning_caps", - FT_BOOLEAN, 8, TFS(&additional_positioning_caps_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_e_utra_fdd_support, - { "E-UTRA FDD support", "gsm_a.classmark3.e_utra_fdd_support", - FT_BOOLEAN, 8, TFS(&e_utra_fdd_support_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_e_utra_tdd_support, - { "E-UTRA TDD support", "gsm_a.classmark3.e_utra_tdd_support", - FT_BOOLEAN, 8, TFS(&e_utra_tdd_support_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_e_utra_meas_and_report_support, - { "E-UTRA Measurement and Reporting support", "gsm_a.classmark3.e_utra_meas_and_report_support", - FT_BOOLEAN, 8, TFS(&e_utra_meas_and_report_support_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_prio_based_resel_support, - { "Priority-based reselection support", "gsm_a.classmark3.prio_based_resel_support", - FT_BOOLEAN, 8, TFS(&prio_based_resel_support_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_utra_csg_cells_reporting, - { "UTRA CSG Cells Reporting", "gsm_a.classmark3.utra_csg_cells_reporting", - FT_BOOLEAN, 8, TFS(&utra_csg_cells_reporting_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_vamos_level, - { "VAMOS Level", "gsm_a.classmark3.vamos_level", - FT_UINT8, BASE_DEC, VALS(vamos_level_vals), 0x00, - NULL, HFILL} - }, - { &hf_gsm_a_geo_loc_type_of_shape, - { "Location estimate","gsm_a.gad.location_estimate", - FT_UINT8,BASE_DEC, VALS(type_of_shape_vals), 0xf0, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_sign_of_lat, - { "Sign of latitude","gsm_a.gad.sign_of_latitude", - FT_UINT8,BASE_DEC, VALS(sign_of_latitude_vals), 0x80, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_deg_of_lat, - { "Degrees of latitude","gsm_a.gad.sign_of_latitude", - FT_UINT24,BASE_DEC, NULL, 0x7fffff, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_deg_of_long, - { "Degrees of longitude","gsm_a.gad.sign_of_longitude", - FT_UINT24,BASE_DEC, NULL, 0xffffff, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_uncertainty_code, - { "Uncertainty code","gsm_a.gad.uncertainty_code", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_uncertainty_semi_major, - { "Uncertainty semi-major","gsm_a.gad.uncertainty_semi_major", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_uncertainty_semi_minor, - { "Uncertainty semi-minor","gsm_a.gad.uncertainty_semi_minor", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_orientation_of_major_axis, - { "Orientation of major axis","gsm_a.gad.orientation_of_major_axis", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_uncertainty_altitude, - { "Uncertainty Altitude","gsm_a.gad.uncertainty_altitude", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_confidence, - { "Confidence(%)","gsm_a.gad.confidence", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_no_of_points, - { "Number of points","gsm_a.gad.no_of_points", - FT_UINT8,BASE_DEC, NULL, 0x0f, - NULL, HFILL } - }, - { &hf_gsm_a_velocity_type, - { "Number of points","gsm_a.gad.velocity_type", - FT_UINT8,BASE_DEC, VALS(gsm_a_velocity_type_vals), 0xf0, - NULL, HFILL } - }, - { &hf_gsm_a_bearing, - { "Bearing","gsm_a.gad.bearing", - FT_UINT16,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_horizontal_speed, - { "Horizontal Speed","gsm_a.gad.horizontal_velocity", - FT_UINT16,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_vertical_speed, - { "Vertical Speed","gsm_a.gad.vertical_speed", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_uncertainty_speed, - { "Uncertainty Speed","gsm_a.gad.uncertainty_speed", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_h_uncertainty_speed, - { "Horizontal Uncertainty Speed","gsm_a.gad.v_uncertainty_speed", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_v_uncertainty_speed, - { "Vertical Uncertainty Speed","gsm_a.gad.h_uncertainty_speed", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_d, - { "Direction of Vertical Speed", "gsm_a.gad.d", - FT_BOOLEAN, 8, TFS(&gsm_a_dir_of_ver_speed_vals), 0x08, - NULL, HFILL} - }, - { &hf_gsm_a_geo_loc_D, - { "D: Direction of Altitude","gsm_a.gad.D", - FT_UINT16,BASE_DEC, VALS(dir_of_alt_vals), 0x8000, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_altitude, - { "Altitude in meters","gsm_a.gad.altitude", - FT_UINT16,BASE_DEC, NULL, 0x7fff, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_inner_radius, - { "Inner radius","gsm_a.gad.altitude", - FT_UINT16,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_uncertainty_radius, - { "Uncertainty radius","gsm_a.gad.no_of_points", - FT_UINT8,BASE_DEC, NULL, 0x7f, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_offset_angle, - { "Offset angle","gsm_a.gad.offset_angle", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_geo_loc_included_angle, - { "Included angle","gsm_a.gad.included_angle", - FT_UINT8,BASE_DEC, NULL, 0x0, - NULL, HFILL } - }, - { &hf_gsm_a_key_seq, - { "key sequence","gsm_a.key_seq", - FT_UINT8,BASE_DEC, VALS(gsm_a_key_seq_vals), 0x07, - NULL, HFILL } - }, - { &hf_gsm_a_lac, - { "Location Area Code (LAC)","gsm_a.lac", - FT_UINT16, BASE_HEX_DEC, NULL, 0x00, - NULL, HFILL } - }, - { &hf_gsm_a_spare_nibble, - { "Spare Nibble","gsm_a.spare", - FT_UINT8, BASE_DEC_HEX, NULL, 0x00, - NULL, HFILL } - }, - }; - - /* Setup protocol subtree array */ -#define NUM_INDIVIDUAL_ELEMS 0 - static gint *ett[NUM_INDIVIDUAL_ELEMS + - NUM_GSM_COMMON_ELEM]; - - last_offset = NUM_INDIVIDUAL_ELEMS; - - for (i=0; i < NUM_GSM_COMMON_ELEM; i++, last_offset++) - { - ett_gsm_common_elem[i] = -1; - ett[last_offset] = &ett_gsm_common_elem[i]; - } - - /* Register the protocol name and description */ - - proto_a_common = - proto_register_protocol("GSM A-I/F COMMON", "GSM COMMON", "gsm_a_common"); - - proto_register_field_array(proto_a_common, hf, array_length(hf)); - - proto_register_subtree_array(ett, array_length(ett)); - - gsm_a_tap = register_tap("gsm_a"); + guint i; + guint last_offset; + + /* Setup list of header fields */ + static hf_register_info hf[] = + { + { &hf_gsm_a_common_elem_id, + { "Element ID", "gsm_a_common.elem_id", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_gsm_a_l_ext, + { "ext", "gsm_a_common.l_ext", + FT_UINT8, BASE_DEC, NULL, 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_imsi, + { "IMSI", "gsm_a.imsi", + FT_STRING, BASE_NONE, 0, 0, + NULL, HFILL } + }, + { &hf_gsm_a_tmsi, + { "TMSI/P-TMSI", "gsm_a.tmsi", + FT_UINT32, BASE_HEX, 0, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_imei, + { "IMEI", "gsm_a.imei", + FT_STRING, BASE_NONE, 0, 0, + NULL, HFILL } + }, + { &hf_gsm_a_imeisv, + { "IMEISV", "gsm_a.imeisv", + FT_STRING, BASE_NONE, 0, 0, + NULL, HFILL } + }, + { &hf_gsm_a_MSC_rev, + { "Revision Level", "gsm_a.MSC2_rev", + FT_UINT8, BASE_DEC, VALS(gsm_a_msc_rev_vals), 0x60, + NULL, HFILL } + }, + { &hf_gsm_a_ES_IND, + { "ES IND", "gsm_a.MSC2_rev", + FT_BOOLEAN, 8, TFS(&ES_IND_vals), 0x10, + NULL, HFILL } + }, + { &hf_gsm_a_A5_1_algorithm_sup, + { "A5/1 algorithm supported", "gsm_a.MSC2_rev", + FT_BOOLEAN, 8, TFS(&A5_1_algorithm_sup_vals), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_RF_power_capability, + { "RF Power Capability", "gsm_a.MSC2_rev", + FT_UINT8, BASE_DEC, VALS(RF_power_capability_vals), 0x07, + NULL, HFILL } + }, + { &hf_gsm_a_ps_sup_cap, + { "PS capability (pseudo-synchronization capability)", "gsm_a.ps_sup_cap", + FT_BOOLEAN, 8, TFS(&ps_sup_cap_vals), 0x40, + NULL, HFILL } + }, + { &hf_gsm_a_SS_screening_indicator, + { "SS Screening Indicator", "gsm_a.SS_screening_indicator", + FT_UINT8, BASE_DEC, VALS(SS_screening_indicator_vals), 0x30, + NULL, HFILL } + }, + { &hf_gsm_a_SM_capability, + { "SM capability (MT SMS pt to pt capability)", "gsm_a.SM_cap", + FT_BOOLEAN, 8, TFS(&SM_capability_vals), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_VBS_notification_rec, + { "VBS notification reception", "gsm_a.VBS_notification_rec", + FT_BOOLEAN, 8, TFS(&VBS_notification_rec_vals), 0x04, + NULL, HFILL } + }, + { &hf_gsm_a_VGCS_notification_rec, + { "VGCS notification reception", "gsm_a.VGCS_notification_rec", + FT_BOOLEAN, 8, TFS(&VGCS_notification_rec_vals), 0x02, + NULL, HFILL } + }, + { &hf_gsm_a_FC_frequency_cap, + { "FC Frequency Capability", "gsm_a.FC_frequency_cap", + FT_BOOLEAN, 8, TFS(&FC_frequency_cap_vals), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_CM3, + { "CM3", "gsm_a.CM3", + FT_BOOLEAN, 8, TFS(&CM3_vals), 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_LCS_VA_cap, + { "LCS VA capability (LCS value added location request notification capability)", "gsm_a.LCS_VA_cap", + FT_BOOLEAN, 8, TFS(&LCS_VA_cap_vals), 0x20, + NULL, HFILL } + }, + { &hf_gsm_a_UCS2_treatment, + { "UCS2 treatment", "gsm_a.UCS2_treatment", + FT_BOOLEAN, 8, TFS(&UCS2_treatment_vals), 0x10, + NULL, HFILL } + }, + { &hf_gsm_a_SoLSA, + { "SoLSA", "gsm_a.SoLSA", + FT_BOOLEAN, 8, TFS(&SoLSA_vals), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_CMSP, + { "CMSP: CM Service Prompt", "gsm_a.CMSP", + FT_BOOLEAN, 8, TFS(&CMSP_vals), 0x04, + NULL, HFILL } + }, + { &hf_gsm_a_A5_7_algorithm_sup, + { "A5/7 algorithm supported", "gsm_a.A5_7_algorithm_sup", + FT_BOOLEAN, BASE_NONE, TFS(&A5_7_algorithm_sup_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_A5_6_algorithm_sup, + { "A5/6 algorithm supported", "gsm_a.A5_6_algorithm_sup", + FT_BOOLEAN, BASE_NONE, TFS(&A5_6_algorithm_sup_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_A5_5_algorithm_sup, + { "A5/5 algorithm supported", "gsm_a.A5_5_algorithm_sup", + FT_BOOLEAN, BASE_NONE, TFS(&A5_5_algorithm_sup_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_A5_4_algorithm_sup, + { "A5/4 algorithm supported", "gsm_a.A5_4_algorithm_sup", + FT_BOOLEAN, BASE_NONE, TFS(&A5_4_algorithm_sup_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_A5_3_algorithm_sup, + { "A5/3 algorithm supported", "gsm_a.A5_3_algorithm_sup", + FT_BOOLEAN, 8, TFS(&A5_3_algorithm_sup_vals), 0x02, + NULL, HFILL } + }, + { &hf_gsm_a_A5_2_algorithm_sup, + { "A5/2 algorithm supported", "gsm_a.A5_2_algorithm_sup", + FT_BOOLEAN, 8, TFS(&A5_2_algorithm_sup_vals), 0x01, + NULL, HFILL } + }, + { &hf_gsm_a_mobile_identity_type, + { "Mobile Identity Type", "gsm_a.ie.mobileid.type", + FT_UINT8, BASE_DEC, VALS(mobile_identity_type_vals), 0x07, + NULL, HFILL } + }, + { &hf_gsm_a_odd_even_ind, + { "Odd/even indication", "gsm_a.oddevenind", + FT_BOOLEAN, 8, TFS(&oddevenind_vals), 0x08, + NULL, HFILL } + }, + { &hf_gsm_a_tmgi_mcc_mnc_ind, + { "MCC/MNC indication", "gsm_a.tmgi_mcc_mnc_ind", + FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x10, + NULL, HFILL} + }, + { &hf_gsm_a_mbs_ses_id_ind, + { "MBMS Session Identity indication", "gsm_a.mbs_session_id_ind", + FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x20, + NULL, HFILL} + }, + { &hf_gsm_a_mbs_service_id, + { "MBMS Service ID", "gsm_a.mbs_service_id", + FT_UINT24, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_mbs_session_id, + { "MBMS Session ID", "gsm_a.mbs_session_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_L3_protocol_discriminator, + { "Protocol discriminator", "gsm_a.L3_protocol_discriminator", + FT_UINT8, BASE_DEC, VALS(protocol_discriminator_vals), 0x0f, + NULL, HFILL } + }, + { &hf_gsm_a_call_prio, + { "Call priority", "gsm_a.call_prio", + FT_UINT8, BASE_DEC, VALS(gsm_a_call_prio_vals), 0x00, + NULL, HFILL } + }, + { &hf_gsm_a_type_of_ciph_alg, + { "Call priority", "gsm_a.call_prio", + FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_ciph_alg_vals), 0x07, + NULL, HFILL } + }, + { &hf_gsm_a_old_xid, + { "Old XID", "gsm_a.old_xid", + FT_UINT8, BASE_DEC, VALS(gsm_a_pld_xid_vals), 0x10, + NULL, HFILL } + }, + { &hf_gsm_a_iov_ui, + { "IOV-UI", "gsm_a.iov_ui", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_skip_ind, + { "Skip Indicator", "gsm_a.skip.ind", + FT_UINT8, BASE_DEC, NULL, 0xf0, + NULL, HFILL } + }, + { &hf_gsm_a_b7spare, + { "Spare", "gsm_a.spareb7", + FT_UINT8, BASE_DEC, NULL, 0x40, + NULL, HFILL } + }, + { &hf_gsm_a_b8spare, + { "Spare", "gsm_a.spareb8", + FT_UINT8, BASE_DEC, NULL, 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_spare_bits, + { "Spare bit(s)", "gsm_a.spare_bits", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_multi_bnd_sup_fields, + { "Multiband supported field", "gsm_a.multi_bnd_sup_fields", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_pgsm_supported, + { "P-GSM Supported", "gsm_a.classmark3.pgsmSupported", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_egsm_supported, + { "E-GSM or R-GSM Supported", "gsm_a.classmark3.egsmSupported", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_gsm1800_supported, + { "GSM 1800 Supported", "gsm_a.classmark3.gsm1800Supported", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ass_radio_cap1, + { "Associated Radio Capability 1", "gsm_a.classmark3.ass_radio_cap1", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ass_radio_cap2, + { "Associated Radio Capability 2", "gsm_a.classmark3.ass_radio_cap2", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_cm3_A5_bits, + { "A5 bits", "gsm_a.classmark3.a5_bits", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_rsupport, + { "R Support", "gsm_a.classmark3.rsupport", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_r_capabilities, + { "R-GSM band Associated Radio Capability", "gsm_a.classmark3.r_capabilities", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_multislot_capabilities, + { "HSCSD Multi Slot Capability", "gsm_a.classmark3.multislot_capabilities", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_multislot_class, + { "HSCSD Multi Slot Class", "gsm_a.classmark3.multislot_cap", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ucs2_treatment, + { "UCS2 treatment", "gsm_a.UCS2_treatment", + FT_BOOLEAN, BASE_NONE, TFS(&UCS2_treatment_vals), 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_extended_measurement_cap, + { "Extended Measurement Capability", "gsm_a.classmark3.ext_meas_cap", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_measurement_capability, + { "MS measurement capability", "gsm_a.classmark3.ms_measurement_capability", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_sms_value, + { "SMS_VALUE (Switch-Measure-Switch)", "gsm_a.classmark3.sms_value", + FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_sm_value, + { "SM_VALUE (Switch-Measure)", "gsm_a.classmark3.sm_value", + FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_pos_method_cap_present, + { "MS Positioning Method Capability present", "gsm_a.classmark3.ms_pos_method_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ms_pos_method, + { "MS Positioning Method", "gsm_a.classmark3.ms_pos_method", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ms_assisted_e_otd, + { "MS assisted E-OTD", "gsm_a.classmark3.ms_assisted_e_otd", + FT_BOOLEAN, BASE_NONE, TFS(&ms_assisted_e_otd_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_based_e_otd, + { "MS based E-OTD", "gsm_a.classmark3.ms_based_e_otd", + FT_BOOLEAN, BASE_NONE, TFS(&ms_based_e_otd_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_assisted_gps, + { "MS assisted GPS", "gsm_a.classmark3.ms_assisted_gps", + FT_BOOLEAN, BASE_NONE, TFS(&ms_assisted_gps_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_based_gps, + { "MS based GPS", "gsm_a.classmark3.ms_based_gps", + FT_BOOLEAN, BASE_NONE, TFS(&ms_based_gps_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ms_conventional_gps, + { "MS Conventional GPS", "gsm_a.classmark3.ms_conventional_gps", + FT_BOOLEAN, BASE_NONE, TFS(&ms_conventional_gps_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_ecsd_multi_slot_capability, + { "ECSD Multi Slot Capability present", "gsm_a.classmark3.ecsd_multi_slot_capability", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ecsd_multi_slot_class, + { "ECSD Multi Slot Class", "gsm_a.classmark3.ecsd_multi_slot_class", + FT_UINT8, BASE_DEC, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_8_psk_struct_present, + { "8-PSK Struct present", "gsm_a.classmark3.8_psk_struct_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_8_psk_struct, + { "8-PSK Struct", "gsm_a.classmark3.8_psk_struct", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_modulation_capability, + { "Modulation Capability", "gsm_a.classmark3.modulation_capability", + FT_BOOLEAN, BASE_NONE, TFS(&modulation_capability_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_8_psk_rf_power_capability_1, + { "8-PSK RF Power Capability 1", "gsm_a.classmark3.8_psk_rf_power_capability_1", + FT_UINT8, BASE_HEX, VALS(eight_psk_rf_power_capability_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_8_psk_rf_power_capability_2, + { "8-PSK RF Power Capability 2", "gsm_a.classmark3.8_psk_rf_power_capability_2", + FT_UINT8, BASE_HEX, VALS(eight_psk_rf_power_capability_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_400_band_info_present, + { "GSM 400 Band Information present", "gsm_a.classmark3.gsm_400_band_info_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_400_bands_supported, + { "GSM 400 Bands Supported", "gsm_a.classmark3.gsm_400_bands_supported", + FT_UINT8, BASE_HEX, VALS(gsm_400_bands_supported_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_400_assoc_radio_cap, + { "GSM 400 Associated Radio Capability", "gsm_a.classmark3.gsm_400_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_850_assoc_radio_cap_present, + { "GSM 850 Associated Radio Capability present", "gsm_a.classmark3.gsm_850_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_850_assoc_radio_cap, + { "GSM 850 Associated Radio Capability", "gsm_a.classmark3.gsm_850_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_1900_assoc_radio_cap_present, + { "GSM 1900 Associated Radio Capability present", "gsm_a.classmark3.gsm_1900_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_1900_assoc_radio_cap, + { "GSM 1900 Associated Radio Capability", "gsm_a.classmark3.gsm_1900_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_umts_fdd_rat_cap, + { "UMTS FDD Radio Access Technology Capability", "gsm_a.classmark3.umts_fdd_rat_cap", + FT_BOOLEAN, BASE_NONE, TFS(&umts_fdd_rat_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_umts_384_mcps_tdd_rat_cap, + { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.classmark3.umts_384_mcps_tdd_rat_cap", + FT_BOOLEAN, BASE_NONE, TFS(&umts_384_mcps_tdd_rat_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_cdma_2000_rat_cap, + { "CDMA 2000 Radio Access Technology Capability", "gsm_a.classmark3.cdma_2000_rat_cap", + FT_BOOLEAN, BASE_NONE, TFS(&cdma_2000_rat_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_e_gprs_multi_slot_info_present, + { "DTM E/GPRS Multi Slot Information present", "gsm_a.classmark3.dtm_e_gprs_multi_slot_info_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_gprs_multi_slot_class, + { "DTM GPRS Multi Slot Class", "gsm_a.classmark3.dtm_gprs_multi_slot_class", + FT_UINT8, BASE_DEC, VALS(dtm_gprs_multi_slot_class_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_single_slot_dtm, + { "Single Slot DTM", "gsm_a.classmark3.single_slot_dtm_supported", + FT_BOOLEAN, BASE_NONE, TFS(&single_slot_dtm_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_egprs_multi_slot_class_present, + { "DTM EGPRS Multi Slot Class present", "gsm_a.classmark3.dtm_egprs_multi_slot_class_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_egprs_multi_slot_class, + { "DTM EGPRS Multi Slot Class", "gsm_a.classmark3.dtm_egprs_multi_slot_class", + FT_UINT8, BASE_DEC, VALS(dtm_gprs_multi_slot_class_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_single_band_support, + { "Single Band Support", "gsm_a.classmark3.single_band_support", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_band, + { "GSM Band", "gsm_a.classmark3.gsm_band", + FT_UINT8, BASE_DEC, VALS(gsm_band_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_750_assoc_radio_cap_present, + { "GSM 750 Associated Radio Capability present", "gsm_a.classmark3.gsm_750_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_750_assoc_radio_cap, + { "GSM 750 Associated Radio Capability", "gsm_a.classmark3.gsm_750_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_umts_128_mcps_tdd_rat_cap, + { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.classmark3.umts_128_mcps_tdd_rat_cap", + FT_BOOLEAN, BASE_NONE, TFS(&umts_128_mcps_tdd_rat_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geran_feature_package_1, + { "GERAN Feature Package 1", "gsm_a.classmark3.geran_feature_package_1", + FT_BOOLEAN, BASE_NONE, TFS(&geran_feature_package_1_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ext_dtm_e_gprs_multi_slot_info_present, + { "Extended DTM E/GPRS Multi Slot Information present", "gsm_a.classmark3.ext_dtm_e_gprs_info_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ext_dtm_gprs_multi_slot_class, + { "Extended DTM GPRS Multi Slot Class", "gsm_a.classmark3.ext_dtm_gprs_multi_slot_class", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ext_dtm_egprs_multi_slot_class, + { "Extended DTM EGPRS Multi Slot Class", "gsm_a.classmark3.ext_dtm_egprs_multi_slot_class", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_high_multislot_cap_present, + { "High Multislot Capability present", "gsm_a.classmark3.high_multislot_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_high_multislot_cap, + { "High Multislot Capability", "gsm_a.classmark3.high_multislot_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geran_iu_mode_support, + { "GERAN Iu Mode Support", "gsm_a.classmark3.geran_iu_mode_support", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geran_iu_mode_cap, + { "GERAN Iu Mode Capabilities", "gsm_a.classmark3.geran_iu_mode_cap", + FT_UINT24, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geran_iu_mode_cap_length, + { "Length", "gsm_a.classmark3.geran_iu_mode_cap.length", + FT_UINT8, BASE_DEC, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_flo_iu_cap, + { "FLO Iu Capability", "gsm_a.classmark3.geran_iu_mode_cap.flo_iu_cap", + FT_BOOLEAN, BASE_NONE, TFS(&flo_iu_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geran_feature_package_2, + { "GERAN Feature Package 2", "gsm_a.classmark3.geran_feature_package_2", + FT_BOOLEAN, BASE_NONE, TFS(&geran_feature_package_2_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gmsk_multislot_power_prof, + { "GMSK Multislot Power Profile", "gsm_a.classmark3.gmsk_multislot_power_prof", + FT_UINT8, BASE_DEC, VALS(gmsk_multislot_power_prof_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_8_psk_multislot_power_prof, + { "8-PSK Multislot Power Profile", "gsm_a.classmark3.8_psk_multislot_power_prof", + FT_UINT8, BASE_DEC, VALS(eight_psk_multislot_power_prof_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_400_band_info_present, + { "T-GSM 400 Band Information present", "gsm_a.classmark3.gsm_400_band_info_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_400_bands_supported, + { "T-GSM 400 Bands Supported", "gsm_a.classmark3.t_gsm_400_bands_supported", + FT_UINT8, BASE_HEX, VALS(t_gsm_400_bands_supported_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_400_assoc_radio_cap, + { "T-GSM 400 Associated Radio Capability", "gsm_a.classmark3.t_gsm_400_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_900_assoc_radio_cap_present, + { "T-GSM 900 Associated Radio Capability present", "gsm_a.classmark3.t_gsm_900_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_900_assoc_radio_cap, + { "T-GSM 900 Associated Radio Capability", "gsm_a.classmark3.t_gsm_900_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_downlink_adv_receiver_perf, + { "Downlink Advanced Receiver Performance", "gsm_a.classmark3.downlink_adv_receiver_perf", + FT_UINT8, BASE_DEC, VALS(downlink_adv_receiver_perf_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_enhancements_cap, + { "DTM Enhancements Capability", "gsm_a.classmark3.dtm_enhancements_capability", + FT_BOOLEAN, BASE_NONE, TFS(&dtm_enhancements_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_e_gprs_high_multi_slot_info_present, + { "DTM E/GPRS High Multi Slot Information present", "gsm_a.classmark3.dtm_e_gprs_high_mutli_slot_info_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_gprs_high_multi_slot_class, + { "DTM GPRS Multi Slot Class", "gsm_a.classmark3.dtm_gprs_multi_slot_class", + FT_UINT8, BASE_DEC, VALS(dtm_gprs_high_multi_slot_class_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_offset_required, + { "Offset required", "gsm_a.classmark3.offset_required", + FT_BOOLEAN, BASE_NONE, TFS(&offset_required_vals), 0x0, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_egprs_high_multi_slot_class_present, + { "DTM EGPRS High Multi Slot Class present", "gsm_a.classmark3.dtm_egprs_high_multi_slot_class_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_dtm_egprs_high_multi_slot_class, + { "DTM EGPRS High Multi Slot Class", "gsm_a.classmark3.dtm_egprs_high_multi_slot_class", + FT_UINT8, BASE_DEC, VALS(dtm_gprs_high_multi_slot_class_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_repeated_acch_cap, + { "Repeated ACCH Capability", "gsm_a.classmark3.repeated_acch_cap", + FT_BOOLEAN, BASE_NONE, TFS(&repeated_acch_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_710_assoc_radio_cap_present, + { "GSM 710 Associated Radio Capability present", "gsm_a.classmark3.gsm_710_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_gsm_710_assoc_radio_cap, + { "GSM 710 Associated Radio Capability", "gsm_a.classmark3.gsm_710_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_810_assoc_radio_cap_present, + { "T-GSM 810 Associated Radio Capability present", "gsm_a.classmark3.t_gsm_810_assoc_radio_cap_present", + FT_BOOLEAN, BASE_NONE, TFS(&true_false_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_t_gsm_810_assoc_radio_cap, + { "T-GSM 810 Associated Radio Capability", "gsm_a.classmark3.t_gsm_810_assoc_radio_cap", + FT_UINT8, BASE_HEX, NULL, 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_ciphering_mode_setting_cap, + { "Ciphering Mode Setting Capability", "gsm_a.classmark3.ciphering_mode_setting_cap", + FT_BOOLEAN, BASE_NONE, TFS(&ciphering_mode_setting_cap_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_additional_positioning_caps, + { "Additional Positioning Capabilities", "gsm_a.classmark3.additional_positioning_caps", + FT_BOOLEAN, BASE_NONE, TFS(&additional_positioning_caps_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_e_utra_fdd_support, + { "E-UTRA FDD support", "gsm_a.classmark3.e_utra_fdd_support", + FT_BOOLEAN, BASE_NONE, TFS(&e_utra_fdd_support_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_e_utra_tdd_support, + { "E-UTRA TDD support", "gsm_a.classmark3.e_utra_tdd_support", + FT_BOOLEAN, BASE_NONE, TFS(&e_utra_tdd_support_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_e_utra_meas_and_report_support, + { "E-UTRA Measurement and Reporting support", "gsm_a.classmark3.e_utra_meas_and_report_support", + FT_BOOLEAN, BASE_NONE, TFS(&e_utra_meas_and_report_support_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_prio_based_resel_support, + { "Priority-based reselection support", "gsm_a.classmark3.prio_based_resel_support", + FT_BOOLEAN, BASE_NONE, TFS(&prio_based_resel_support_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_utra_csg_cells_reporting, + { "UTRA CSG Cells Reporting", "gsm_a.classmark3.utra_csg_cells_reporting", + FT_BOOLEAN, BASE_NONE, TFS(&utra_csg_cells_reporting_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_vamos_level, + { "VAMOS Level", "gsm_a.classmark3.vamos_level", + FT_UINT8, BASE_DEC, VALS(vamos_level_vals), 0x00, + NULL, HFILL} + }, + { &hf_gsm_a_geo_loc_type_of_shape, + { "Location estimate", "gsm_a.gad.location_estimate", + FT_UINT8, BASE_DEC, VALS(type_of_shape_vals), 0xf0, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_sign_of_lat, + { "Sign of latitude", "gsm_a.gad.sign_of_latitude", + FT_UINT8, BASE_DEC, VALS(sign_of_latitude_vals), 0x80, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_deg_of_lat, + { "Degrees of latitude", "gsm_a.gad.sign_of_latitude", + FT_UINT24, BASE_DEC, NULL, 0x7fffff, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_deg_of_long, + { "Degrees of longitude", "gsm_a.gad.sign_of_longitude", + FT_UINT24, BASE_DEC, NULL, 0xffffff, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_uncertainty_code, + { "Uncertainty code", "gsm_a.gad.uncertainty_code", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_uncertainty_semi_major, + { "Uncertainty semi-major", "gsm_a.gad.uncertainty_semi_major", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_uncertainty_semi_minor, + { "Uncertainty semi-minor", "gsm_a.gad.uncertainty_semi_minor", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_orientation_of_major_axis, + { "Orientation of major axis", "gsm_a.gad.orientation_of_major_axis", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_uncertainty_altitude, + { "Uncertainty Altitude", "gsm_a.gad.uncertainty_altitude", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_confidence, + { "Confidence(%)", "gsm_a.gad.confidence", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_no_of_points, + { "Number of points", "gsm_a.gad.no_of_points", + FT_UINT8, BASE_DEC, NULL, 0x0f, + NULL, HFILL } + }, + { &hf_gsm_a_velocity_type, + { "Number of points", "gsm_a.gad.velocity_type", + FT_UINT8, BASE_DEC, VALS(gsm_a_velocity_type_vals), 0xf0, + NULL, HFILL } + }, + { &hf_gsm_a_bearing, + { "Bearing", "gsm_a.gad.bearing", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_horizontal_speed, + { "Horizontal Speed", "gsm_a.gad.horizontal_velocity", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_vertical_speed, + { "Vertical Speed", "gsm_a.gad.vertical_speed", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_uncertainty_speed, + { "Uncertainty Speed", "gsm_a.gad.uncertainty_speed", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_h_uncertainty_speed, + { "Horizontal Uncertainty Speed", "gsm_a.gad.v_uncertainty_speed", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_v_uncertainty_speed, + { "Vertical Uncertainty Speed", "gsm_a.gad.h_uncertainty_speed", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_d, + { "Direction of Vertical Speed", "gsm_a.gad.d", + FT_BOOLEAN, 8, TFS(&gsm_a_dir_of_ver_speed_vals), 0x08, + NULL, HFILL} + }, + { &hf_gsm_a_geo_loc_D, + { "D: Direction of Altitude", "gsm_a.gad.D", + FT_UINT16, BASE_DEC, VALS(dir_of_alt_vals), 0x8000, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_altitude, + { "Altitude in meters", "gsm_a.gad.altitude", + FT_UINT16, BASE_DEC, NULL, 0x7fff, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_inner_radius, + { "Inner radius", "gsm_a.gad.altitude", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_uncertainty_radius, + { "Uncertainty radius", "gsm_a.gad.no_of_points", + FT_UINT8, BASE_DEC, NULL, 0x7f, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_offset_angle, + { "Offset angle", "gsm_a.gad.offset_angle", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_geo_loc_included_angle, + { "Included angle", "gsm_a.gad.included_angle", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_gsm_a_key_seq, + { "key sequence", "gsm_a.key_seq", + FT_UINT8, BASE_DEC, VALS(gsm_a_key_seq_vals), 0x07, + NULL, HFILL } + }, + { &hf_gsm_a_lac, + { "Location Area Code (LAC)", "gsm_a.lac", + FT_UINT16, BASE_HEX_DEC, NULL, 0x00, + NULL, HFILL } + }, + { &hf_gsm_a_spare_nibble, + { "Spare Nibble", "gsm_a.spare", + FT_UINT8, BASE_DEC_HEX, NULL, 0x00, + NULL, HFILL } + }, + }; + + /* Setup protocol subtree array */ +#define NUM_INDIVIDUAL_ELEMS 0 + static gint *ett[NUM_INDIVIDUAL_ELEMS + + NUM_GSM_COMMON_ELEM]; + + last_offset = NUM_INDIVIDUAL_ELEMS; + + for (i=0; i < NUM_GSM_COMMON_ELEM; i++, last_offset++) + { + ett_gsm_common_elem[i] = -1; + ett[last_offset] = &ett_gsm_common_elem[i]; + } + + /* Register the protocol name and description */ + + proto_a_common = + proto_register_protocol("GSM A-I/F COMMON", "GSM COMMON", "gsm_a_common"); + + proto_register_field_array(proto_a_common, hf, array_length(hf)); + + proto_register_subtree_array(ett, array_length(ett)); + + gsm_a_tap = register_tap("gsm_a"); } - -void -proto_reg_handoff_gsm_a_common(void) -{ -} |