diff --git a/epan/dissectors/packet-gsm_a_bssmap.c b/epan/dissectors/packet-gsm_a_bssmap.c index c13135f981..05a83df49d 100644 --- a/epan/dissectors/packet-gsm_a_bssmap.c +++ b/epan/dissectors/packet-gsm_a_bssmap.c @@ -314,6 +314,7 @@ static int hf_gsm_a_bssmap_ch_mode = -1; static int hf_gsm_a_bssmap_be_rnc_id = -1; static int hf_gsm_a_bssmap_apdu_protocol_id = -1; static int hf_gsm_a_bssmap_periodicity = -1; +static int hf_gsm_a_bssmap_lcs_pri = -1; /* Initialize the subtree pointers */ static gint ett_bssmap_msg = -1; @@ -409,7 +410,7 @@ typedef enum BE_LCS_CLIENT, /. LCS Client Type ./ BE_APDU, /. APDU ./ BE_NE_ID, /. Network Element Identity ./ - BE_GSP_ASSIST_DATA, /. GPS Assistance Data ./ + BE_GPS_ASSIST_DATA, /. GPS Assistance Data ./ BE_DECIPH_KEYS, /. Deciphering Keys ./ BE_RET_ERR_REQ, /. Return Error Request ./ BE_RET_ERR_CAUSE, /. Return Error Cause ./ @@ -2130,12 +2131,67 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc * 3.2.2.60 LCS QoS * (The QoS octets 3 to n are coded in the same way as the equivalent octets * in the LCS QoS element of 3GPP TS 49.031.) + */ +static guint8 +be_lcs_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + /* + proto_tree_add_item(tree, hf_gsm_a_rr_chnl_needed_ch1, tvb, curr_offset, 1, FALSE); + */ + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + + return(len); +} +/* * 3.2.2.61 LSA Access Control Suppression + */ +/* * 3.2.2.62 LCS Priority * The Priority octets 3 to n are coded in the same way as the equivalent octets * in the LCS Priority element of 3GPP TS 49.031. + */ +/* Location Information definitions */ +static const value_string lcs_priority_vals[] = { + { 0, "highest" }, + { 1, "normal" }, + { 0, NULL} +}; + +static guint8 +be_lcs_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + /* This octet is coded as the LCS-Priority octet in 3GPP TS 29.002 */ + proto_tree_add_item(tree, hf_gsm_a_bssmap_lcs_pri, tvb, curr_offset, 1, FALSE); + + return(len); +} + +/* * 3.2.2.63 Location Type (Location Type element of 3GPP TS 49.031 BSSAP-LE.) */ +static guint8 +be_loc_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + /* + proto_tree_add_item(tree, hf_gsm_a_rr_chnl_needed_ch1, tvb, curr_offset, 1, FALSE); + */ + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + + return(len); +} + /* * 3.2.2.64 Location Estimate * The Location Estimate field is composed of 1 or more octets with an internal structure @@ -2177,10 +2233,34 @@ be_pos_data(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha * 3.2.2.66 LCS Cause * LCS Cause element of 3GPP TS 49.031 BSSAP-LE. */ +static guint8 +be_lcs_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + + return(len); +} /* * 3.2.2.67 LCS Client Type * LCS Client Type element of 3GPP TS 49.031 BSSAP-LE. */ +static guint8 +be_lcs_client(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + + return(len); +} /* * 3.2.2.68 3GPP TS 48.008 version 6.9.0 Release 6 */ @@ -2254,14 +2334,29 @@ be_apdu(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s /* * 3.2.2.69 Network Element Identity * Network Element Identity element of 3GPP TS 49.031 BSSAP-LE. + */ +/* * 3.2.2.70 GPS Assistance Data * Requested GPS Data element of 3GPP TS 49.031 BSSAP-LE. - * + */ +static guint8 +be_gps_assist_data(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + + return(len); +} +/* * 3.2.2.71 Deciphering Keys * Deciphering Key element of 3GPP TS 49.031 BSSAP-LE. */ -#if 0 + static guint8 be_decihp_keys(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { @@ -2276,40 +2371,93 @@ be_decihp_keys(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g return(len); } -#endif + /* 3.2.2.72 Return Error Request * Return Error Request element of 3GPP TS 49.031 BSSAP-LE. - * 3.2.2.73 Return Error Cause - * Return Error Cause element of 3GPP TS 49.031 BSSAP-LE. - * 3.2.2.74 Segmentation - * Segmentation element of 3GPP TS 49.031 BSSAP-LE. - * 3.2.2.75 Service Handover - * 3.2.2.76 Source RNC to target RNC transparent information (UMTS) - * 3.2.2.77 Source RNC to target RNC transparent information (cdma2000) - * 3.2.2.78 GERAN Classmark - * 3.2.2.79 GERAN BSC Container - * 3.2.2.80 New BSS to Old BSS Information - * 3.2.2.81 Inter-System Information - * 3.2.2.82 SNA Access Information - * 3.2.2.83 VSTK_RAND Information - * 3.2.2.84 VSTK information - * 3.2.2.85 Paging Information - * 3.2.2.86 IMEI - * 3.2.2.87 Velocity Estimate - * 3.2.2.88 VGCS Feature Flags - * 3.2.2.89 Talker Priority - * 3.2.2.90 Emergency Set Indicatio - * 3.2.2.91 Talker Identity - * 3.2.2.92 SMS to VGCS - * 3.2.2.93 VGCS talker mode - * 3.2.2.94 VGCS/VBS Cell Status - * 3.2.2.95 GANSS Assistance Data - * 3.2.2.96 GANSS Positioning Data - * 3.2.2.97 GANSS Location Type - * 3.2.2.98 Application Data - * 3.2.2.99 Data Identity - * 3.2.2.100 Application Data Information - * 3.2.2.101 MSISDN + */ +static guint8 +be_ret_err_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + return(len); +} +/* + * 3.2.2.73 Return Error Cause + * Return Error Cause element of 3GPP TS 49.031 BSSAP-LE. + */ +static guint8 +be_ret_err_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + return(len); +} +/* + * 3.2.2.74 Segmentation + * Segmentation element of 3GPP TS 49.031 BSSAP-LE. + */ +static guint8 +be_seg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + return(len); +} +/* + * 3.2.2.75 Service Handover + */ +static guint8 +be_serv_ho(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + + curr_offset = offset; + + proto_tree_add_text(tree, tvb, curr_offset+1, len -1, "Not decoded yet"); + + return(len); +} + +/* + * 3.2.2.76 Source RNC to target RNC transparent information (UMTS) + * 3.2.2.77 Source RNC to target RNC transparent information (cdma2000) + * 3.2.2.78 GERAN Classmark + * 3.2.2.79 GERAN BSC Container + * 3.2.2.80 New BSS to Old BSS Information + * 3.2.2.81 Inter-System Information + * 3.2.2.82 SNA Access Information + * 3.2.2.83 VSTK_RAND Information + * 3.2.2.84 VSTK information + * 3.2.2.85 Paging Information + * 3.2.2.86 IMEI + * 3.2.2.87 Velocity Estimate + * 3.2.2.88 VGCS Feature Flags + * 3.2.2.89 Talker Priority + * 3.2.2.90 Emergency Set Indicatio + * 3.2.2.91 Talker Identity + * 3.2.2.92 SMS to VGCS + * 3.2.2.93 VGCS talker mode + * 3.2.2.94 VGCS/VBS Cell Status + * 3.2.2.95 GANSS Assistance Data + * 3.2.2.96 GANSS Positioning Data + * 3.2.2.97 GANSS Location Type + * 3.2.2.98 Application Data + * 3.2.2.99 Data Identity + * 3.2.2.100 Application Data Information + * 3.2.2.101 MSISDN * 3.2.2.102 AoIP Transport Layer Address * 3.2.2.103 Speech Codec List * 3.2.2.104 Speech Codec @@ -2337,7 +2485,7 @@ guint8 (*bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui NULL, /* Reserved */ NULL, /* Reserved */ de_ms_cm_2, /* Classmark Information Type 2 */ - NULL, /* Classmark Information Type 3 */ + de_ms_cm_3, /* Classmark Information Type 3 */ NULL, /* Interference Band To Be Used */ de_rr_cause, /* RR Cause */ NULL, /* Reserved */ @@ -2380,21 +2528,59 @@ guint8 (*bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui NULL, /* LSA Identifier */ NULL, /* LSA Identifier List */ NULL, /* LSA Information */ - NULL, /* LCS QoS */ + be_lcs_qos, /* LCS QoS */ NULL, /* LSA access control suppression */ - NULL, /* LCS Priority */ - NULL, /* Location Type */ + be_lcs_prio, /* LCS Priority */ + be_loc_type, /* Location Type */ be_loc_est, /* Location Estimate */ be_pos_data, /* Positioning Data */ - NULL, /* LCS Cause */ - NULL, /* LCS Client Type */ + be_lcs_cause, /* LCS Cause */ + be_lcs_client, /* LCS Client Type */ be_apdu, /* APDU */ NULL, /* Network Element Identity */ - NULL, /* GPS Assistance Data */ - NULL, /* Deciphering Keys */ - NULL, /* Return Error Request */ - NULL, /* Return Error Cause */ - NULL, /* Segmentation */ + be_gps_assist_data, /* GPS Assistance Data */ + be_decihp_keys, /* Deciphering Keys */ + be_ret_err_req, /* Return Error Request */ + be_ret_err_cause, /* Return Error Cause */ + be_seg, /* Segmentation */ + be_serv_ho, /* Service Handover */ + NULL, /* Source RNC to target RNC transparent information (UMTS) */ + NULL, /* Source RNC to target RNC transparent information (cdma2000) */ + NULL, /* GERAN Classmark */ + NULL, /* GERAN BSC Container */ + NULL, /* New BSS to Old BSS Information */ + NULL, /* Inter-System Information */ + NULL, /* SNA Access Information */ + NULL, /* VSTK_RAND Information */ + NULL, /* VSTK Information */ + NULL, /* Paging Information */ + NULL, /* IMEI */ + NULL, /* Velocity Estimate */ + NULL, /* VGCS Feature Flags */ + NULL, /* Talker Priority */ + NULL, /* Emergency Set Indication */ + NULL, /* Talker Identity */ + NULL, /* Cell Identifier List Segment */ + NULL, /* SMS to VGCS */ + NULL, /* VGCS Talker Mode */ + NULL, /* VGCS/VBS Cell Status */ + NULL, /* Cell Identifier List Segment for established cells */ + NULL, /* Cell Identifier List Segment for cells to be established */ + NULL, /* Cell Identifier List Segment for released cells - no user present */ + NULL, /* Cell Identifier List Segment for not established cells - no establishment possible */ + NULL, /* GANSS Assistance Data */ + NULL, /* GANSS Positioning Data */ + NULL, /* GANSS Location Type */ + NULL, /* Application Data */ + NULL, /* Data Identity */ + NULL, /* Application Data Information */ + NULL, /* MSISDN */ + NULL, /* AoIP Transport Layer Address */ + NULL, /* Speech Codec List */ + NULL, /* Speech Codec */ + NULL, /* Call Identifier */ + NULL, /* Call Identifier List */ + NULL, /* NONE */ }; @@ -3264,7 +3450,7 @@ bssmap_cl3_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) /* LSA Identifier List 3.2.2.16 BSS-MSC O (note 2) 3+3n */ ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_LSA_ID_LIST].value, BSSAP_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST, ""); - /* PADU 3.2.2.68 BSS-MSC O (note 3) 3-n */ + /* APDU 3.2.2.68 BSS-MSC O (note 3) 3-n */ ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_APDU].value, BSSAP_PDU_TYPE_BSSMAP, BE_APDU, ""); /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 4) 3-n */ @@ -3617,8 +3803,10 @@ Cell Identifier List Segment * Channel Type 3.2.2.11 BSS-MSC M (note 3, 4) 5 Cell Identifier 3.2.2.17 BSS-MSC M 3-10 -ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_CELL_ID].value, BSSAP_PDU_TYPE_BSSMAP, BE_CELL_ID, ""); + ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_CELL_ID].value, BSSAP_PDU_TYPE_BSSMAP, BE_CELL_ID, ""); Chosen Channel 3.2.2.33 BSS-MSC O (note 2) 2 + ELEM_OPT_TV(gsm_bssmap_elem_strings[BE_CHOSEN_CHAN].value, BSSAP_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, ""); + Circuit Identity Code 3.2.2.2 BSS-MSC O (note 5) 3 Circuit Pool 3.2.2.45 BSS-MSC O (note 1) 2 * @@ -3793,22 +3981,42 @@ bssmap_conn_oriented(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) /* * 3.2.1.71 PERFORM LOCATION REQUEST */ -/* -Location Type 3.2.2.63 M 3-n -Cell Identifier 3.2.2.17 O 5-10 -ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_CELL_ID].value, BSSAP_PDU_TYPE_BSSMAP, BE_CELL_ID, ""); -Classmark Information Type 3 3.2.2.20 O 3-14 -LCS Client Type 3.2.2.67 C (note 3) 3-n -Chosen Channel 3.2.2.33 O 2 -LCS Priority 3.2.2.62 O 3-n -LCS QoS 3.2.2.60 C (note 1) 3-n -GPS Assistance Data 3.2.2.70 C (note 2) 3-n -APDU 3.2.2.68 O 3-n -IMSI 3.2.2.6 O (note 4) 5-10 -IMEI 3.2.2.86 O (note 4) 10 -GANSS Location Type 3.2.2.97 C 3 -GANSS Assistance Data 3.2.2.95 C (note 5) 3-n -*/ +static void +bssmap_perf_loc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + /* Location Type 3.2.2.63 M 3-n */ + ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_LOC_TYPE].value, BSSAP_PDU_TYPE_BSSMAP, BE_LOC_TYPE , ""); + /* Cell Identifier 3.2.2.17 O 5-10 */ + ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_CELL_ID].value, BSSAP_PDU_TYPE_BSSMAP, BE_CELL_ID, ""); + /* Classmark Information Type 3 3.2.2.20 O 3-14 */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_CM_INFO_3].value, BSSAP_PDU_TYPE_BSSMAP, BE_CM_INFO_3, ""); + /* LCS Client Type 3.2.2.67 C (note 3) 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_LCS_CLIENT].value, BSSAP_PDU_TYPE_BSSMAP, BE_LCS_CLIENT, ""); + /* Chosen Channel 3.2.2.33 O 2 */ + ELEM_OPT_TV(gsm_bssmap_elem_strings[BE_CHOSEN_CHAN].value, BSSAP_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, ""); + /* LCS Priority 3.2.2.62 O 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_LCS_PRIO].value, BSSAP_PDU_TYPE_BSSMAP, BE_LCS_PRIO, ""); + /* LCS QoS 3.2.2.60 C (note 1) 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_LCS_QOS].value, BSSAP_PDU_TYPE_BSSMAP, BE_LCS_QOS, ""); + /* GPS Assistance Data 3.2.2.70 C (note 2) 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_GPS_ASSIST_DATA].value, BSSAP_PDU_TYPE_BSSMAP, BE_GPS_ASSIST_DATA, ""); + /* APDU 3.2.2.68 O 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_APDU].value, BSSAP_PDU_TYPE_BSSMAP, BE_APDU, ""); + /* IMSI 3.2.2.6 O (note 4) 5-10 */ + ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_IMSI].value, BSSAP_PDU_TYPE_BSSMAP, BE_IMSI, ""); + /* IMEI 3.2.2.86 O (note 4) 10 */ + /* GANSS Location Type 3.2.2.97 C 3 */ + /* GANSS Assistance Data 3.2.2.95 C (note 5) 3-n */ + + EXTRANEOUS_DATA_CHECK(curr_len, 0); +} /* * 3.2.1.72 PERFORM LOCATION RESPONSE */ @@ -3829,6 +4037,7 @@ bssmap_perf_loc_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) /* Deciphering Keys 3.2.2.71 C (note 2) 3-n */ ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_DECIPH_KEYS].value, BSSAP_PDU_TYPE_BSSMAP, BE_DECIPH_KEYS, ""); /* LCS Cause 3.2.2.66 C (note 3) 3-n */ + ELEM_OPT_TLV(gsm_bssmap_elem_strings[BE_LCS_CAUSE].value, BSSAP_PDU_TYPE_BSSMAP, BE_LCS_CAUSE, ""); /* Velocity Estimate 3.2.2.87 O 3-n */ /* GANSS Positioning Data 3.2.2.96 O 3-n */ @@ -3837,9 +4046,22 @@ bssmap_perf_loc_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) /* * 3.2.1.73 PERFORM LOCATION ABORT */ -/* -LCS Cause 3.2.2.66 M 3-n -*/ +static void +bssmap_perf_loc_abort(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) +{ + guint32 curr_offset; + guint32 consumed; + guint curr_len; + + curr_offset = offset; + curr_len = len; + + /* LCS Cause 3.2.2.66 M 3-n */ + ELEM_MAND_TLV(gsm_bssmap_elem_strings[BE_LCS_CAUSE].value, BSSAP_PDU_TYPE_BSSMAP, BE_LCS_CAUSE, ""); + + EXTRANEOUS_DATA_CHECK(curr_len, 0); +} + /* * 3.2.1.74 CONNECTIONLESS INFORMATION */ @@ -3977,10 +4199,10 @@ static void (*bssmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, NULL, /* Suspend */ NULL, /* Resume */ bssmap_conn_oriented, /* Connection Oriented Information */ - NULL, /* Perform Location Request */ + bssmap_perf_loc_req, /* Perform Location Request */ bssmap_lsa_info, /* LSA Information */ bssmap_perf_loc_res, /* Perform Location Response */ - NULL, /* Perform Location Abort */ + bssmap_perf_loc_abort, /* Perform Location Abort */ bssmap_common_id, /* Common Id */ bssmap_reset, /* Reset */ NULL /* no associated data */, /* Reset Acknowledge */ @@ -4226,6 +4448,11 @@ proto_register_gsm_a_bssmap(void) FT_UINT8, BASE_DEC, NULL, 0x0, "Periodicity", HFILL } }, + { &hf_gsm_a_bssmap_lcs_pri, + { "Periodicity", "gsm_a_bssmap.lcs_pri", + FT_UINT8, BASE_DEC, VALS(lcs_priority_vals), 0x0, + "Periodicity", HFILL } + }, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index 99c76f0f57..c82508ed26 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -169,6 +169,31 @@ static const value_string CMSP_vals[] = { { 1, "Network initiated MO CM connection request supported for at least one CM protocol"}, { 0, NULL } }; +/* A5/4 algorithm supported */ +static const value_string A5_7_algorithm_sup_vals[] = { + { 0, "encryption algorithm A5/7 not available"}, + { 1, "encryption algorithm A5/7 available"}, + { 0, NULL } +}; +/* A5/4 algorithm supported */ +static const value_string A5_6_algorithm_sup_vals[] = { + { 0, "encryption algorithm A5/6 not available"}, + { 1, "encryption algorithm A5/6 available"}, + { 0, NULL } +}; +/* A5/5 algorithm supported */ +static const value_string A5_5_algorithm_sup_vals[] = { + { 0, "encryption algorithm A5/5 not available"}, + { 1, "encryption algorithm A5/5 available"}, + { 0, NULL } +}; +/* A5/4 algorithm supported */ +static const value_string A5_4_algorithm_sup_vals[] = { + { 0, "encryption algorithm A5/4 not available"}, + { 1, "encryption algorithm A5/4 available"}, + { 0, NULL } +}; + /* A5/3 algorithm supported (octet 5, bit 2) */ static const value_string A5_3_algorithm_sup_vals[] = { { 0, "encryption algorithm A5/3 not available"}, @@ -199,6 +224,32 @@ static const value_string oddevenind_vals[] = { { 0, NULL } }; +static const value_string true_false_vals[] = { + { 0, "false" }, + { 1, "true" }, + { 0, NULL} +}; + +static 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} +}; + /* Initialize the protocol and registered fields */ static int proto_a_common = -1; @@ -225,6 +276,10 @@ 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; @@ -239,6 +294,22 @@ int hf_gsm_a_skip_ind = -1; static int hf_gsm_a_b7spare = -1; int hf_gsm_a_b8spare = -1; +static int hf_gsm_a_spare_bits = -1; +static int hf_gsm_a_multi_bnd_sup_fields = -1; +static int hf_gsm_a_pgsm_supported = -1; +static int hf_gsm_a_egsm_supported = -1; +static int hf_gsm_a_gsm1800_supported = -1; +static int hf_gsm_a_ass_radio_cap1 = -1; +static int hf_gsm_a_ass_radio_cap2 = -1; +static int hf_gsm_a_rsupport = -1; +static int hf_gsm_a_r_capabilities = -1; +static int hf_gsm_a_multislot_capabilities = -1; +static int hf_gsm_a_multislot_class = -1; +static int hf_gsm_a_ucs2_treatment = -1; +static int hf_gsm_a_extended_measurement_cap = -1; +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 char a_bigbuf[1024]; @@ -1199,7 +1270,8 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar } /* - * [3] 10.5.1.6 + * [3] 10.5.1.6 Mobile Station Classmark 2 + * 3GPP TS 24.008 version 7.8.0 Release 7 */ guint8 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) @@ -1243,7 +1315,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad /* CM3 (octet 5, bit 8) */ proto_tree_add_item(tree, hf_gsm_a_CM3, tvb, curr_offset, 1, FALSE); /* spare bit 7 */ - proto_tree_add_item(tree, hf_gsm_a_b7spare, tvb, curr_offset, 1, FALSE); + proto_tree_add_item(tree, hf_gsm_a_b7spare, tvb, curr_offset, 1, FALSE); /* 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, FALSE); /* UCS2 treatment (octet 5, bit 5) */ @@ -1263,6 +1335,191 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad return(curr_offset - offset); } + +/* + * [3] 10.5.1.7 Mobile Station Classmark 3 + * 3GPP TS 24.008 version 7.8.0 Release 7 + */ +guint8 +de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) +{ + guint32 curr_offset; + guint32 bit_offset; /* Offset in bits */ + proto_tree *subtree; + proto_item *item; + guint64 multi_bnd_sup_fields,rsupport, multislotCapability, msMeasurementCapability; + + 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, FALSE); + 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, FALSE); + 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, FALSE); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_egsm_supported, tvb, bit_offset, 1, FALSE); + bit_offset++; + + proto_tree_add_bits_item(subtree, hf_gsm_a_pgsm_supported, tvb, bit_offset, 1, FALSE); + bit_offset++; + + /* < A5 bits > */ + proto_tree_add_bits_item(tree, hf_gsm_a_A5_4_algorithm_sup, tvb, bit_offset, 1, FALSE); + bit_offset++; + proto_tree_add_bits_item(tree, hf_gsm_a_A5_5_algorithm_sup, tvb, bit_offset, 1, FALSE); + bit_offset++; + proto_tree_add_bits_item(tree, hf_gsm_a_A5_6_algorithm_sup, tvb, bit_offset, 1, FALSE); + bit_offset++; + proto_tree_add_bits_item(subtree, hf_gsm_a_A5_7_algorithm_sup, tvb, bit_offset, 1, FALSE); + bit_offset++; + + switch(multi_bnd_sup_fields){ + case 0: + /* A5 bits dissected so 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, FALSE); + bit_offset+=4; + /* < Associated Radio Capability 1 : bit(4) > */ + proto_tree_add_bits_item(subtree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, FALSE); + 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(subtree, hf_gsm_a_ass_radio_cap2, tvb, bit_offset, 4, FALSE); + bit_offset+=4; + /* < Associated Radio Capability 1 : bit(4) > */ + proto_tree_add_bits_item(subtree, hf_gsm_a_ass_radio_cap1, tvb, bit_offset, 4, FALSE); + bit_offset+=4; + break; + default: + break; + } + /* Extract R Support */ + proto_tree_add_bits_ret_val(tree, hf_gsm_a_rsupport, tvb, bit_offset, 1, &rsupport, FALSE); + 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, FALSE); + bit_offset = bit_offset + 3; + } + + /* + * { 0 | 1 < HSCSD Multi Slot Capability > } + * Extract Multislot capability + */ + proto_tree_add_bits_ret_val(tree, hf_gsm_a_multislot_capabilities, tvb, bit_offset, 1, &multislotCapability, FALSE); + bit_offset++; + + if(multislotCapability == 1) + { + /* Extract Multislot Class */ + proto_tree_add_bits_item(tree, hf_gsm_a_multislot_class, tvb, bit_offset, 5, FALSE); + bit_offset = bit_offset + 5; + } + + /* < UCS2 treatment: bit > */ + proto_tree_add_bits_item(tree, hf_gsm_a_ucs2_treatment, tvb, bit_offset, 1, FALSE); + bit_offset = bit_offset + 1; + + /* < Extended Measurement Capability : bit > */ + proto_tree_add_bits_item(tree, hf_gsm_a_extended_measurement_cap, tvb, bit_offset, 1, FALSE); + bit_offset = bit_offset + 1; + + /* { 0 | 1 < MS measurement capability > } + * Extract MS Measurement capability + */ + proto_tree_add_bits_ret_val(tree, hf_gsm_a_ms_measurement_capability, tvb, bit_offset, 1, &msMeasurementCapability, FALSE); + 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, FALSE); + 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, FALSE); + bit_offset = bit_offset + 4; + } + +/* +{ 0 | 1 < MS Positioning Method Capability > } +{ 0 | 1 < ECSD Multi Slot Capability > } +{ 0 | 1 < 8-PSK Struct > } +{ 0 | 1 < GSM 400 Bands Supported : { 01 | 10 | 11 } > +< GSM 400 Associated Radio Capability: bit(4) > } +{ 0 | 1 } +{ 0 | 1 } +< UMTS FDD Radio Access Technology Capability : bit > +< UMTS 3.84 Mcps TDD Radio Access Technology Capability : bit > +< CDMA 2000 Radio Access Technology Capability : bit > +{ 0 | 1 < DTM GPRS Multi Slot Class : bit(2) > +< Single Slot DTM : bit > +{0 | 1< DTM EGPRS Multi Slot Class : bit(2) > } } +{ 0 | 1 < Single Band Support > } -- Release 4 starts here: +{ 0 | 1 } +< UMTS 1.28 Mcps TDD Radio Access Technology Capability : bit > +< GERAN Feature Package 1 : bit > +{ 0 | 1 < Extended DTM GPRS Multi Slot Class : bit(2) > +< Extended DTM EGPRS Multi Slot Class : bit(2) > } +{ 0 | 1 < High Multislot Capability : bit(2) > } ---Release 5 starts here. +{ 0 | 1 < GERAN Iu Mode Capabilities > } -- "1" also means support of GERAN Iu mode +< GERAN Feature Package 2 : bit > +< GMSK Multislot Power Profile : bit (2) > +< 8-PSK Multislot Power Profile : bit (2) > +{ 0 | 1 < T-GSM 400 Bands Supported : { 01 | 10 | 11 } > -- Release 6 starts here. +< T-GSM 400 Associated Radio Capability: bit(4) > } +{ 0 | 1 < T-GSM 900 Associated Radio Capability: bit(4) > } +< Downlink Advanced Receiver Performance : bit (2)> +< DTM Enhancements Capability : bit > +{ 0 | 1 < DTM GPRS High Multi Slot Class : bit(3) > +< Offset required : bit> +{ 0 | 1 < DTM EGPRS High Multi Slot Class : bit(3) > } } +< Repeated ACCH Capability : bit > +{ 0 | 1 } -- Release 7 starts here. +{ 0 | 1 } +< Ciphering Mode Setting Capability : bit > +0 | 1 < Multislot Capability Reduction for Downlink Dual Carrier : bit (3) > } -- "1" also means that +the mobile station supports dual carrier in the downlink during DTM +< spare bits > ; +*/ + EXTRANEOUS_DATA_CHECK(len, curr_offset - offset); + + return(len); +} /* * [3] 10.5.1.8 */ @@ -1495,7 +1752,7 @@ guint8 (*common_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui de_mid, /* Mobile Identity */ de_ms_cm_1, /* Mobile Station Classmark 1 */ de_ms_cm_2, /* Mobile Station Classmark 2 */ - NULL, /* Mobile Station Classmark 3 */ + 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 */ @@ -1616,6 +1873,26 @@ proto_register_gsm_a_common(void) FT_UINT8,BASE_DEC, VALS(CMSP_vals), 0x04, "CMSP: CM Service Prompt", HFILL } }, + { &hf_gsm_a_A5_7_algorithm_sup, + { "A5/7 algorithm supported","gsm_a.A5_7_algorithm_sup", + FT_UINT8,BASE_DEC, VALS(A5_7_algorithm_sup_vals), 0x0, + "A5/7 algorithm supported", HFILL } + }, + { &hf_gsm_a_A5_6_algorithm_sup, + { "A5/6 algorithm supported","gsm_a.A5_6_algorithm_sup", + FT_UINT8,BASE_DEC, VALS(A5_6_algorithm_sup_vals), 0x0, + "A5/6 algorithm supported", HFILL } + }, + { &hf_gsm_a_A5_5_algorithm_sup, + { "A5/5 algorithm supported","gsm_a.A5_5_algorithm_sup", + FT_UINT8,BASE_DEC, VALS(A5_5_algorithm_sup_vals), 0x0, + "A5/5 algorithm supported", HFILL } + }, + { &hf_gsm_a_A5_4_algorithm_sup, + { "A5/4 algorithm supported","gsm_a.A5_4_algorithm_sup", + FT_UINT8,BASE_DEC, VALS(A5_4_algorithm_sup_vals), 0x0, + "A5/4 algorithm supported", HFILL } + }, { &hf_gsm_a_A5_3_algorithm_sup, { "A5/3 algorithm supported","gsm_a.A5_3_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_3_algorithm_sup_vals), 0x02, @@ -1676,6 +1953,74 @@ proto_register_gsm_a_common(void) FT_UINT8,BASE_DEC, NULL, 0x80, "Spare", HFILL } }, + { &hf_gsm_a_spare_bits, + { "Spare bit(s)","gsm_a.spare_bits", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Spare bit(s)", HFILL } + }, + { &hf_gsm_a_multi_bnd_sup_fields, + { "Multiband supported field","gsm_a.multi_bnd_sup_fields", + FT_UINT8,BASE_DEC, NULL, 0x0, + "Multiband supported field", HFILL } + }, + { &hf_gsm_a_pgsm_supported, + { "P-GSM Supported", "gsm_a.classmark3.pgsmSupported", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"P-GSM Supported", HFILL} + }, + { &hf_gsm_a_egsm_supported, + { "E-GSM or R-GSM Supported", "gsm_a.classmark3.egsmSupported", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"E-GSM or R-GSM Supported", HFILL} + }, + { &hf_gsm_a_gsm1800_supported, + { "GSM 1800 Supported", "gsm_a.classmark3.gsm1800Supported", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"GSM 1800 Supported", HFILL} + }, + { &hf_gsm_a_ass_radio_cap1, + { "Associated Radio Capability 1", "gsm_a.classmark3.ass_radio_cap1", + FT_UINT8, BASE_DEC, NULL, 0x0,"Associated Radio Capability 1", HFILL} + }, + { &hf_gsm_a_ass_radio_cap2, + { "Associated Radio Capability 1", "gsm_a.classmark3.ass_radio_cap2", + FT_UINT8, BASE_DEC, NULL, 0x0,"Associated Radio Capability 1", HFILL} + }, + { &hf_gsm_a_rsupport, + { "R Support", "gsm_a.classmark3.rsupport", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"R Support", HFILL} + }, + { &hf_gsm_a_r_capabilities, + { "R-GSM band Associated Radio Capability", "gsm_a.classmark3.r_capabilities", + FT_UINT8, BASE_DEC, NULL, 0x0,"R-GSM band Associated Radio Capability", HFILL} + }, + { &hf_gsm_a_multislot_capabilities, + { "HSCSD Multi Slot Capability", "gsm_a.classmark3.multislot_capabilities", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"HSCSD Multi Slot Capability", HFILL} + }, + { &hf_gsm_a_multislot_class, + { "HSCSD Multi Slot Class", "gsm_a.classmark3.multislot_cap", + FT_UINT8, BASE_DEC, NULL, 0x0,"HSCSD Multi Slot Class", HFILL} + }, + { &hf_gsm_a_ucs2_treatment, + { "UCS2 treatment ","gsm_a.UCS2_treatment", + FT_UINT8,BASE_DEC, VALS(UCS2_treatment_vals), 0x0, + "UCS2 treatment ", HFILL } + }, + { &hf_gsm_a_extended_measurement_cap, + { "Extended Measurement Capability", "gsm_a.classmark3.ext_meas_cap", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"Extended Measurement Capability", HFILL} + }, + { &hf_gsm_a_ms_measurement_capability, + { "MS measurement capability", "gsm_a.classmark3.ms_measurement_capability", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"MS measurement capability", 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,"SMS_VALUE (Switch-Measure-Switch)", 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,"SM_VALUE (Switch-Measure", HFILL} + }, + }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-gsm_a_common.h b/epan/dissectors/packet-gsm_a_common.h index dad5779d0a..849cf33c80 100644 --- a/epan/dissectors/packet-gsm_a_common.h +++ b/epan/dissectors/packet-gsm_a_common.h @@ -465,6 +465,7 @@ guint8 de_bearer_cap_uplink(tvbuff_t *tvb, proto_tree *tree, guint32 offset, gui guint8 de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_); guint8 de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len); +guint8 de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len); guint8 de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len); guint8 de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len); @@ -611,7 +612,7 @@ typedef enum BE_LCS_CLIENT, /* LCS Client Type */ BE_APDU, /* APDU */ BE_NE_ID, /* Network Element Identity */ - BE_GSP_ASSIST_DATA, /* GPS Assistance Data */ + BE_GPS_ASSIST_DATA, /* GPS Assistance Data */ BE_DECIPH_KEYS, /* Deciphering Keys */ BE_RET_ERR_REQ, /* Return Error Request */ BE_RET_ERR_CAUSE, /* Return Error Cause */