aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-p_mul.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-11-23 07:33:03 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-11-23 07:33:03 +0000
commitcf0d307ef6a6725051d9f64fa58ad1eb9a2e56ee (patch)
tree093a478f92e6c4b9ab5fe5a3b762a27a3e19b7ac /epan/dissectors/packet-p_mul.c
parentff662478889c97fb1013da8e7a76020ee65ec3d7 (diff)
From Stig Bjørlykke
Added a new dissector for CDT (CompressedDataType) as defined in STANAG 4406 Annex E. This dissector is used in P_Mul to decode encapsulated X.411 content. I have added a function in the X.411 dissector to decode a MTS APDU without having a ROS Changes in this patch: * Added CDT dissector * Use CDT dissector in P_Mul * Added function to decode MTS APDU in the X.411 dissector svn path=/trunk/; revision=16567
Diffstat (limited to 'epan/dissectors/packet-p_mul.c')
-rw-r--r--epan/dissectors/packet-p_mul.c146
1 files changed, 90 insertions, 56 deletions
diff --git a/epan/dissectors/packet-p_mul.c b/epan/dissectors/packet-p_mul.c
index 0587c243a6..1ed66d8791 100644
--- a/epan/dissectors/packet-p_mul.c
+++ b/epan/dissectors/packet-p_mul.c
@@ -38,6 +38,11 @@
#include <epan/prefs.h>
#include <epan/reassemble.h>
+#include "packet-cdt.h"
+
+#define PNAME "P_Mul (ACP142)"
+#define PSNAME "P_MUL"
+#define PFNAME "p_mul"
/* Recommended UDP Port Numbers */
#define P_MUL_TPORT 2751
@@ -55,6 +60,10 @@
#define Reject_PDU 0x06
#define Release_PDU 0x07
+/* Type of content to decode from Data_PDU */
+#define DECODE_NONE 0
+#define DECODE_CDT 1
+
void proto_reg_handoff_p_mul (void);
static int proto_p_mul = -1;
@@ -97,15 +106,17 @@ static int hf_msg_fragment_too_long_fragment = -1;
static int hf_msg_fragment_error = -1;
static int hf_msg_reassembled_in = -1;
-
static gint ett_p_mul = -1;
static gint ett_pdu_type = -1;
static gint ett_entry = -1;
static gint ett_msg_fragment = -1;
static gint ett_msg_fragments = -1;
+
/* User definable values to use for dissection */
static gboolean p_mul_reassemble = TRUE;
+static gint decode_option = DECODE_NONE;
+
static guint global_p_mul_tport = P_MUL_TPORT;
static guint global_p_mul_rport = P_MUL_RPORT;
static guint global_p_mul_dport = P_MUL_DPORT;
@@ -120,21 +131,21 @@ static GHashTable *p_mul_fragment_table = NULL;
static GHashTable *p_mul_reassembled_table = NULL;
static const fragment_items p_mul_frag_items = {
- /* Fragment subtrees */
- &ett_msg_fragment,
- &ett_msg_fragments,
- /* Fragment fields */
- &hf_msg_fragments,
- &hf_msg_fragment,
- &hf_msg_fragment_overlap,
- &hf_msg_fragment_overlap_conflicts,
- &hf_msg_fragment_multiple_tails,
- &hf_msg_fragment_too_long_fragment,
- &hf_msg_fragment_error,
- /* Reassembled in field */
- &hf_msg_reassembled_in,
- /* Tag */
- "Message fragments"
+ /* Fragment subtrees */
+ &ett_msg_fragment,
+ &ett_msg_fragments,
+ /* Fragment fields */
+ &hf_msg_fragments,
+ &hf_msg_fragment,
+ &hf_msg_fragment_overlap,
+ &hf_msg_fragment_overlap_conflicts,
+ &hf_msg_fragment_multiple_tails,
+ &hf_msg_fragment_too_long_fragment,
+ &hf_msg_fragment_error,
+ /* Reassembled in field */
+ &hf_msg_reassembled_in,
+ /* Tag */
+ "Message fragments"
};
static const value_string pdu_vals[] = {
@@ -146,7 +157,14 @@ static const value_string pdu_vals[] = {
{ Request_PDU, "Request PDU" },
{ Reject_PDU, "Reject PDU" },
{ Release_PDU, "Release PDU" },
- { 0, NULL } };
+ { 0, NULL }
+};
+
+static enum_val_t decode_options[] = {
+ { "none", "No decoding", DECODE_NONE },
+ { "cdt", "Compressed Data Type", DECODE_CDT },
+ { NULL, NULL, 0 }
+};
static const true_false_string yes_no = {
"No", "Yes"
@@ -154,9 +172,10 @@ static const true_false_string yes_no = {
static const gchar *get_type (guint8 value)
{
- return val_to_str (value, pdu_vals, "Unknown");
+ return val_to_str (value, pdu_vals, "Unknown");
}
+
/*Function checksum, found in ACP142 annex B-3 */
static guint16 checksum (guint8 *buffer, gint len, gint offset)
{
@@ -184,13 +203,16 @@ static guint16 checksum (guint8 *buffer, gint len, gint offset)
return ret;
}
-static void dissect_reassembled_data (tvbuff_t *tvb, proto_tree *tree)
+static void dissect_reassembled_data (tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree)
{
- if (tvb == NULL || tree == NULL) {
- return;
- }
+ if (tvb == NULL || tree == NULL) {
+ return;
+ }
- /* TBD: Dissection of reassembled data */
+ if (decode_option == DECODE_CDT) {
+ dissect_cdt (tvb, pinfo, tree);
+ }
}
static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
@@ -207,11 +229,11 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
gint i, no_missing = 0, offset = 0;
nstime_t ts;
- if (check_col(pinfo->cinfo, COL_PROTOCOL))
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "P_MUL");
+ if (check_col (pinfo->cinfo, COL_PROTOCOL))
+ col_set_str (pinfo->cinfo, COL_PROTOCOL, "P_MUL");
- if (check_col(pinfo->cinfo, COL_INFO))
- col_clear(pinfo->cinfo, COL_INFO);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_clear (pinfo->cinfo, COL_INFO);
/* First fetch PDU Type */
pdu_type = tvb_get_guint8 (tvb, offset + 3) & 0x3F;
@@ -220,6 +242,9 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
proto_item_append_text (ti, ", %s", get_type (pdu_type));
p_mul_tree = proto_item_add_subtree (ti, ett_p_mul);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, "%s", get_type (pdu_type));
+
/* Length of PDU */
pdu_length = tvb_get_ntohs (tvb, offset);
len_en = proto_tree_add_item (p_mul_tree, hf_length, tvb, offset, 2, FALSE);
@@ -276,12 +301,18 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
/* Total Number of PDUs */
no_pdus = tvb_get_ntohs (tvb, offset);
proto_tree_add_item (p_mul_tree, hf_no_pdus, tvb, offset, 2, FALSE);
+ proto_item_append_text (ti, ", No PDUs: %u", no_pdus);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, ", No PDUs: %u", no_pdus);
break;
case Data_PDU:
/* Sequence Number of PDUs */
seq_no = tvb_get_ntohs (tvb, offset);
proto_tree_add_item (p_mul_tree, hf_seq_no, tvb, offset, 2, FALSE);
+ proto_item_append_text (ti, ", Seq no: %u", seq_no);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, ", Seq no: %u", seq_no);
break;
case Announce_PDU:
@@ -329,6 +360,10 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
message_id = tvb_get_ntohl (tvb, offset);
proto_tree_add_item (p_mul_tree, hf_message_id, tvb, offset, 4, FALSE);
offset += 4;
+
+ proto_item_append_text (ti, ", MSID: %u", message_id);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, ", MSID: %u", message_id);
}
if (pdu_type == Address_PDU || pdu_type == Announce_PDU) {
@@ -378,6 +413,10 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
}
}
+ proto_item_append_text (ti, ", Count of Dest: %u", no_dest);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, ", Count of Dest: %u", no_dest);
+
if (p_mul_reassemble) {
/* Add fragment to fragment table */
frag_msg = fragment_add_seq_check (tvb, offset, pinfo, message_id,
@@ -408,8 +447,12 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
new_tvb = process_reassembled_data (tvb, offset, pinfo,
"Reassembled Data", frag_msg,
&p_mul_frag_items, NULL, tree);
+
+ if (check_col (pinfo->cinfo, COL_INFO) && frag_msg)
+ col_append_fstr (pinfo->cinfo, COL_INFO, " (Message Reassembled)");
+
if (new_tvb) {
- dissect_reassembled_data (new_tvb, tree);
+ dissect_reassembled_data (new_tvb, pinfo, tree);
}
}
break;
@@ -441,6 +484,13 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree_add_item (field_tree, hf_miss_seq_no, tvb,offset, 2, FALSE);
offset += 2;
}
+
+ if (no_missing) {
+ proto_item_append_text (ti, ", Missing seq numbers: %u", no_missing);
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, ", Missing seq numbers: %u",
+ no_missing);
+ }
}
break;
@@ -479,28 +529,6 @@ static void dissect_p_mul (tvbuff_t *tvb, packet_info *pinfo _U_,
} else if ((len = tvb_length_remaining (tvb, pdu_length)) > 0) {
proto_item_append_text (len_en, " (more data in packet: %d)", len);
}
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_append_fstr (pinfo->cinfo, COL_INFO, "%s", get_type (pdu_type));
- if (seq_no) {
- col_append_fstr (pinfo->cinfo, COL_INFO, ", Seq no: %u", seq_no);
- } else if (no_pdus) {
- col_append_fstr (pinfo->cinfo, COL_INFO, ", No PDUs: %u", no_pdus);
- }
- if (no_missing) {
- col_append_fstr (pinfo->cinfo, COL_INFO, ", Missing seq numbers: %u",
- no_missing);
- } else if (pdu_type == Address_PDU) {
- col_append_fstr (pinfo->cinfo, COL_INFO, ", Count of Dest: %u",
- no_dest);
- }
- if (message_id) {
- col_append_fstr (pinfo->cinfo, COL_INFO, ", MSID: %u", message_id);
- }
- if (frag_msg) {
- col_append_fstr (pinfo->cinfo, COL_INFO, " (Message Reassembled)");
- }
- }
}
static void p_mul_reassemble_init (void)
@@ -597,6 +625,7 @@ void proto_register_p_mul (void)
{ "Fragment of Data", "p_mul.data_fragment", FT_NONE, BASE_NONE,
NULL, 0x0, "Fragment of Data", HFILL } },
+ /* Fragment entries */
{ &hf_msg_fragments,
{ "Message fragments", "p_mul.fragments", FT_NONE, BASE_NONE,
NULL, 0x00, "Message fragments", HFILL } },
@@ -608,18 +637,19 @@ void proto_register_p_mul (void)
BASE_NONE, NULL, 0x00, "Message fragment overlap", HFILL } },
{ &hf_msg_fragment_overlap_conflicts,
{ "Message fragment overlapping with conflicting data",
- "p_mul.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE,
- NULL, 0x00, "Message fragment overlapping with conflicting data", HFILL } },
+ "p_mul.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE, NULL,
+ 0x00, "Message fragment overlapping with conflicting data", HFILL } },
{ &hf_msg_fragment_multiple_tails,
{ "Message has multiple tail fragments",
"p_mul.fragment.multiple_tails", FT_BOOLEAN, BASE_NONE,
NULL, 0x00, "Message has multiple tail fragments", HFILL } },
{ &hf_msg_fragment_too_long_fragment,
{ "Message fragment too long", "p_mul.fragment.too_long_fragment",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00, "Message fragment too long", HFILL } },
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00, "Message fragment too long",
+ HFILL } },
{ &hf_msg_fragment_error,
- { "Message defragmentation error", "p_mul.fragment.error",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00, "Message defragmentation error", HFILL } },
+ { "Message defragmentation error", "p_mul.fragment.error", FT_FRAMENUM,
+ BASE_NONE, NULL, 0x00, "Message defragmentation error", HFILL } },
{ &hf_msg_reassembled_in,
{ "Reassembled in", "p_mul.reassembled.in", FT_FRAMENUM, BASE_NONE,
NULL, 0x00, "Reassembled in", HFILL } },
@@ -635,7 +665,7 @@ void proto_register_p_mul (void)
module_t *p_mul_module;
- proto_p_mul = proto_register_protocol ("P_Mul (ACP142)", "P_MUL", "p_mul");
+ proto_p_mul = proto_register_protocol (PNAME, PSNAME, PFNAME);
proto_register_field_array (proto_p_mul, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
@@ -649,6 +679,10 @@ void proto_register_p_mul (void)
"Reassemble fragmented P_Mul packets",
"Reassemble fragmented P_Mul packets",
&p_mul_reassemble);
+ prefs_register_enum_preference (p_mul_module, "decode",
+ "Decode Data PDU as",
+ "Type of content in Data_PDU",
+ &decode_option, decode_options, FALSE);
prefs_register_uint_preference (p_mul_module, "tport", "TPORT",
"Used for transmission of Request_PDUs, "
"Reject_PDUs and Release_PDUs between"