diff options
author | Anders Broman <anders.broman@ericsson.com> | 2013-08-06 17:11:42 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2013-08-06 17:11:42 +0000 |
commit | 06c37f8665d65f9b1b57e7e07e4fdb4f5899abc2 (patch) | |
tree | 0c3d3cb27ef3fdcba478f4077c841004ee20fa50 /epan/dissectors/packet-iua.c | |
parent | cc7c777f552d076dba2837ff542445d9aacd5e39 (diff) |
Add code and a preference to use GSM SAPI to call sub dissectors.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9017
svn path=/trunk/; revision=51171
Diffstat (limited to 'epan/dissectors/packet-iua.c')
-rw-r--r-- | epan/dissectors/packet-iua.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/epan/dissectors/packet-iua.c b/epan/dissectors/packet-iua.c index 9fa59dc8d6..23cc2846c2 100644 --- a/epan/dissectors/packet-iua.c +++ b/epan/dissectors/packet-iua.c @@ -36,9 +36,16 @@ #include <epan/packet.h> #include <epan/prefs.h> #include <epan/sctpppids.h> +#include <epan/lapd_sapi.h> static module_t *iua_module; +static dissector_handle_t data_handle; +static dissector_table_t lapd_gsm_sapi_dissector_table; + +/* Whether to use GSM SAPI vals or not */ +static gboolean global_iua_gsm_sapis = TRUE; + /* Initialize the protocol and registered fields */ static int proto_iua = -1; static int hf_int_interface_id = -1; @@ -47,6 +54,7 @@ static int hf_info_string = -1; static int hf_dlci_zero_bit = -1; static int hf_dlci_spare_bit = -1; static int hf_dlci_sapi = -1; +static int hf_dlci_gsm_sapi = -1; static int hf_dlci_one_bit = -1; static int hf_dlci_tei = -1; static int hf_dlci_spare = -1; @@ -176,6 +184,14 @@ static const value_string sapi_values[] = { { 0, NULL } }; +static const value_string gsm_sapi_vals[] = { + { LAPD_GSM_SAPI_RA_SIG_PROC, "Radio signalling procedures" }, + { LAPD_GSM_SAPI_NOT_USED_1, "(Not used in GSM PLMN)" }, + { LAPD_GSM_SAPI_NOT_USED_16, "(Not used in GSM PLMN)" }, + { LAPD_GSM_SAPI_OM_PROC, "Operation and maintenance procedure" }, + { LAPD_SAPI_L2, "Layer 2 management procedures" }, + { 0, NULL } +}; static void dissect_dlci_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) @@ -185,9 +201,12 @@ dissect_dlci_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) proto_tree_add_item(parameter_tree, hf_dlci_spare_bit, parameter_tvb, DLCI_SAPI_OFFSET, DLCI_SAPI_LENGTH, ENC_BIG_ENDIAN); /* Add the SAPI + some explanatory text, store the SAPI value so that we can later how to * dissect the protocol data */ - sapi_item = proto_tree_add_item(parameter_tree, hf_dlci_sapi, parameter_tvb, DLCI_SAPI_OFFSET, DLCI_SAPI_LENGTH, ENC_BIG_ENDIAN); + if(global_iua_gsm_sapis){ + sapi_item = proto_tree_add_item(parameter_tree, hf_dlci_gsm_sapi, parameter_tvb, DLCI_SAPI_OFFSET, DLCI_SAPI_LENGTH, ENC_BIG_ENDIAN); + }else{ + sapi_item = proto_tree_add_item(parameter_tree, hf_dlci_sapi, parameter_tvb, DLCI_SAPI_OFFSET, DLCI_SAPI_LENGTH, ENC_BIG_ENDIAN); + } sapi_val = (tvb_get_guint8(parameter_tvb, DLCI_SAPI_OFFSET) & SAPI_MASK) >> SAPI_SHIFT; - proto_item_append_text(sapi_item, " (%s)", val_to_str_const( sapi_val, sapi_values, "Unknown/reserved")); sapi_val_assigned = TRUE; proto_tree_add_item(parameter_tree, hf_dlci_one_bit, parameter_tvb, DLCI_TEI_OFFSET, DLCI_TEI_LENGTH, ENC_BIG_ENDIAN); @@ -409,6 +428,11 @@ dissect_protocol_data_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_i { return; } + if(global_iua_gsm_sapis){ + if (!dissector_try_uint(lapd_gsm_sapi_dissector_table, sapi_val, protocol_data_tvb, pinfo, tree)) + call_dissector(data_handle, protocol_data_tvb, pinfo, tree); + return; + } switch(sapi_val) { @@ -906,7 +930,8 @@ proto_register_iua(void) { &hf_info_string, { "Info string", "iua.info_string", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_dlci_zero_bit, { "Zero bit", "iua.dlci_zero_bit", FT_BOOLEAN, 8, NULL, ZERO_BIT_MASK, NULL, HFILL } }, { &hf_dlci_spare_bit, { "Spare bit", "iua.dlci_spare_bit", FT_BOOLEAN, 8, NULL, SPARE_BIT_MASK, NULL, HFILL } }, - { &hf_dlci_sapi, { "SAPI", "iua.dlci_sapi", FT_UINT8, BASE_HEX, NULL, SAPI_MASK, NULL, HFILL } }, + { &hf_dlci_sapi, { "SAPI", "iua.dlci_sapi", FT_UINT8, BASE_HEX, VALS(sapi_values), SAPI_MASK, NULL, HFILL } }, + { &hf_dlci_gsm_sapi, { "SAPI", "iua.dlci_gsm_sapi", FT_UINT8, BASE_HEX, VALS(gsm_sapi_vals), SAPI_MASK, NULL, HFILL } }, { &hf_dlci_one_bit, { "One bit", "iua.dlci_one_bit", FT_BOOLEAN, 8, NULL, ONE_BIT_MASK, NULL, HFILL } }, { &hf_dlci_tei, { "TEI", "iua.dlci_tei", FT_UINT8, BASE_HEX, NULL, TEI_MASK, NULL, HFILL } }, { &hf_dlci_spare, { "Spare", "iua.dlci_spare", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, @@ -949,6 +974,11 @@ proto_register_iua(void) proto_register_subtree_array(ett, array_length(ett)); prefs_register_bool_preference(iua_module, "support_ig", "Support Implementers Guide", "Support Implementers Guide (version 01)", &support_IG); + prefs_register_bool_preference(iua_module, "use_gsm_sapi_values", + "Use GSM SAPI values", + "Use SAPI values as specified in TS 48 056", + &global_iua_gsm_sapis); + /* Allow other dissectors to find this one by name. */ register_dissector("iua", dissect_iua, proto_iua); } @@ -966,4 +996,8 @@ proto_reg_handoff_iua(void) dissector_add_uint("sctp.port", SCTP_PORT_IUA, iua_handle); dissector_add_uint("sctp.ppi", IUA_PAYLOAD_PROTOCOL_ID, iua_handle); + + lapd_gsm_sapi_dissector_table = find_dissector_table("lapd.gsm.sapi"); + data_handle = find_dissector("data"); + } |