17#include "ws_symbol_export.h"
28#define FD_DEFRAGMENTED 0x0001
31#define FD_OVERLAP 0x0002
34#define FD_OVERLAPCONFLICT 0x0004
37#define FD_MULTIPLETAILS 0x0008
41#define FD_TOOLONGFRAGMENT 0x0010
44#define FD_SUBSET_TVB 0x0020
47#define FD_PARTIAL_REASSEMBLY 0x0040
51#define FD_BLOCKSEQUENCE 0x0100
57#define FD_DATALEN_SET 0x0400
108#define REASSEMBLE_FLAGS_NO_FRAG_NUMBER 0x0001
111#define REASSEMBLE_FLAGS_802_11_HACK 0x0002
118#define REASSEMBLE_FLAGS_AGING 0x0001
127typedef void * (*fragment_temporary_key)(
const packet_info *pinfo,
128 const uint32_t id,
const void *data);
134typedef void * (*fragment_persistent_key)(
const packet_info *pinfo,
135 const uint32_t id,
const void *data);
188 addresses_reassembly_table_functions;
190 addresses_ports_reassembly_table_functions;
264 const packet_info *pinfo,
const uint32_t
id,
const void *data,
265 const uint32_t frag_offset,
const uint32_t frag_data_len,
266 const bool more_frags);
289 const uint32_t
id,
const void *data,
290 const uint32_t frag_offset,
291 const uint32_t frag_data_len,
292 const bool more_frags);
325 const uint32_t
id,
const void *data,
326 const uint32_t frag_offset,
327 const uint32_t frag_data_len,
328 const bool more_frags,
const uint32_t frag_frame);
368 const void *data,
const uint32_t frag_offset,
369 const uint32_t frag_data_len,
const bool more_frags);
397 const void *data,
const uint32_t frag_offset,
398 const uint32_t frag_data_len,
const bool more_frags,
399 const uint32_t fallback_frame);
448 const packet_info *pinfo,
const uint32_t
id,
const void *data,
449 const uint32_t frag_number,
const uint32_t frag_data_len,
450 const bool more_frags,
const uint32_t flags);
482 const uint32_t frag_number,
const uint32_t frag_data_len,
483 const bool more_frags);
507 const uint32_t
id,
const void *data,
508 const uint32_t frag_number,
const uint32_t frag_data_len,
509 const bool more_frags);
536 const void *data,
const uint32_t frag_data_len,
537 const bool more_frags);
565 const int offset,
const packet_info *pinfo,
const uint32_t
id,
566 const void* data,
const uint32_t frag_data_len,
567 const bool first,
const bool last,
568 const uint32_t max_frags);
592 const int offset,
const packet_info *pinfo,
const uint32_t
id,
593 const void* data,
const uint32_t frag_data_len,
594 const bool first,
const bool last,
595 const uint32_t max_frags,
const uint32_t max_age);
608 const uint32_t
id,
const void *data,
609 const uint32_t tot_len);
628 const uint32_t
id,
const void *data);
645 const void *data,
const uint32_t fragment_offset);
666 const uint32_t
id,
const void *data,
const uint32_t tot_len);
689 const uint32_t
id,
const void *data,
const uint32_t tot_len);
712 const uint32_t
id,
const void *data,
const uint32_t tot_len);
726WS_DLL_PUBLIC uint32_t
728 const uint32_t
id,
const void *data);
764 const uint32_t
id,
const void *data);
797 const uint32_t
id,
const void *data);
923#define REASSEMBLE_ITEMS_DEFINE(var_prefix, name_prefix) \
924 static int ett_##var_prefix##_fragment; \
925 static int ett_##var_prefix##_fragments; \
926 static int hf_##var_prefix##_fragments; \
927 static int hf_##var_prefix##_fragment; \
928 static int hf_##var_prefix##_fragment_overlap; \
929 static int hf_##var_prefix##_fragment_overlap_conflicts; \
930 static int hf_##var_prefix##_fragment_multiple_tails; \
931 static int hf_##var_prefix##_fragment_too_long_fragment; \
932 static int hf_##var_prefix##_fragment_error; \
933 static int hf_##var_prefix##_fragment_count; \
934 static int hf_##var_prefix##_reassembled_in; \
935 static int hf_##var_prefix##_reassembled_length; \
936 static int hf_##var_prefix##_reassembled_data; \
937 static int hf_##var_prefix##_segment; \
938 static const fragment_items var_prefix##_fragment_items = { \
939 &ett_##var_prefix##_fragment, \
940 &ett_##var_prefix##_fragments, \
941 &hf_##var_prefix##_fragments, \
942 &hf_##var_prefix##_fragment, \
943 &hf_##var_prefix##_fragment_overlap, \
944 &hf_##var_prefix##_fragment_overlap_conflicts, \
945 &hf_##var_prefix##_fragment_multiple_tails, \
946 &hf_##var_prefix##_fragment_too_long_fragment, \
947 &hf_##var_prefix##_fragment_error, \
948 &hf_##var_prefix##_fragment_count, \
949 &hf_##var_prefix##_reassembled_in, \
950 &hf_##var_prefix##_reassembled_length, \
951 &hf_##var_prefix##_reassembled_data, \
952 name_prefix " fragments" \
1002#define REASSEMBLE_INIT_HF_ITEMS(var_prefix, name_prefix, abbrev_prefix) \
1003 { &hf_##var_prefix##_fragments, \
1004 { "Reassembled " name_prefix " fragments", abbrev_prefix ".fragments", \
1005 FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1007 { &hf_##var_prefix##_fragment, \
1008 { name_prefix " fragment", abbrev_prefix ".fragment", \
1009 FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1011 { &hf_##var_prefix##_fragment_overlap, \
1012 { name_prefix " fragment overlap", abbrev_prefix ".fragment.overlap", \
1013 FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1015 { &hf_##var_prefix##_fragment_overlap_conflicts, \
1016 { name_prefix " fragment overlapping with conflicting data", abbrev_prefix ".fragment.overlap.conflicts", \
1017 FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1019 { &hf_##var_prefix##_fragment_multiple_tails, \
1020 { name_prefix " has multiple tail fragments", abbrev_prefix ".fragment.multiple_tails", \
1021 FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1023 { &hf_##var_prefix##_fragment_too_long_fragment, \
1024 { name_prefix " fragment too long", abbrev_prefix ".fragment.too_long_fragment", \
1025 FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1027 { &hf_##var_prefix##_fragment_error, \
1028 { name_prefix " defragment error", abbrev_prefix ".fragment.error", \
1029 FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1031 { &hf_##var_prefix##_fragment_count, \
1032 { name_prefix " fragment count", abbrev_prefix ".fragment.count", \
1033 FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } \
1035 { &hf_##var_prefix##_reassembled_in, \
1036 { "Reassembled in", abbrev_prefix ".reassembled.in", \
1037 FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1039 { &hf_##var_prefix##_reassembled_length, \
1040 { "Reassembled length", abbrev_prefix ".reassembled.length", \
1041 FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } \
1043 { &hf_##var_prefix##_reassembled_data, \
1044 { "Reassembled data", abbrev_prefix ".reassembled.data", \
1045 FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } \
1047 { &hf_##var_prefix##_segment, \
1048 { name_prefix " segment", abbrev_prefix ".segment", \
1049 FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} \
1083#define REASSEMBLE_INIT_ETT_ITEMS(var_prefix) \
1084 &ett_##var_prefix##_fragment, \
1085 &ett_##var_prefix##_fragments
1467 const char* label,
const fragment_items* frag_hf_items,
int hf_segment_data
1483static inline uint64_t
1486 return (((uint64_t)pinfo->
num) << 32) + (((uint64_t)pinfo->
curr_layer_num) << 24)
unsigned tvb_raw_offset(tvbuff_t *tvb)
Returns the offset from the first byte of real data.
Definition tvbuff.c:5534
WS_DLL_PUBLIC fragment_head * fragment_add_seq_check(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_number, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to the reassembly table and checks for sequence correctness.
Definition reassemble.c:2383
WS_DLL_PUBLIC fragment_head * fragment_end_seq_next(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data)
Adds a fragment with sequence numbering and sets an offset for subsequent fragments.
Definition reassemble.c:2765
WS_DLL_PUBLIC streaming_reassembly_info_t * streaming_reassembly_info_new(void)
Definition reassemble.c:3213
WS_DLL_PUBLIC fragment_head * fragment_add_seq_single(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_data_len, const bool first, const bool last, const uint32_t max_frags)
Adds a single fragment to a reassembly table.
Definition reassemble.c:2714
WS_DLL_PUBLIC fragment_head * fragment_add_check(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_offset, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to the reassembly table and checks for completeness.
Definition reassemble.c:1872
WS_DLL_PUBLIC fragment_head * fragment_add_seq_802_11(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_number, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to an 802.11 reassembly table.
Definition reassemble.c:2395
WS_DLL_PUBLIC fragment_head * fragment_add_seq_single_aging(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_data_len, const bool first, const bool last, const uint32_t max_frags, const uint32_t max_age)
Start a reassembly, expecting "tot_len" as the number of given fragments (not the number of bytes)....
Definition reassemble.c:2727
WS_DLL_PUBLIC void fragment_add_seq_offset(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t fragment_offset)
Adds a fragment with sequence numbering and sets an offset for subsequent fragments.
Definition reassemble.c:689
WS_DLL_PUBLIC fragment_head * fragment_add_seq_next(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to a reassembly table for protocols with a single sequence number.
Definition reassemble.c:2408
WS_DLL_PUBLIC bool show_fragment_seq_tree(fragment_head *ipfd_head, const fragment_items *fit, proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, proto_item **fi)
Display the sequence tree for fragmented data.
Definition reassemble.c:3076
void reassembly_table_cleanup(void)
Cleanup internal structures used for reassembly.
Definition reassemble.c:3170
struct _fragment_head fragment_head
Represents the head of a fragment reassembly chain, tracking overall reassembly state across all cont...
struct _fragment_items fragment_items
Bundles all protocol tree and header field handles needed to display a reassembled fragment tree in t...
WS_DLL_PUBLIC void reassembly_table_register(reassembly_table *table, const reassembly_table_functions *funcs)
Register a reassembly table. By registering the table with epan, the creation and destruction of the ...
Definition reassemble.c:466
WS_DLL_PUBLIC fragment_head * fragment_get(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data)
Retrieves the partial or completed reassembly state for a packet.
Definition reassemble.c:664
WS_DLL_PUBLIC fragment_head * fragment_add_seq(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_number, const uint32_t frag_data_len, const bool more_frags, const uint32_t flags)
Adds a fragment to the reassembly table and handles sequence-based reassembly.
Definition reassemble.c:2286
WS_DLL_PUBLIC fragment_head * fragment_add_out_of_order(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_offset, const uint32_t frag_data_len, const bool more_frags, const uint32_t frag_frame)
Adds an out-of-order fragment to a reassembly table and maintains a table for completed reassemblies.
Definition reassemble.c:1767
WS_DLL_PUBLIC fragment_head * fragment_get_reassembled_id(reassembly_table *table, const packet_info *pinfo, const uint32_t id)
Get the reassembled data for a given ID.
Definition reassemble.c:671
WS_DLL_PUBLIC void fragment_set_tot_len(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t tot_len)
Sets the expected total length for reassembly of a PDU.
Definition reassemble.c:817
WS_DLL_PUBLIC tvbuff_t * fragment_delete(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data)
Deletes a fragment from the reassembly table.
Definition reassemble.c:634
WS_DLL_PUBLIC bool show_fragment_tree(fragment_head *ipfd_head, const fragment_items *fit, proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, proto_item **fi)
Show the fragment tree for a sequence of fragments.
Definition reassemble.c:3025
WS_DLL_PUBLIC void reassembly_table_destroy(reassembly_table *table)
Destroy a reassembly table.
Definition reassemble.c:532
WS_DLL_PUBLIC fragment_head * fragment_add_check_with_fallback(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_offset, const uint32_t frag_data_len, const bool more_frags, const uint32_t fallback_frame)
Adds a fragment to the reassembly table and checks for completeness.
Definition reassemble.c:1779
WS_DLL_PUBLIC fragment_head * fragment_add(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_offset, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to a reassembly table.
Definition reassemble.c:1732
WS_DLL_PUBLIC int additional_bytes_expected_to_complete_reassembly(streaming_reassembly_info_t *reassembly_info)
Definition reassemble.c:3537
void reassembly_tables_init(void)
Initialize internal structures used for reassembly.
Definition reassemble.c:3155
struct _fragment_item fragment_item
Represents a single fragment contributing to a reassembled PDU.
WS_DLL_PUBLIC void fragment_reset_tot_len(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t tot_len)
Clears the state of previously reassembled fragments and allows new fragments to extend the result ag...
Definition reassemble.c:857
WS_DLL_PUBLIC void fragment_truncate(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t tot_len)
Adjusts the length of a fragment and resets defragmentation if necessary.
Definition reassemble.c:890
WS_DLL_PUBLIC void fragment_set_partial_reassembly(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data)
Set the partial reassembly flag for a fragment head.
Definition reassemble.c:988
WS_DLL_PUBLIC uint32_t fragment_get_tot_len(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data)
Get the total length of reassembled data.
Definition reassemble.c:965
WS_DLL_PUBLIC void fragment_start_seq_check(reassembly_table *table, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t tot_len)
Starts a sequence check for reassembly.
Definition reassemble.c:2741
WS_DLL_PUBLIC tvbuff_t * process_reassembled_data(tvbuff_t *tvb, const int offset, packet_info *pinfo, const char *name, fragment_head *fd_head, const fragment_items *fit, bool *update_col_infop, proto_tree *tree)
Process reassembled data and return a new tvbuff.
Definition reassemble.c:2832
WS_DLL_PUBLIC int reassemble_streaming_data_and_call_subdissector(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, int length, proto_tree *segment_tree, proto_tree *reassembled_tree, reassembly_table streaming_reassembly_table, streaming_reassembly_info_t *reassembly_info, uint64_t cur_frame_num, struct dissector_handle *subdissector_handle, proto_tree *subdissector_tree, void *subdissector_data, const char *label, const fragment_items *frag_hf_items, int hf_segment_data)
WS_DLL_PUBLIC fragment_head * fragment_add_multiple_ok(reassembly_table *table, tvbuff_t *tvb, const int offset, const packet_info *pinfo, const uint32_t id, const void *data, const uint32_t frag_offset, const uint32_t frag_data_len, const bool more_frags)
Adds a fragment to a reassembly table, allowing for multiple tables.
Definition reassemble.c:1746
WS_DLL_PUBLIC void reassembly_table_init(reassembly_table *table, const reassembly_table_functions *funcs)
Initialize a reassembly table.
Definition reassemble.c:486
Represents the head of a fragment reassembly chain, tracking overall reassembly state across all cont...
Definition reassemble.h:77
unsigned ref_count
Definition reassemble.h:81
uint32_t flags
Definition reassemble.h:96
const char * error
Definition reassemble.h:98
struct _fragment_item * first_gap
Definition reassemble.h:79
uint32_t len
Definition reassemble.h:84
uint32_t contiguous_len
Definition reassemble.h:82
uint32_t datalen
Definition reassemble.h:88
uint32_t reassembled_in
Definition reassemble.h:91
uint32_t fragment_nr_offset
Definition reassemble.h:86
struct _fragment_item * next
Definition reassemble.h:78
uint8_t reas_in_layer_num
Definition reassemble.h:93
uint32_t frame
Definition reassemble.h:83
tvbuff_t * tvb_data
Definition reassemble.h:97
Represents a single fragment contributing to a reassembled PDU.
Definition reassemble.h:64
uint32_t frame
Definition reassemble.h:66
tvbuff_t * tvb_data
Definition reassemble.h:70
struct _fragment_item * next
Definition reassemble.h:65
uint32_t flags
Definition reassemble.h:69
uint32_t len
Definition reassemble.h:68
uint32_t offset
Definition reassemble.h:67
Bundles all protocol tree and header field handles needed to display a reassembled fragment tree in t...
Definition reassemble.h:811
int * hf_reassembled_length
Definition reassemble.h:824
int * hf_fragments
Definition reassemble.h:815
int * hf_fragment_multiple_tails
Definition reassemble.h:819
int * ett_fragments
Definition reassemble.h:813
int * hf_fragment_overlap
Definition reassemble.h:817
const char * tag
Definition reassemble.h:827
int * hf_reassembled_in
Definition reassemble.h:823
int * hf_fragment_count
Definition reassemble.h:822
int * hf_fragment_error
Definition reassemble.h:821
int * hf_reassembled_data
Definition reassemble.h:825
int * hf_fragment
Definition reassemble.h:816
int * hf_fragment_too_long_fragment
Definition reassemble.h:820
int * hf_fragment_overlap_conflict
Definition reassemble.h:818
int * ett_fragment
Definition reassemble.h:812
Represents the metadata and indexing information for a single captured frame.
Definition packet_info.h:43
uint32_t num
Definition packet_info.h:47
uint8_t curr_layer_num
Definition packet_info.h:150
Table of functions for a reassembly table.
Definition reassemble.h:151
GHashFunc hash_func
Hash function for fragment table keys.
Definition reassemble.h:155
fragment_temporary_key temporary_key_func
Create a temporary (short-lived) fragment key.
Definition reassemble.h:165
GEqualFunc equal_func
Equality function for fragment table keys.
Definition reassemble.h:160
GDestroyNotify free_temporary_key_func
Destroy a temporary fragment key.
Definition reassemble.h:175
GDestroyNotify free_persistent_key_func
Destroy a persistent fragment key.
Definition reassemble.h:180
fragment_persistent_key persistent_key_func
Create a persistent (long-lived) fragment key.
Definition reassemble.h:170
Tracks all in-progress fragment chains and completed reassemblies for a single reassembly context.
Definition reassemble.h:140
GDestroyNotify free_temporary_key_func
Definition reassemble.h:145
fragment_temporary_key temporary_key_func
Definition reassemble.h:143
GHashTable * reassembled_table
Definition reassemble.h:142
fragment_persistent_key persistent_key_func
Definition reassemble.h:144
GHashTable * fragment_table
Definition reassemble.h:141
Definition reassemble.c:3190
Core tvbuff (testy virtual buffer) structure representing a region of packet data,...
Definition tvbuff-int.h:95