aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-10-02 19:52:42 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-10-02 19:52:42 +0000
commit99422f370c200b361be2477a97a62af2efd68f4f (patch)
tree6bd2f8d91b85ac69913ea25fe22d61cedab5d640
parent76e8ff1d8dc8d373a21e5c46ea584088c9590a75 (diff)
Add dissection of GSM/CDMA SMS in PDU mode
svn path=/trunk/; revision=52337
-rw-r--r--epan/dissectors/packet-mbim.c74
-rw-r--r--epan/dissectors/packet-usb-com.c7
2 files changed, 60 insertions, 21 deletions
diff --git a/epan/dissectors/packet-mbim.c b/epan/dissectors/packet-mbim.c
index 22b903cde3..3e64b8f7da 100644
--- a/epan/dissectors/packet-mbim.c
+++ b/epan/dissectors/packet-mbim.c
@@ -474,8 +474,10 @@ static gint ett_mbim_pair_list = -1;
static gint ett_mbim_pin = -1;
static gint ett_mbim_buffer = -1;
-static dissector_handle_t proactive_handle = NULL;
-static dissector_handle_t etsi_cat_handle = NULL;
+static dissector_handle_t proactive_handle;
+static dissector_handle_t etsi_cat_handle;
+static dissector_handle_t gsm_sms_handle;
+static dissector_handle_t cdma_sms_handle;
struct mbim_info {
guint32 req_frame;
@@ -484,6 +486,7 @@ struct mbim_info {
struct mbim_conv_info {
wmem_tree_t *trans;
+ guint32 cellular_class;
};
#define MBIM_OPEN_MSG 0x00000001
@@ -769,9 +772,12 @@ static const value_string mbim_device_caps_info_device_type_vals[] = {
{ 0, NULL}
};
+#define MBIM_CELLULAR_CLASS_GSM 1
+#define MBIM_CELLULAR_CLASS_CDMA 2
+
static const value_string mbim_cellular_class_vals[] = {
- { 1, "GSM"},
- { 2, "CDMA"},
+ { MBIM_CELLULAR_CLASS_GSM, "GSM"},
+ { MBIM_CELLULAR_CLASS_CDMA, "CDMA"},
{ 0, NULL}
};
@@ -1590,7 +1596,8 @@ mbim_dissect_cid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint *offs
}
static void
-mbim_dissect_device_caps_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
+mbim_dissect_device_caps_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset,
+ struct mbim_conv_info *mbim_conv)
{
gint base_offset;
guint32 custom_class_offset, custom_class_size, device_id_offset, device_id_size,
@@ -1599,7 +1606,9 @@ mbim_dissect_device_caps_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
base_offset = offset;
proto_tree_add_item(tree, hf_mbim_device_caps_info_device_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
- proto_tree_add_item(tree, hf_mbim_device_caps_info_cellular_class, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ mbim_conv->cellular_class = tvb_get_letohl(tvb, offset);
+ proto_tree_add_uint(tree, hf_mbim_device_caps_info_cellular_class, tvb, offset, 4,
+ mbim_conv->cellular_class);
offset += 4;
proto_tree_add_item(tree, hf_mbim_device_caps_info_voice_class, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
@@ -2653,10 +2662,14 @@ mbim_dissect_sms_configuration_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto
}
static void
-mbim_dissect_sms_pdu_record(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
+mbim_dissect_sms_pdu_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+ struct mbim_conv_info *mbim_conv)
{
gint base_offset;
guint32 pdu_data_offset, pdu_data_size;
+ tvbuff_t *sms_tvb;
+ proto_item *ti;
+ proto_tree *subtree;
base_offset = offset;
proto_tree_add_item(tree, hf_mbim_sms_pdu_record_message_index, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -2670,8 +2683,15 @@ mbim_dissect_sms_pdu_record(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
proto_tree_add_uint(tree, hf_mbim_sms_pdu_record_pdu_data_size, tvb, offset, 4, pdu_data_size);
offset += 4;
if (pdu_data_offset && pdu_data_size) {
- proto_tree_add_item(tree, hf_mbim_sms_pdu_record_pdu_data, tvb, base_offset + pdu_data_offset,
- pdu_data_size, ENC_NA);
+ ti = proto_tree_add_item(tree, hf_mbim_sms_pdu_record_pdu_data, tvb, base_offset + pdu_data_offset,
+ pdu_data_size, ENC_NA);
+ subtree = proto_item_add_subtree(ti, ett_mbim_buffer);
+ sms_tvb = tvb_new_subset(tvb, base_offset + pdu_data_offset, pdu_data_size, pdu_data_size);
+ if (mbim_conv->cellular_class & MBIM_CELLULAR_CLASS_GSM) {
+ call_dissector(gsm_sms_handle, sms_tvb, pinfo, subtree);
+ } else if (mbim_conv->cellular_class & MBIM_CELLULAR_CLASS_CDMA) {
+ call_dissector(cdma_sms_handle, sms_tvb, pinfo, subtree);
+ }
}
}
@@ -2737,7 +2757,8 @@ mbim_dissect_sms_read_req(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
}
static void
-mbim_dissect_sms_read_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
+mbim_dissect_sms_read_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+ struct mbim_conv_info *mbim_conv)
{
proto_item *ti;
proto_tree *subtree;
@@ -2771,7 +2792,7 @@ mbim_dissect_sms_read_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
sms_size, "SMS Element #%u", i+1);
subtree = proto_item_add_subtree(ti, ett_mbim_pair_list);
if (format == MBIM_SMS_FORMAT_PDU) {
- mbim_dissect_sms_pdu_record(tvb, pinfo, subtree, base_offset + sms_offset);
+ mbim_dissect_sms_pdu_record(tvb, pinfo, subtree, base_offset + sms_offset, mbim_conv);
} else if (format == MBIM_SMS_FORMAT_CDMA) {
mbim_dissect_sms_cdma_record(tvb, pinfo, subtree, base_offset + sms_offset);
} else {
@@ -2784,10 +2805,14 @@ mbim_dissect_sms_read_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
static void
-mbim_dissect_sms_send_pdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
+mbim_dissect_sms_send_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+ struct mbim_conv_info *mbim_conv)
{
gint base_offset;
guint32 pdu_data_offset, pdu_data_size;
+ tvbuff_t *sms_tvb;
+ proto_item *ti;
+ proto_tree *subtree;
base_offset = offset;
pdu_data_offset = tvb_get_letohl(tvb, offset);
@@ -2797,8 +2822,15 @@ mbim_dissect_sms_send_pdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
proto_tree_add_uint(tree, hf_mbim_sms_send_pdu_pdu_data_size, tvb, offset, 4, pdu_data_size);
offset += 4;
if (pdu_data_offset && pdu_data_size) {
- proto_tree_add_item(tree, hf_mbim_sms_send_pdu_pdu_data, tvb, base_offset + pdu_data_offset,
- pdu_data_size, ENC_NA);
+ ti = proto_tree_add_item(tree, hf_mbim_sms_send_pdu_pdu_data, tvb, base_offset + pdu_data_offset,
+ pdu_data_size, ENC_NA);
+ subtree = proto_item_add_subtree(ti, ett_mbim_buffer);
+ sms_tvb = tvb_new_subset(tvb, base_offset + pdu_data_offset, pdu_data_size, pdu_data_size);
+ if (mbim_conv->cellular_class & MBIM_CELLULAR_CLASS_GSM) {
+ call_dissector(gsm_sms_handle, sms_tvb, pinfo, subtree);
+ } else if (mbim_conv->cellular_class & MBIM_CELLULAR_CLASS_CDMA) {
+ call_dissector(cdma_sms_handle, sms_tvb, pinfo, subtree);
+ }
}
}
@@ -2839,7 +2871,8 @@ mbim_dissect_sms_send_cdma(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
}
static void
-mbim_dissect_set_sms_send(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
+mbim_dissect_set_sms_send(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+ struct mbim_conv_info *mbim_conv)
{
guint32 format;
@@ -2847,7 +2880,7 @@ mbim_dissect_set_sms_send(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
proto_tree_add_uint(tree, hf_mbim_set_sms_send_format, tvb, offset, 4, format);
offset += 4;
if (format == MBIM_SMS_FORMAT_PDU) {
- mbim_dissect_sms_send_pdu(tvb, pinfo, tree, offset);
+ mbim_dissect_sms_send_pdu(tvb, pinfo, tree, offset, mbim_conv);
} else if (format == MBIM_SMS_FORMAT_CDMA) {
mbim_dissect_sms_send_cdma(tvb, pinfo, tree, offset);
} else {
@@ -3292,6 +3325,7 @@ dissect_mbim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
if (!mbim_conv) {
mbim_conv = wmem_new(wmem_file_scope(), struct mbim_conv_info);
mbim_conv->trans = wmem_tree_new(wmem_file_scope());
+ mbim_conv->cellular_class = 0;
conversation_add_proto_data(conversation, proto_mbim, mbim_conv);
}
@@ -3556,7 +3590,7 @@ dissect_mbim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
break;
case MBIM_CID_SMS_SEND:
if (cmd_type == MBIM_COMMAND_SET) {
- mbim_dissect_set_sms_send(tvb, pinfo, subtree, offset);
+ mbim_dissect_set_sms_send(tvb, pinfo, subtree, offset, mbim_conv);
} else {
proto_tree_add_expert(subtree, pinfo, &ei_mbim_unexpected_msg, tvb, offset, -1);
}
@@ -3851,7 +3885,7 @@ dissect_mbim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
switch (cid) {
case MBIM_CID_DEVICE_CAPS:
if (msg_type == MBIM_COMMAND_DONE) {
- mbim_dissect_device_caps_info(tvb, pinfo, subtree, offset);
+ mbim_dissect_device_caps_info(tvb, pinfo, subtree, offset, mbim_conv);
} else {
proto_tree_add_expert(subtree, pinfo, &ei_mbim_unexpected_msg, tvb, offset, -1);
}
@@ -3985,7 +4019,7 @@ dissect_mbim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
mbim_dissect_sms_configuration_info(tvb, pinfo, subtree, offset);
break;
case MBIM_CID_SMS_READ:
- mbim_dissect_sms_read_info(tvb, pinfo, subtree, offset);
+ mbim_dissect_sms_read_info(tvb, pinfo, subtree, offset, mbim_conv);
break;
case MBIM_CID_SMS_SEND:
if (msg_type == MBIM_COMMAND_DONE) {
@@ -6339,6 +6373,8 @@ proto_reg_handoff_mbim(void)
{
proactive_handle = find_dissector("gsm_sim.bertlv");
etsi_cat_handle = find_dissector("etsi_cat");
+ gsm_sms_handle = find_dissector("gsm_sms_handle");
+ cdma_sms_handle = find_dissector("ansi_637_trans");
}
/*
diff --git a/epan/dissectors/packet-usb-com.c b/epan/dissectors/packet-usb-com.c
index 62492fac9a..d02ad54d99 100644
--- a/epan/dissectors/packet-usb-com.c
+++ b/epan/dissectors/packet-usb-com.c
@@ -78,6 +78,7 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
usb_conv_info_t *usb_conv_info;
proto_tree *subtree;
proto_item *ti;
+ gint offset = 0;
usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info;
@@ -94,7 +95,7 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
{
case COM_SUBCLASS_MBIM:
if (mbim_handle) {
- return call_dissector(mbim_handle, tvb, pinfo, tree);
+ offset = call_dissector_only(mbim_handle, tvb, pinfo, tree, NULL);
}
break;
default:
@@ -102,7 +103,9 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}
- proto_tree_add_item(subtree, hf_usb_com_payload, tvb, 0, -1, ENC_NA);
+ if (tvb_reported_length_remaining(tvb, offset) != 0) {
+ proto_tree_add_item(subtree, hf_usb_com_payload, tvb, offset, -1, ENC_NA);
+ }
return tvb_length(tvb);
}