aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/packet_info.h5
-rw-r--r--packet-smpp.c485
-rw-r--r--packet-wsp.c8
-rw-r--r--packet-wtp.c4
4 files changed, 315 insertions, 187 deletions
diff --git a/epan/packet_info.h b/epan/packet_info.h
index 4bfdf6899d..10c82c1a69 100644
--- a/epan/packet_info.h
+++ b/epan/packet_info.h
@@ -1,7 +1,7 @@
/* packet_info.h
* Definitions for packet info structures and routines
*
- * $Id: packet_info.h,v 1.36 2003/12/08 21:36:53 guy Exp $
+ * $Id: packet_info.h,v 1.37 2003/12/23 12:07:12 obiot Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -41,7 +41,8 @@ typedef enum {
AT_OSI, /* OSI NSAP */
AT_ARCNET, /* ARCNET */
AT_FC, /* Fibre Channel */
- AT_SS7PC /* SS7 Point Code */
+ AT_SS7PC, /* SS7 Point Code */
+ AT_STRINGZ /* null-terminated string */
} address_type;
typedef struct _address {
diff --git a/packet-smpp.c b/packet-smpp.c
index 8b6c88840c..3ad1b2bf25 100644
--- a/packet-smpp.c
+++ b/packet-smpp.c
@@ -8,7 +8,7 @@
* Data Coding Scheme decoding for GSM (SMS and CBS),
* provided by Olivier Biot.
*
- * $Id: packet-smpp.c,v 1.24 2003/12/22 02:06:27 guy Exp $
+ * $Id: packet-smpp.c,v 1.25 2003/12/23 12:07:13 obiot Exp $
*
* Note on SMS Message reassembly
* ------------------------------
@@ -74,8 +74,24 @@
#include "prefs.h"
#include "reassemble.h"
+/* General-purpose debug logger.
+ * Requires double parentheses because of variable arguments of printf().
+ *
+ * Enable debug logging for SMPP by defining AM_CFLAGS
+ * so that it contains "-DDEBUG_smpp"
+ */
+#ifdef DEBUG_smpp
+#define DebugLog(x) \
+ printf("%s:%u: ", __FILE__, __LINE__); \
+ printf x; \
+ fflush(stdout)
+#else
+#define DebugLog(x) ;
+#endif
+
/* Forward declarations */
static void dissect_smpp(tvbuff_t *, packet_info *, proto_tree *t);
+static void dissect_smpp_gsm_sms(tvbuff_t *, packet_info *, proto_tree *t);
/*
* Initialize the protocol and registered fields
@@ -83,6 +99,7 @@ static void dissect_smpp(tvbuff_t *, packet_info *, proto_tree *t);
* Fixed header section
*/
static int proto_smpp = -1;
+static int proto_smpp_gsm_sms = -1;
static int hf_smpp_command_id = -1;
static int hf_smpp_command_length = -1;
@@ -238,14 +255,14 @@ static gint ett_dlist = -1;
static gint ett_dlist_resp = -1;
static gint ett_opt_param = -1;
static gint ett_dcs = -1;
+static gint ett_gsm_sms = -1;
static gint ett_udh = -1;
-static gint ett_udh_multiple_messages = -1;
-static gint ett_udh_ports = -1;
+static gint ett_udh_ie = -1;
static gint ett_sm_fragment = -1;
static gint ett_sm_fragments = -1;
/* Subdissector declarations */
-static dissector_table_t smpp_dissector_table;
+static dissector_table_t gsm_sms_dissector_table;
/* Short Message reassembly */
static GHashTable *sm_fragment_table = NULL;
@@ -275,7 +292,9 @@ static gboolean port_number_udh_means_wsp = FALSE;
* even if it is not reassembled */
static gboolean try_dissect_1st_frag = FALSE;
+/* For SMPP */
static dissector_handle_t wsp_handle;
+static dissector_handle_t gsm_sms_handle;
static void
sm_defragment_init (void)
@@ -899,6 +918,26 @@ smpp_handle_string(proto_tree *tree, tvbuff_t *tvb, int field, int *offset)
(*offset) += len;
}
+/* NOTE - caller must free the returned string! */
+static char *
+smpp_handle_string_return(proto_tree *tree, tvbuff_t *tvb, int field, int *offset)
+{
+ guint len;
+ char *str;
+
+ len = tvb_strsize(tvb, *offset);
+ if (len > 1) {
+ str = tvb_get_stringz(tvb, *offset, &len);
+ proto_tree_add_string(tree, field, tvb, *offset, len,
+ str);
+ } else {
+ str = g_malloc(1 * sizeof(char));
+ str[0] = '\0';
+ }
+ (*offset) += len;
+ return str;
+}
+
static void
smpp_handle_string_z(proto_tree *tree, tvbuff_t *tvb, int field, int *offset,
const char *null_string)
@@ -1425,7 +1464,8 @@ outbind(proto_tree *tree, tvbuff_t *tvb)
* Call WSP dissector if port matches WSP traffic.
*/
static void
-parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
+parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *top_tree)
{
tvbuff_t *sm_tvb = NULL;
proto_item *subtree, *tree;
@@ -1463,7 +1503,7 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
proto_item_append_text(subtree,
": message %u, part %u of %u", sm_id, frag, frags);
subtree = proto_item_add_subtree(subtree,
- ett_udh_multiple_messages);
+ ett_udh_ie);
proto_tree_add_uint (subtree,
hf_smpp_udh_multiple_messages_msg_id,
tvb, i-3, 1, sm_id);
@@ -1488,7 +1528,7 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
proto_item_append_text(subtree,
": message %u, part %u of %u", sm_id, frag, frags);
subtree = proto_item_add_subtree(subtree,
- ett_udh_multiple_messages);
+ ett_udh_ie);
proto_tree_add_uint (subtree,
hf_smpp_udh_multiple_messages_msg_id,
tvb, i-4, 2, sm_id);
@@ -1511,7 +1551,7 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
proto_item_append_text(subtree,
": source port %u, destination port %u",
p_src, p_dst);
- subtree = proto_item_add_subtree(subtree, ett_udh_ports);
+ subtree = proto_item_add_subtree(subtree, ett_udh_ie);
proto_tree_add_uint (subtree, hf_smpp_udh_ports_dst,
tvb, i-2, 1, p_dst);
proto_tree_add_uint (subtree, hf_smpp_udh_ports_src,
@@ -1530,7 +1570,7 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
proto_item_append_text(subtree,
": source port %u, destination port %u",
p_src, p_dst);
- subtree = proto_item_add_subtree(subtree, ett_udh_ports);
+ subtree = proto_item_add_subtree(subtree, ett_udh_ie);
proto_tree_add_uint (subtree, hf_smpp_udh_ports_dst,
tvb, i-4, 2, p_dst);
proto_tree_add_uint (subtree, hf_smpp_udh_ports_src,
@@ -1607,13 +1647,7 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
sm_tvb = tvb_new_subset (tvb, i, -1, -1);
/* Try calling a subdissector */
if (sm_tvb) {
- if (reassembled && pinfo->fd->num != reassembled_in) {
- /* Reassembled, but not in this packet;
- * so point to the reassembled packet */
- proto_tree_add_uint(tree, hf_sm_reassembled_in,
- tvb, 0, 0, reassembled_in);
- } else if ((reassembled /* This means that
- pinfo->fd->num == reassembled_in */)
+ if ((reassembled && pinfo->fd->num == reassembled_in)
|| frag==0 || (frag==1 && try_dissect_1st_frag)) {
/* Try calling a subdissector only if:
* - the Short Message is reassembled in this very packet,
@@ -1622,12 +1656,12 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
* is switched on, and this is the SM's 1st fragment. */
if ( ports_available ) {
if ( port_number_udh_means_wsp ) {
- call_dissector (wsp_handle, sm_tvb, pinfo, sm_tree);
+ call_dissector (wsp_handle, sm_tvb, pinfo, top_tree);
} else {
- if (! dissector_try_port(smpp_dissector_table, p_src,
- sm_tvb, pinfo, sm_tree)) {
- if (! dissector_try_port(smpp_dissector_table, p_dst,
- sm_tvb, pinfo, sm_tree)) {
+ if (! dissector_try_port(gsm_sms_dissector_table, p_src,
+ sm_tvb, pinfo, top_tree)) {
+ if (! dissector_try_port(gsm_sms_dissector_table, p_dst,
+ sm_tvb, pinfo, top_tree)) {
if (sm_tree) { /* Only display if needed */
proto_tree_add_text (sm_tree, sm_tvb, 0, -1,
"Short Message body");
@@ -1639,7 +1673,9 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
proto_tree_add_text (sm_tree, sm_tvb, 0, -1,
"Short Message body");
}
- } else { /* Not 1st fragment and not reassembled */
+ } else {
+ /* The packet is not reassembled,
+ * or it is reassembled in another packet */
proto_tree_add_text (sm_tree, sm_tvb, 0, -1,
"Unreassembled Short Message fragment %u of %u",
frag, frags);
@@ -1652,20 +1688,24 @@ parse_sm_message(proto_tree *sm_tree, tvbuff_t *tvb, packet_info *pinfo)
}
static void
-submit_sm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo)
+submit_sm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *top_tree)
{
tvbuff_t *tvb_msg;
int offset = 0;
guint8 flag, udhi;
guint8 length;
+ char *src_str = NULL;
+ char *dst_str = NULL;
+ address save_src, save_dst;
smpp_handle_string_z(tree, tvb, hf_smpp_service_type, &offset, "(Default)");
smpp_handle_int1(tree, tvb, hf_smpp_source_addr_ton, &offset);
smpp_handle_int1(tree, tvb, hf_smpp_source_addr_npi, &offset);
- smpp_handle_string(tree, tvb, hf_smpp_source_addr, &offset);
+ src_str = smpp_handle_string_return(tree, tvb, hf_smpp_source_addr, &offset);
smpp_handle_int1(tree, tvb, hf_smpp_dest_addr_ton, &offset);
smpp_handle_int1(tree, tvb, hf_smpp_dest_addr_npi, &offset);
- smpp_handle_string(tree, tvb, hf_smpp_destination_addr, &offset);
+ dst_str = smpp_handle_string_return(tree, tvb, hf_smpp_destination_addr, &offset);
flag = tvb_get_guint8(tvb, offset);
udhi = flag & 0x40;
proto_tree_add_item(tree, hf_smpp_esm_submit_msg_mode,
@@ -1707,16 +1747,29 @@ submit_sm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo)
tvb, offset, length, FALSE);
if (udhi) /* UDHI indicator present */
{
+ DebugLog(("UDHI present - set addresses\n"));
+ /* Save original addresses */
+ COPY_ADDRESS(&save_src, &(pinfo->src));
+ COPY_ADDRESS(&save_dst, &(pinfo->dst));
+ /* Set SMPP source and destination address */
+ SET_ADDRESS(&(pinfo->src), AT_STRINGZ, 1+strlen(src_str), src_str);
+ SET_ADDRESS(&(pinfo->dst), AT_STRINGZ, 1+strlen(dst_str), dst_str);
tvb_msg = tvb_new_subset (tvb, offset,
MIN(length, tvb_reported_length(tvb) - offset), length);
- parse_sm_message(tree, tvb_msg, pinfo);
+ call_dissector (gsm_sms_handle, tvb_msg, pinfo, top_tree);
+ /* Restore original addresses */
+ COPY_ADDRESS(&(pinfo->src), &save_src);
+ COPY_ADDRESS(&(pinfo->dst), &save_dst);
+ /* Get rid of SMPP text string addresses */
+ g_free(src_str);
+ g_free(dst_str);
}
offset += length;
}
smpp_handle_tlv(tree, tvb, &offset);
}
-#define deliver_sm(a, b, c) submit_sm(a, b, c)
+#define deliver_sm(a, b, c, d) submit_sm(a, b, c, d)
static void
replace_sm(proto_tree *tree, tvbuff_t *tvb)
@@ -2103,10 +2156,10 @@ dissect_smpp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
query_sm(smpp_tree, tmp_tvb);
break;
case 4:
- submit_sm(smpp_tree, tmp_tvb, pinfo);
+ submit_sm(smpp_tree, tmp_tvb, pinfo, tree);
break;
case 5:
- deliver_sm(smpp_tree, tmp_tvb, pinfo);
+ deliver_sm(smpp_tree, tmp_tvb, pinfo, tree);
break;
case 6: /* Unbind */
case 21: /* Enquire link */
@@ -2141,14 +2194,223 @@ dissect_smpp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
return;
}
+
+/*
+ * GSM SMS dissection
+ */
+static void
+dissect_smpp_gsm_sms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ proto_item *ti;
+ proto_tree *subtree;
+ DebugLog(("dissect_smpp_gsm_sms() - START\n"));
+ ti = proto_tree_add_item(tree, proto_smpp_gsm_sms, tvb, 0, -1, TRUE);
+ subtree = proto_item_add_subtree(ti, ett_gsm_sms);
+ parse_sm_message(subtree, tvb, pinfo, tree);
+ DebugLog(("dissect_smpp_gsm_sms() - END\n"));
+}
+
/* Register the protocol with Ethereal */
void
-proto_register_smpp(void)
+proto_register_smpp_gsm_sms(void)
{
- module_t *smpp_module; /* Preferences for SMPP */
+ module_t *smpp_gsm_sms_module; /* Preferences for SMPP */
/* Setup list of header fields */
static hf_register_info hf[] = {
+ /*
+ * User Data Header
+ */
+ { &hf_smpp_udh_iei,
+ { "IE Id", "smpp.gsm-sms.udh.iei",
+ FT_UINT8, BASE_HEX, VALS(vals_udh_iei), 0x00,
+ "Name of the User Data Header Information Element.",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_length,
+ { "UDH Length", "smpp.gsm-sms.udh.len",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Length of the User Data Header (bytes)",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_multiple_messages,
+ { "Multiple messages UDH", "smpp.gsm-sms.udh.mm",
+ FT_NONE, BASE_NONE, NULL, 0x00,
+ "Multiple messages User Data Header",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_multiple_messages_msg_id,
+ { "Message identifier", "smpp.gsm-sms.udh.mm.msg_id",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ "Identification of the message",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_multiple_messages_msg_parts,
+ { "Message parts", "smpp.gsm-sms.udh.mm.msg_parts",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Total number of message parts (fragments)",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_multiple_messages_msg_part,
+ { "Message part number", "smpp.gsm-sms.udh.mm.msg_part",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Message part (fragment) sequence number",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_ports,
+ { "Port number UDH", "smpp.gsm-sms.udh.ports",
+ FT_NONE, BASE_NONE, NULL, 0x00,
+ "Port number User Data Header",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_ports_src,
+ { "Source port", "smpp.gsm-sms.udh.ports.src",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Source port",
+ HFILL
+ }
+ },
+ { &hf_smpp_udh_ports_dst,
+ { "Destination port", "smpp.gsm-sms.udh.ports.dst",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Destination port",
+ HFILL
+ }
+ },
+ /*
+ * Short Message fragment reassembly
+ */
+ { &hf_sm_fragments,
+ { "Short Message fragments", "smpp.gsm-sms.fragments",
+ FT_NONE, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragments",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment,
+ { "Short Message fragment", "smpp.gsm-sms.fragment",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragment",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment_overlap,
+ { "Short Message fragment overlap", "smpp.gsm-sms.fragment.overlap",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragment overlaps with other fragment(s)",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment_overlap_conflicts,
+ { "Short Message fragment overlapping with conflicting data",
+ "smpp.gsm-sms.fragment.overlap.conflicts",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragment overlaps with conflicting data",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment_multiple_tails,
+ { "Short Message has multiple tail fragments",
+ "smpp.gsm-sms.fragment.multiple_tails",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragment has multiple tail fragments",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment_too_long_fragment,
+ { "Short Message fragment too long",
+ "smpp.gsm-sms.fragment.too_long_fragment",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message fragment data goes beyond the packet end",
+ HFILL
+ }
+ },
+ { &hf_sm_fragment_error,
+ { "Short Message defragmentation error", "smpp.gsm-sms.fragment.error",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message defragmentation error due to illegal fragments",
+ HFILL
+ }
+ },
+ { &hf_sm_reassembled_in,
+ { "Reassembled in",
+ "smpp.gsm-sms.reassembled.in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ "SMPP Short Message has been reassembled in this packet.", HFILL
+ }
+ },
+ };
+
+ static gint *ett[] = {
+ &ett_gsm_sms,
+ &ett_udh,
+ &ett_udh_ie,
+ &ett_sm_fragment,
+ &ett_sm_fragments,
+ };
+ DebugLog(("Registering SMPP GSM SMS dissector\n"));
+ /* Register the protocol name and description */
+ proto_smpp_gsm_sms = proto_register_protocol(
+ "SMPP - GSM Short Message Service", /* Name */
+ "SMPP GSM SMS", /* Short name */
+ "smpp-gsm-sms"); /* Filter name */
+
+ /* Required function calls to register header fields and subtrees used */
+ proto_register_field_array(proto_smpp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Subdissector code */
+ gsm_sms_dissector_table = register_dissector_table("smpp.gsm-sms.udh.port",
+ "GSM SMS port IE in UDH", FT_UINT16, BASE_DEC);
+
+ /* Preferences for SMPP */
+ smpp_gsm_sms_module = prefs_register_protocol (proto_smpp_gsm_sms, NULL);
+ prefs_register_bool_preference (smpp_gsm_sms_module,
+ "port_number_udh_means_wsp",
+ "Port Number IE in UDH always triggers CL-WSP dissection",
+ "Always decode a GSM Short Message as Connectionless WSP "
+ "if a Port Number Information Element is present "
+ "in the SMS User Data Header.",
+ &port_number_udh_means_wsp);
+ prefs_register_bool_preference (smpp_gsm_sms_module, "try_dissect_1st_fragment",
+ "Always try subdissection of 1st Short Message fragment",
+ "Always try subdissection of the 1st fragment of a fragmented "
+ "GSM Short Message. If reassembly is possible, the Short Message "
+ "may be dissected twice (once as a short frame, once in its "
+ "entirety).",
+ &try_dissect_1st_frag);
+
+ register_dissector("smpp-gsm-sms", dissect_smpp_gsm_sms, proto_smpp_gsm_sms);
+
+ /* SMPP dissector initialization routines */
+ register_init_routine (sm_defragment_init);
+}
+
+void
+proto_reg_handoff_smpp_gsm_sms(void)
+{
+ dissector_handle_t smpp_gsm_sms_handle;
+ DebugLog(("Creating SMPP GSM SMS dissector handle\n"));
+ smpp_gsm_sms_handle = create_dissector_handle(dissect_smpp_gsm_sms,
+ proto_smpp_gsm_sms);
+}
+
+
+
+
+/* Register the protocol with Ethereal */
+void
+proto_register_smpp(void)
+{
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
{ &hf_smpp_command_length,
{ "Length ", "smpp.command_length",
FT_UINT32, BASE_DEC, NULL, 0x00,
@@ -2816,6 +3078,9 @@ proto_register_smpp(void)
HFILL
}
},
+ /*
+ * Data Coding Scheme
+ */
{ &hf_smpp_dcs,
{ "SMPP Data Coding Scheme", "smpp.dcs",
FT_UINT8, BASE_HEX, VALS(vals_data_coding), 0x00,
@@ -2888,129 +3153,6 @@ proto_register_smpp(void)
"as specified by the WAP Forum (WAP over GSM USSD).", HFILL
}
},
- { &hf_smpp_udh_iei,
- { "IE Id", "smpp.udh.iei",
- FT_UINT8, BASE_HEX, VALS(vals_udh_iei), 0x00,
- "Name of the User Data Header Information Element.",
- HFILL
- }
- },
- { &hf_smpp_udh_length,
- { "UDH Length", "smpp.udh.len",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- "Length of the User Data Header (bytes)",
- HFILL
- }
- },
- { &hf_smpp_udh_multiple_messages,
- { "Multiple messages UDH", "smpp.udh.mm",
- FT_NONE, BASE_NONE, NULL, 0x00,
- "Multiple messages User Data Header",
- HFILL
- }
- },
- { &hf_smpp_udh_multiple_messages_msg_id,
- { "Message identifier", "smpp.udh.mm.msg_id",
- FT_UINT16, BASE_DEC, NULL, 0x00,
- "Identification of the message",
- HFILL
- }
- },
- { &hf_smpp_udh_multiple_messages_msg_parts,
- { "Message parts", "smpp.udh.mm.msg_parts",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- "Total number of message parts (fragments)",
- HFILL
- }
- },
- { &hf_smpp_udh_multiple_messages_msg_part,
- { "Message part number", "smpp.udh.mm.msg_part",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- "Message part (fragment) sequence number",
- HFILL
- }
- },
- { &hf_smpp_udh_ports,
- { "Port number UDH", "smpp.udh.ports",
- FT_NONE, BASE_NONE, NULL, 0x00,
- "Port number User Data Header",
- HFILL
- }
- },
- { &hf_smpp_udh_ports_src,
- { "Source port", "smpp.udh.ports.src",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- "Source port",
- HFILL
- }
- },
- { &hf_smpp_udh_ports_dst,
- { "Destination port", "smpp.udh.ports.dst",
- FT_UINT8, BASE_DEC, NULL, 0x00,
- "Destination port",
- HFILL
- }
- },
- /* Short Message fragment reassembly */
- { &hf_sm_fragments,
- { "Short Message fragments", "smpp.fragments",
- FT_NONE, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragments",
- HFILL
- }
- },
- { &hf_sm_fragment,
- { "Short Message fragment", "smpp.fragment",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragment",
- HFILL
- }
- },
- { &hf_sm_fragment_overlap,
- { "Short Message fragment overlap", "smpp.fragment.overlap",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragment overlaps with other fragment(s)",
- HFILL
- }
- },
- { &hf_sm_fragment_overlap_conflicts,
- { "Short Message fragment overlapping with conflicting data",
- "smpp.fragment.overlap.conflicts",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragment overlaps with conflicting data",
- HFILL
- }
- },
- { &hf_sm_fragment_multiple_tails,
- { "Short Message has multiple tail fragments",
- "smpp.fragment.multiple_tails",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragment has multiple tail fragments",
- HFILL
- }
- },
- { &hf_sm_fragment_too_long_fragment,
- { "Short Message fragment too long",
- "smpp.fragment.too_long_fragment",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- "SMPP Short Message fragment data goes beyond the packet end",
- HFILL
- }
- },
- { &hf_sm_fragment_error,
- { "Short Message defragmentation error", "smpp.fragment.error",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- "SMPP Short Message defragmentation error due to illegal fragments",
- HFILL
- }
- },
- { &hf_sm_reassembled_in,
- { "Reassembled in",
- "smpp.reassembled.in",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- "SMPP Short Message has been reassembled in this packet.", HFILL
- }
- },
};
/* Setup protocol subtree array */
static gint *ett[] = {
@@ -3019,12 +3161,14 @@ proto_register_smpp(void)
&ett_dlist_resp,
&ett_opt_param,
&ett_dcs,
+ /*
&ett_udh,
- &ett_udh_multiple_messages,
- &ett_udh_ports,
+ &ett_udh_ie,
&ett_sm_fragment,
&ett_sm_fragments,
+ */
};
+ DebugLog(("Registering SMPP dissector\n"));
/* Register the protocol name and description */
proto_smpp = proto_register_protocol("Short Message Peer to Peer",
"SMPP", "smpp");
@@ -3032,29 +3176,6 @@ proto_register_smpp(void)
/* Required function calls to register header fields and subtrees used */
proto_register_field_array(proto_smpp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
-
- /* Subdissector code */
- smpp_dissector_table = register_dissector_table("smpp.udh.port",
- "SMPP UDH port", FT_UINT16, BASE_DEC);
-
- /* Preferences for SMPP */
- smpp_module = prefs_register_protocol (proto_smpp, NULL);
- prefs_register_bool_preference (smpp_module, "port_number_udh_means_wsp",
- "Port Number IE in UDH always triggers CL-WSP dissection",
- "Always decode a Short Message as Connectionless WSP "
- "if a Port Number Information Element is present "
- "in the User Data Header.",
- &port_number_udh_means_wsp);
- prefs_register_bool_preference (smpp_module, "try_dissect_1st_fragment",
- "Always try subdissection of 1st Short Message fragment",
- "Always try subdissection of the 1st fragment of a fragmented "
- "Short Message. If reassembly is possible, the Short Message "
- "may be dissected twice (once as a short frame, once in its "
- "entirety).",
- &try_dissect_1st_frag);
-
- /* SMPP dissector initialization routines */
- register_init_routine (sm_defragment_init);
}
/*
@@ -3083,5 +3204,9 @@ proto_reg_handoff_smpp(void)
/* Required for call_dissector() */
wsp_handle = find_dissector ("wsp-cl");
- assert (wsp_handle);
+ g_assert (wsp_handle);
+ DebugLog(("Finding smpp-gsm-sms subdissector\n"));
+ gsm_sms_handle = find_dissector("smpp-gsm-sms");
+ g_assert (gsm_sms_handle);
}
+
diff --git a/packet-wsp.c b/packet-wsp.c
index 46e481602d..0a9adb906e 100644
--- a/packet-wsp.c
+++ b/packet-wsp.c
@@ -2,7 +2,7 @@
*
* Routines to dissect WSP component of WAP traffic.
*
- * $Id: packet-wsp.c,v 1.101 2003/12/22 22:57:09 obiot Exp $
+ * $Id: packet-wsp.c,v 1.102 2003/12/23 12:07:13 obiot Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -1737,6 +1737,8 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf)
guint32 val = 0;
nstime_t tv;
+ if (! tree)
+ return;
if (offset >= tvb_len)
return; /* No headers! */
@@ -6989,8 +6991,8 @@ proto_reg_handoff_wsp(void)
dissector_add("udp.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle);
/* SMPP dissector can also carry WSP */
- dissector_add("smpp.udh.port", UDP_PORT_WSP, wsp_fromudp_handle);
- dissector_add("smpp.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle);
+ dissector_add("smpp.gsm-sms.udh.port", UDP_PORT_WSP, wsp_fromudp_handle);
+ dissector_add("smpp.gsm-sms.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle);
/* This dissector is also called from the WTP and WTLS dissectors */
}
diff --git a/packet-wtp.c b/packet-wtp.c
index 418fbbdab5..69f136430c 100644
--- a/packet-wtp.c
+++ b/packet-wtp.c
@@ -2,7 +2,7 @@
*
* Routines to dissect WTP component of WAP traffic.
*
- * $Id: packet-wtp.c,v 1.57 2003/12/22 11:55:10 obiot Exp $
+ * $Id: packet-wtp.c,v 1.58 2003/12/23 12:07:14 obiot Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -1003,5 +1003,5 @@ proto_reg_handoff_wtp(void)
wtp_fromudp_handle = find_dissector("wtp-udp");
dissector_add("udp.port", UDP_PORT_WTP_WSP, wtp_fromudp_handle);
- dissector_add("smpp.udh.port", UDP_PORT_WTP_WSP, wtp_fromudp_handle);
+ dissector_add("smpp.gsm-sms.udh.port", UDP_PORT_WTP_WSP, wtp_fromudp_handle);
}