aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packet-sctp.c61
-rw-r--r--packet-tcp.c33
-rw-r--r--packet-udp.c34
3 files changed, 103 insertions, 25 deletions
diff --git a/packet-sctp.c b/packet-sctp.c
index 47536178b0..1587dd937e 100644
--- a/packet-sctp.c
+++ b/packet-sctp.c
@@ -10,7 +10,7 @@
* - support for reassembly
* - code cleanup
*
- * $Id: packet-sctp.c,v 1.37 2002/05/30 08:34:18 guy Exp $
+ * $Id: packet-sctp.c,v 1.38 2002/06/08 21:54:52 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -1317,24 +1317,51 @@ static gboolean
dissect_payload(tvbuff_t *payload_tvb, packet_info *pinfo, proto_tree *tree,
proto_tree *chunk_tree, guint32 ppi, guint16 payload_length, guint16 padding_length)
{
- /* do lookup with the subdissector table */
- if (dissector_try_port (sctp_ppi_dissector_table, ppi, payload_tvb, pinfo, tree) ||
- dissector_try_port(sctp_port_dissector_table, pinfo->srcport, payload_tvb, pinfo, tree) ||
- dissector_try_port(sctp_port_dissector_table, pinfo->destport, payload_tvb, pinfo, tree)){
+ guint32 low_port, high_port;
+
+ /* Do lookups with the subdissector table.
+
+ When trying port numbers, we try the port number with the lower value
+ first, followed by the port number with the higher value. This means
+ that, for packets where a dissector is registered for *both* port
+ numbers, and where there's no match on the PPI:
+
+ 1) we pick the same dissector for traffic going in both directions;
+
+ 2) we prefer the port number that's more likely to be the right
+ one (as that prefers well-known ports to reserved ports);
+
+ although there is, of course, no guarantee that any such strategy
+ will always pick the right port number.
+
+ XXX - we ignore port numbers of 0, as some dissectors use a port
+ number of 0 to disable the port. */
+ if (dissector_try_port(sctp_ppi_dissector_table, ppi, payload_tvb, pinfo, tree))
return TRUE;
+ if (pinfo->srcport > pinfo->destport) {
+ low_port = pinfo->destport;
+ high_port = pinfo->srcport;
+ } else {
+ low_port = pinfo->srcport;
+ high_port = pinfo->destport;
}
- else {
- if (check_col(pinfo->cinfo, COL_INFO))
- col_append_str(pinfo->cinfo, COL_INFO, "DATA ");
- proto_tree_add_text(chunk_tree, payload_tvb, 0, payload_length,
- "Payload (%u byte%s)",
- payload_length, plurality(payload_length, "", "s"));
- if (padding_length > 0)
- proto_tree_add_text(chunk_tree, payload_tvb, payload_length, padding_length,
- "Padding: %u byte%s",
- padding_length, plurality(padding_length, "", "s"));
- return FALSE;
- }
+ if (low_port != 0 &&
+ dissector_try_port(sctp_port_dissector_table, low_port, payload_tvb, pinfo, tree))
+ return TRUE;
+ if (high_port != 0 &&
+ dissector_try_port(sctp_port_dissector_table, high_port, payload_tvb, pinfo, tree))
+ return TRUE;
+
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_append_str(pinfo->cinfo, COL_INFO, "DATA ");
+ proto_tree_add_text(chunk_tree, payload_tvb, 0, payload_length,
+ "Payload (%u byte%s)",
+ payload_length, plurality(payload_length, "", "s"));
+ if (padding_length > 0)
+ proto_tree_add_text(chunk_tree, payload_tvb, payload_length, padding_length,
+ "Padding: %u byte%s",
+ padding_length, plurality(padding_length, "", "s"));
+ return FALSE;
}
static gboolean
diff --git a/packet-tcp.c b/packet-tcp.c
index c8a1db09ac..515075d9d1 100644
--- a/packet-tcp.c
+++ b/packet-tcp.c
@@ -1,7 +1,7 @@
/* packet-tcp.c
* Routines for TCP packet disassembly
*
- * $Id: packet-tcp.c,v 1.143 2002/06/04 07:03:46 guy Exp $
+ * $Id: packet-tcp.c,v 1.144 2002/06/08 21:54:52 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -1023,6 +1023,7 @@ decode_tcp_ports(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int src_port, int dst_port)
{
tvbuff_t *next_tvb;
+ int low_port, high_port;
next_tvb = tvb_new_subset(tvb, offset, -1, -1);
@@ -1033,9 +1034,33 @@ decode_tcp_ports(tvbuff_t *tvb, int offset, packet_info *pinfo,
src_port, dst_port, next_tvb, pinfo, tree))
return;
- /* do lookup with the subdissector table */
- if (dissector_try_port(subdissector_table, src_port, next_tvb, pinfo, tree) ||
- dissector_try_port(subdissector_table, dst_port, next_tvb, pinfo, tree))
+ /* Do lookups with the subdissector table.
+ We try the port number with the lower value first, followed by the
+ port number with the higher value. This means that, for packets
+ where a dissector is registered for *both* port numbers:
+
+ 1) we pick the same dissector for traffic going in both directions;
+
+ 2) we prefer the port number that's more likely to be the right
+ one (as that prefers well-known ports to reserved ports);
+
+ although there is, of course, no guarantee that any such strategy
+ will always pick the right port number.
+
+ XXX - we ignore port numbers of 0, as some dissectors use a port
+ number of 0 to disable the port. */
+ if (src_port > dst_port) {
+ low_port = dst_port;
+ high_port = src_port;
+ } else {
+ low_port = src_port;
+ high_port = dst_port;
+ }
+ if (low_port != 0 &&
+ dissector_try_port(subdissector_table, low_port, next_tvb, pinfo, tree))
+ return;
+ if (high_port != 0 &&
+ dissector_try_port(subdissector_table, high_port, next_tvb, pinfo, tree))
return;
/* do lookup with the heuristic subdissector table */
diff --git a/packet-udp.c b/packet-udp.c
index aab65d01ad..32d8ce4ed4 100644
--- a/packet-udp.c
+++ b/packet-udp.c
@@ -1,7 +1,7 @@
/* packet-udp.c
* Routines for UDP packet disassembly
*
- * $Id: packet-udp.c,v 1.102 2002/01/22 15:05:43 nneul Exp $
+ * $Id: packet-udp.c,v 1.103 2002/06/08 21:54:51 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -88,6 +88,7 @@ decode_udp_ports(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int uh_sport, int uh_dport)
{
tvbuff_t *next_tvb;
+ int low_port, high_port;
next_tvb = tvb_new_subset(tvb, offset, -1, -1);
@@ -98,9 +99,34 @@ decode_udp_ports(tvbuff_t *tvb, int offset, packet_info *pinfo,
uh_sport, uh_dport, next_tvb, pinfo, tree))
return;
- /* do lookup with the subdissector table */
- if (dissector_try_port(udp_dissector_table, uh_sport, next_tvb, pinfo, tree) ||
- dissector_try_port(udp_dissector_table, uh_dport, next_tvb, pinfo, tree))
+ /* Do lookups with the subdissector table.
+ We try the port number with the lower value first, followed by the
+ port number with the higher value. This means that, for packets
+ where a dissector is registered for *both* port numbers:
+
+ 1) we pick the same dissector for traffic going in both directions;
+
+ 2) we prefer the port number that's more likely to be the right
+ one (as that prefers well-known ports to reserved ports);
+
+ although there is, of course, no guarantee that any such strategy
+ will always pick the right port number.
+
+ XXX - we ignore port numbers of 0, as some dissectors use a port
+ number of 0 to disable the port, and as RFC 768 says that the source
+ port in UDP datagrams is optional and is 0 if not used. */
+ if (uh_sport > uh_dport) {
+ low_port = uh_dport;
+ high_port = uh_sport;
+ } else {
+ low_port = uh_sport;
+ high_port = uh_dport;
+ }
+ if (low_port != 0 &&
+ dissector_try_port(udp_dissector_table, low_port, next_tvb, pinfo, tree))
+ return;
+ if (high_port != 0 &&
+ dissector_try_port(udp_dissector_table, high_port, next_tvb, pinfo, tree))
return;
/* do lookup with the heuristic subdissector table */