aboutsummaryrefslogtreecommitdiffstats
path: root/packet-wtp.c
diff options
context:
space:
mode:
authorOlivier Biot <obiot.ethereal@gmail.com>2003-12-22 11:55:10 +0000
committerOlivier Biot <obiot.ethereal@gmail.com>2003-12-22 11:55:10 +0000
commit8751f63b3a3c78962f6b50e2b997e3e633c90a0a (patch)
treeb66faf75048f6b8d0e4aa4005ea18fc95a41751a /packet-wtp.c
parent40d418325f87230029f1a250e4d351882dd1e35b (diff)
downloadwireshark-8751f63b3a3c78962f6b50e2b997e3e633c90a0a.tar.gz
wireshark-8751f63b3a3c78962f6b50e2b997e3e633c90a0a.tar.bz2
wireshark-8751f63b3a3c78962f6b50e2b997e3e633c90a0a.zip
Speed up WTP dissection by performing TPI subdissection only once and setting
the WTP length after processing the TPI. Update reassembly so dissection of reassembled data is only enabled in the last reassembled packet. This way, we alo see the WTP PDUs. svn path=/trunk/; revision=9410
Diffstat (limited to 'packet-wtp.c')
-rw-r--r--packet-wtp.c99
1 files changed, 58 insertions, 41 deletions
diff --git a/packet-wtp.c b/packet-wtp.c
index 1589c6ce28..418fbbdab5 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.56 2003/12/21 12:21:37 jmayer Exp $
+ * $Id: packet-wtp.c,v 1.57 2003/12/22 11:55:10 obiot Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -195,6 +195,7 @@ static int hf_wtp_fragment_overlap_conflict = HF_EMPTY;
static int hf_wtp_fragment_multiple_tails = HF_EMPTY;
static int hf_wtp_fragment_too_long_fragment = HF_EMPTY;
static int hf_wtp_fragment_error = HF_EMPTY;
+static int hf_wtp_reassembled_in = HF_EMPTY;
/* Initialize the subtree pointers */
static gint ett_wtp = ETT_EMPTY;
@@ -214,7 +215,7 @@ static const fragment_items wtp_frag_items = {
&hf_wtp_fragment_multiple_tails,
&hf_wtp_fragment_too_long_fragment,
&hf_wtp_fragment_error,
- NULL,
+ &hf_wtp_reassembled_in,
"fragments"
};
@@ -323,7 +324,7 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
int abortType = 0;
/* Set up structures we'll need to add the protocol subtree and manage it */
- proto_item *ti;
+ proto_item *ti = NULL;
proto_tree *wtp_tree = NULL;
char pdut;
@@ -427,44 +428,14 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (fRID) {
g_string_append( szInfo, " R" );
};
- if (fCon) { /* Scan variable part (TPI's), */
- /* determine length of it */
- unsigned char tCon;
- unsigned char tByte;
-
- do {
- tByte = tvb_get_guint8(tvb, offCur + cbHeader + vHeader);
- tCon = tByte & 0x80;
- if (tByte & 0x04) /* Long format */
- vHeader = vHeader + tvb_get_guint8(tvb,
- offCur + cbHeader + vHeader + 1) + 2;
- else
- vHeader = vHeader + (tByte & 0x03) + 1;
- } while (tCon);
- }
-
-#ifdef DEBUG
- fprintf( stderr, "dissect_wtp: cbHeader = %d\n", cbHeader );
-#endif
-
- /* Only update "Info" column when no data in this PDU will
- * be handed off to a subsequent dissector.
- */
- if (check_col(pinfo->cinfo, COL_INFO) &&
- ((tvb_length_remaining(tvb, offCur + cbHeader + vHeader) <= 0) ||
- (pdut == ACK) || (pdut==NEGATIVE_ACK) || (pdut==ABORT)) ) {
-#ifdef DEBUG
- fprintf(stderr, "dissect_wtp: (6) About to set info_col header to %s\n", szInfo->str);
-#endif
- col_append_str(pinfo->cinfo, COL_INFO, szInfo->str);
- };
/* In the interest of speed, if "tree" is NULL, don't do any work not
necessary to generate protocol tree items. */
if (tree) {
#ifdef DEBUG
fprintf(stderr, "dissect_wtp: cbHeader = %d\n", cbHeader);
#endif
- ti = proto_tree_add_item(tree, proto_wtp, tvb, offCur, cbHeader + vHeader, bo_little_endian);
+ /* NOTE - Length will be set when we process the TPI */
+ ti = proto_tree_add_item(tree, proto_wtp, tvb, offCur, 0, bo_little_endian);
#ifdef DEBUG
fprintf(stderr, "dissect_wtp: (7) Returned from proto_tree_add_item\n");
#endif
@@ -565,6 +536,12 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
default:
break;
};
+ } else { /* Tree = closed */
+#ifdef DEBUG
+ fprintf(stderr, "dissect_wtp: (4) tree was %p\n", tree);
+#endif
+ }
+ /* Process the varialbe part */
if (fCon) { /* Now, analyze variable part */
unsigned char tCon;
unsigned char tByte;
@@ -581,20 +558,40 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offCur + cbHeader + vHeader + 1);
else
tpiLen = 1 + (tByte & 0x03);
+ if (tree)
+ {
tmp_tvb = tvb_new_subset(tvb, offCur + cbHeader + vHeader,
tpiLen, tpiLen);
wtp_handle_tpi(wtp_tree, tmp_tvb);
+ }
vHeader += tpiLen;
} while (tCon);
} else {
/* There is no variable part */
} /* End of variable part of header */
- } else {
+
+ /* Set the length of the WTP protocol part now we know the length of the
+ * fixed and variable WTP headers */
+ if (tree)
+ proto_item_set_len(ti, cbHeader + vHeader);
+
#ifdef DEBUG
- fprintf(stderr, "dissect_wtp: (4) tree was %p\n", tree);
+ fprintf( stderr, "dissect_wtp: cbHeader = %d\n", cbHeader );
#endif
- }
- /*
+
+ /* Only update "Info" column when no data in this PDU will
+ * be handed off to a subsequent dissector.
+ */
+ if (check_col(pinfo->cinfo, COL_INFO) &&
+ ((tvb_length_remaining(tvb, offCur + cbHeader + vHeader) <= 0) ||
+ (pdut == ACK) || (pdut==NEGATIVE_ACK) || (pdut==ABORT)) ) {
+#ifdef DEBUG
+ fprintf(stderr, "dissect_wtp: (6) About to set info_col header to %s\n", szInfo->str);
+#endif
+ col_append_str(pinfo->cinfo, COL_INFO, szInfo->str);
+ };
+
+ /*
* Any remaining data ought to be WSP data (if not WTP ACK, NACK
* or ABORT pdu), so hand off (defragmented) to the WSP dissector.
* Note that the last packet of a fragmented WTP message needn't
@@ -632,12 +629,25 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
show_fragment_seq_tree(fd_head, &wtp_frag_items,
wtp_tree, pinfo, wsp_tvb);
- call_dissector(wsp_handle, wsp_tvb, pinfo, tree);
+ if (pinfo->fd->num == fd_head->reassembled_in) {
+ /* Reassembled in this packet */
+ call_dissector(wsp_handle, wsp_tvb, pinfo, tree);
+ } else {
+ /* Reassembled in another packet */
+ if (check_col(pinfo->cinfo, COL_INFO))
+ /* Won't call WSP so display */
+ col_append_str(pinfo->cinfo, COL_INFO, szInfo->str);
+ if (tree != NULL)
+ proto_tree_add_text(wtp_tree, tvb, dataOffset, -1, "Payload");
+ proto_tree_add_uint(wtp_tree, hf_wtp_reassembled_in,
+ tvb, 0, 0, fd_head->reassembled_in);
+ }
}
else
{
/* Reassembly isn't complete; just show the fragment */
- if (check_col(pinfo->cinfo, COL_INFO)) /* Won't call WSP so display */
+ if (check_col(pinfo->cinfo, COL_INFO))
+ /* Won't call WSP so display */
col_append_str(pinfo->cinfo, COL_INFO, szInfo->str);
if (tree != NULL)
proto_tree_add_text(wtp_tree, tvb, dataOffset, -1, "Payload");
@@ -929,6 +939,13 @@ proto_register_wtp(void)
"Defragmentation error due to illegal fragments", HFILL
}
},
+ { &hf_wtp_reassembled_in,
+ { "Reassembled in",
+ "wtp.reassembled.in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "WTP fragments are reassembled in the given packet", HFILL
+ }
+ },
{ &hf_wtp_fragment,
{ "WTP Fragment",
"wtp.fragment",