aboutsummaryrefslogtreecommitdiffstats
path: root/packet-x25.c
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2003-03-05 05:20:38 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2003-03-05 05:20:38 +0000
commit2316ffdb45736c3cd41e2812425d4e4755be10fa (patch)
tree5d07cdd7c92c21a0774be0b73e92a5b092dd2f78 /packet-x25.c
parent8a5b74eecace5a24c8113b2789f89dddae556ffd (diff)
Distinguish between the two directions of X.25 traffic when doing
reassembly - don't reassemble packets from different directions into a single packet. We don't need to check whether we have enough data for reassembly - "fragment_add_seq_next()" does that for us. If we're doing reassembly, show the user data of packets with the M bit set as "User data". git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@7281 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-x25.c')
-rw-r--r--packet-x25.c56
1 files changed, 48 insertions, 8 deletions
diff --git a/packet-x25.c b/packet-x25.c
index 042855da32..25e15f3ebb 100644
--- a/packet-x25.c
+++ b/packet-x25.c
@@ -2,7 +2,7 @@
* Routines for X.25 packet disassembly
* Olivier Abad <oabad@noos.fr>
*
- * $Id: packet-x25.c,v 1.82 2003/03/05 01:12:11 guy Exp $
+ * $Id: packet-x25.c,v 1.83 2003/03/05 05:20:38 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -1445,7 +1445,7 @@ static const value_string sharing_strategy_vals[] = {
static void
dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
- x25_dir_t dir)
+ x25_dir_t dir, gboolean side)
{
proto_tree *x25_tree=0, *gfi_tree=0, *userdata_tree=0;
proto_item *ti;
@@ -1462,6 +1462,7 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
gboolean q_bit_set = FALSE;
gboolean m_bit_set;
gint payload_len;
+ guint32 frag_key;
void *saved_private_data;
fragment_data *fd_head;
@@ -2126,9 +2127,23 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
localoffset += 2;
}
payload_len = tvb_reported_length_remaining(tvb, localoffset);
- if (reassemble_x25 && tvb_bytes_exist(tvb, localoffset, payload_len)) {
+ if (reassemble_x25) {
+ /*
+ * Reassemble received and sent traffic separately.
+ * We don't reassemble traffic with an unknown direction
+ * at all.
+ */
+ frag_key = vc;
+ if (side) {
+ /*
+ * OR in an extra bit to distinguish from traffic
+ * in the other direction.
+ */
+ frag_key |= 0x10000;
+ }
fd_head = fragment_add_seq_next(tvb, localoffset,
- pinfo, vc, x25_segment_table,
+ pinfo, frag_key,
+ x25_segment_table,
x25_reassembled_table,
payload_len, m_bit_set);
pinfo->fragmented = m_bit_set;
@@ -2145,11 +2160,26 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
&x25_frag_items,
x25_tree,
pinfo, next_tvb);
- }
+ }
}
+
+ if (m_bit_set && next_tvb == NULL) {
+ /*
+ * This isn't the last packet, so just
+ * show it as X.25 user data.
+ */
+ proto_tree_add_text(x25_tree, tvb, localoffset, -1,
+ "User data (%u byte%s)", payload_len,
+ plurality(payload_len, "", "s"));
+ return;
+ }
}
break;
}
+
+ /*
+ * Non-data packets (RR, RNR, REJ).
+ */
switch (PACKET_TYPE_FC(pkt_type))
{
case X25_RR:
@@ -2235,7 +2265,8 @@ dissect_x25_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
localoffset += (modulo == 8) ? 1 : 2;
}
- if (localoffset >= tvb_reported_length(tvb)) return;
+ if (localoffset >= tvb_reported_length(tvb))
+ return;
if (pinfo->fragmented)
return;
@@ -2303,7 +2334,8 @@ dissect_x25_dir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
dissect_x25_common(tvb, pinfo, tree,
(pinfo->pseudo_header->x25.flags & FROM_DCE) ? X25_FROM_DCE :
- X25_FROM_DTE);
+ X25_FROM_DTE,
+ pinfo->pseudo_header->x25.flags & FROM_DCE);
}
/*
@@ -2313,10 +2345,18 @@ dissect_x25_dir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
static void
dissect_x25(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
+ int direction;
+
/*
* We don't know if this packet is DTE->DCE or DCE->DCE.
+ * However, we can, at least, distinguish between the two
+ * sides of the conversation, based on the addresses and
+ * ports.
*/
- dissect_x25_common(tvb, pinfo, tree, X25_UNKNOWN);
+ direction = CMP_ADDRESS(&pinfo->src, &pinfo->dst);
+ if (direction == 0)
+ direction = (pinfo->srcport > pinfo->destport)*2 - 1;
+ dissect_x25_common(tvb, pinfo, tree, X25_UNKNOWN, direction > 0);
}
static void