Ethereal-dev: [Ethereal-dev] Patch : X.25 bug fix & X.25 reassembly
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: MEYER Laurent <laurent.meyer@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 04 Mar 2003 13:12:12 +0100
Hello, Here is a patch to correct a bug appeared in the version 1.79 of packet-X25.c : If there is only one octet of data in X.25 call request it is just the nlpid, but the test condition is erroneous : if (localoffset + 1 <= tvb_reported_length(tvb)) return; may be remplaced by if (localoffset + 1 == tvb_reported_length(tvb)) return; The fix is included in the patch following this mail Also enclosed the X25 reasembly feature. Thanks Laurent MEYER
--- /users/meyer/incoming/packet-x25.c Tue Mar 4 11:16:18 2003 +++ packet-x25.c Tue Mar 4 11:22:20 2003 @@ -34,6 +34,7 @@ #include "llcsaps.h" #include <epan/packet.h> #include <epan/circuit.h> +#include "reassemble.h" #include "prefs.h" #include "nlpid.h" #include "x264_prt_id.h" @@ -142,6 +143,16 @@ static gint ett_x25_fac_priority = -1; static gint ett_x25_user_data = -1; +static gint ett_x25_segment = -1; +static gint ett_x25_segments = -1; +static gint hf_x25_segments = -1; +static gint hf_x25_segment = -1; +static gint hf_x25_segment_overlap = -1; +static gint hf_x25_segment_overlap_conflict = -1; +static gint hf_x25_segment_multiple_tails = -1; +static gint hf_x25_segment_too_long_segment = -1; +static gint hf_x25_segment_error = -1; + static const value_string vals_modulo[] = { { 1, "8" }, { 2, "128" }, @@ -174,6 +185,19 @@ "End of data" }; +static const fragment_items x25_frag_items = { + &ett_x25_segment, + &ett_x25_segments, + &hf_x25_segments, + &hf_x25_segment, + &hf_x25_segment_overlap, + &hf_x25_segment_overlap_conflict, + &hf_x25_segment_multiple_tails, + &hf_x25_segment_too_long_segment, + &hf_x25_segment_error, + "segments" +}; + static dissector_handle_t ip_handle; static dissector_handle_t clnp_handle; static dissector_handle_t ositp_handle; @@ -182,6 +206,12 @@ /* Preferences */ static gboolean payload_is_qllc_sna = FALSE; +static gboolean reassemble_x25 = FALSE; + +/* Reassembly of X.25 */ + +static GHashTable *x25_segment_table = NULL; +static GHashTable *x25_reassembled_table = NULL; static dissector_table_t x25_subdissector_table; static heur_dissector_list_t x25_heur_subdissector_list; @@ -1420,10 +1450,11 @@ guint16 bytes0_1; guint8 pkt_type; char *short_name = NULL, *long_name = NULL; - tvbuff_t *next_tvb; + tvbuff_t *next_tvb = NULL; gboolean q_bit_set = FALSE; void *saved_private_data; - + fragment_data *fd_head; + if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "X.25"); @@ -1730,7 +1761,7 @@ * If there's only one octet of user data, it's just * an NLPID; don't try to dissect it. */ - if (localoffset + 1 <= tvb_reported_length(tvb)) + if (localoffset + 1 == tvb_reported_length(tvb)) return; /* @@ -2078,6 +2109,30 @@ } } localoffset += (modulo == 8) ? 1 : 2; + if (reassemble_x25) + { + fd_head = fragment_add_seq_next(tvb, localoffset, + pinfo, vc, x25_segment_table, + x25_reassembled_table, + tvb_reported_length(tvb) - localoffset, + (pkt_type >> 4) & 0x01); + pinfo->fragmented = (pkt_type >> 4) & 0x01; + + if (fd_head) + if (fd_head->next) + { + /* This is the last packet */ + next_tvb = tvb_new_real_data(fd_head->data, + fd_head->len, + fd_head->len); + tvb_set_child_real_data_tvbuff(tvb, next_tvb); + add_new_data_source(pinfo, next_tvb, "Reassembled X25"); + show_fragment_seq_tree(fd_head, + &x25_frag_items, + x25_tree, + pinfo, next_tvb); + } + } break; } switch (PACKET_TYPE_FC(pkt_type)) @@ -2166,8 +2221,11 @@ } if (localoffset >= tvb_reported_length(tvb)) return; + if (pinfo->fragmented) + return; - next_tvb = tvb_new_subset(tvb, localoffset, -1, -1); + if (!next_tvb) + next_tvb = tvb_new_subset(tvb, localoffset, -1, -1); saved_private_data = pinfo->private_data; pinfo->private_data = &q_bit_set; @@ -2246,6 +2304,13 @@ dissect_x25_common(tvb, pinfo, tree, X25_UNKNOWN); } +static void +x25_reassemble_init(void) +{ + fragment_table_init(&x25_segment_table); + reassembled_table_init(&x25_reassembled_table); +} + void proto_register_x25(void) { @@ -2295,6 +2360,33 @@ { &hf_x25_p_s_mod128, { "P(S)", "x.25.p_s", FT_UINT8, BASE_DEC, NULL, 0xFE, "Packet Send Sequence Number", HFILL }}, + { &hf_x25_segment_overlap, + { "Fragment overlap", "x25.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Fragment overlaps with other fragments", HFILL }}, + + { &hf_x25_segment_overlap_conflict, + { "Conflicting data in fragment overlap", "x25.fragment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Overlapping fragments contained conflicting data", HFILL }}, + + { &hf_x25_segment_multiple_tails, + { "Multiple tail fragments found", "x25.fragment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Several tails were found when defragmenting the packet", HFILL }}, + + { &hf_x25_segment_too_long_segment, + { "Fragment too long", "x25.fragment.toolongfragment", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Fragment contained data past end of packet", HFILL }}, + + { &hf_x25_segment_error, + { "Defragmentation error", "x25.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, + "Defragmentation error due to illegal fragments", HFILL }}, + + { &hf_x25_segment, + { "X.25 Fragment", "x25.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0, + "X25 Fragment", HFILL }}, + + { &hf_x25_segments, + { "X.25 Fragments", "x25.fragments", FT_NONE, BASE_NONE, NULL, 0x0, + "X.25 Fragments", HFILL }}, }; static gint *ett[] = { &ett_x25, @@ -2320,7 +2412,9 @@ &ett_x25_fac_calling_addr_ext, &ett_x25_fac_call_deflect, &ett_x25_fac_priority, - &ett_x25_user_data + &ett_x25_user_data, + &ett_x25_segment, + &ett_x25_segments }; module_t *x25_module; @@ -2342,6 +2436,11 @@ "Default to QLLC/SNA", "If CALL REQUEST not seen or didn't specify protocol, dissect as QLLC/SNA", &payload_is_qllc_sna); + prefs_register_bool_preference(x25_module, "reassemble_x25", + "Reassemble fragmented X.25 packets", + "Reassemble fragmented X.25 packets", + &reassemble_x25); + register_init_routine(&x25_reassemble_init); } void
- Follow-Ups:
- Re: [Ethereal-dev] Patch : X.25 bug fix & X.25 reassembly
- From: Guy Harris
- Re: [Ethereal-dev] Patch : X.25 bug fix & X.25 reassembly
- Prev by Date: RE: [Ethereal-dev] Colour//////Color Filters
- Next by Date: Re: [Ethereal-dev] Patch : X.25 bug fix & X.25 reassembly
- Previous by thread: Re: [Ethereal-dev] Creating a contrib directory?
- Next by thread: Re: [Ethereal-dev] Patch : X.25 bug fix & X.25 reassembly
- Index(es):