aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-iua.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2013-08-06 17:11:42 +0000
committerAnders Broman <anders.broman@ericsson.com>2013-08-06 17:11:42 +0000
commit06c37f8665d65f9b1b57e7e07e4fdb4f5899abc2 (patch)
tree0c3d3cb27ef3fdcba478f4077c841004ee20fa50 /epan/dissectors/packet-iua.c
parentcc7c777f552d076dba2837ff542445d9aacd5e39 (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.c40
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");
+
}