wireshark/ui/tap-tcp-stream.h
John Thacker f5a927afa7 tap-tcp: Remove internal struct
The tcp_scan_t struct is internal and doesn't seem to be helpful.
The "direction" int is initialized to a fixed value when the struct is
created and never changed. Move the pointer to the last segment in the
list (used for appending) to the externally facing tcp_graph struct.
(As noted, the list could possibly be a different structure.)

Remove it, and just use the externally facing tcp_graph as the tapinfo.
This is helpful for #20426 because it can allow the TCP Stream Dialog
to remove the tap listener, which is needs to do because it is the
parent of the tcp_graph struct. The dialog needs to remove the tap listener
before freeing the graph memory upon destruction (and to stop the
calculations), when the dialog is closed before tapping is finished.
2025-03-07 07:53:32 -05:00

167 lines
4.4 KiB
C

/** @file
*
* TCP stream statistics
* Originally from tcp_graph.c by Pavel Mores <pvl@uh.cz>
* Win32 port: rwh@unifiedtech.com
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef __TAP_TCP_STREAM_H__
#define __TAP_TCP_STREAM_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef enum tcp_graph_type_ {
GRAPH_TSEQ_STEVENS,
GRAPH_TSEQ_TCPTRACE,
GRAPH_THROUGHPUT,
GRAPH_RTT,
GRAPH_WSCALE,
GRAPH_UNDEFINED
} tcp_graph_type;
#define RTT_ALL 0x0001
#define RTT_SAK 0x0002
#define RTT_RTT 0x0004
#define RTT_KRN 0x0008
typedef enum rtt_sampling_method_ {
SAMPLING_ALL,
SAMPLING_ALL_SACK,
SAMPLING_RTT,
SAMPLING_KARN,
SAMPLING_UNDEFINED
} rtt_sampling_method;
struct segment {
struct segment *next;
uint32_t num;
uint32_t rel_secs;
uint32_t rel_usecs;
/* Currently unused.
time_t abs_secs;
uint32_t abs_usecs;
*/
uint32_t th_seq;
uint32_t th_ack;
uint32_t th_rawseq;
uint32_t th_rawack;
uint16_t th_flags;
uint32_t th_win; /* make it 32 bits so we can handle some scaling */
uint32_t th_seglen;
uint16_t th_sport;
uint16_t th_dport;
address ip_src;
address ip_dst;
bool ack_karn; /* true when ambiguous according to Karn's algo */
uint8_t num_sack_ranges;
uint32_t sack_left_edge[MAX_TCP_SACK_RANGES];
uint32_t sack_right_edge[MAX_TCP_SACK_RANGES];
};
struct tcp_graph {
tcp_graph_type type;
/* RTT sampling method (for RTT graphs only) */
uint8_t rtt_sampling;
/* The stream this graph will show */
address src_address;
uint16_t src_port;
address dst_address;
uint16_t dst_port;
uint32_t stream;
/* Should this be a map or tree instead? */
struct segment *segments;
struct segment *last;
};
/** Fill in the segment list for a TCP graph
*
* @param cf Capture file to scan
* @param tg TCP graph. A valid stream must be set. If either the source or
* destination address types are AT_NONE the address and port
* information will be filled in using the first packet in the
* specified stream.
*/
void graph_segment_list_get(capture_file *cf, struct tcp_graph *tg);
void graph_segment_list_free(struct tcp_graph * );
/* for compare_headers() */
/* segment went the same direction as the currently selected one */
#define COMPARE_CURR_DIR 0
#define COMPARE_ANY_DIR 1
int compare_headers(address *saddr1, address *daddr1, uint16_t sport1, uint16_t dport1, const address *saddr2, const address *daddr2, uint16_t sport2, uint16_t dport2, int dir);
int get_num_dsegs(struct tcp_graph * );
int get_num_acks(struct tcp_graph *, int * );
uint32_t select_tcpip_session(capture_file *);
/* This is used by rtt module only */
struct rtt_unack {
struct rtt_unack *next;
double time;
unsigned int seqno;
unsigned int end_seqno;
};
/**
* Check if a sequence number is currently in the Unacked list,
* typically for avoiding adding redundant sequences.
* In practice, the retrans meaning in this particular code is different
* from TCP's one and would rather cover Keep-Alives and Spurious Retrans.
*
* @param list The list containing the Unacked sequences
* @param seqno The sequence number to be searched for in the Unacked list
* @return true if the list contains the sequence number, false otherwise
*/
bool rtt_is_retrans(struct rtt_unack *list, unsigned int seqno);
struct rtt_unack *rtt_get_new_unack(double , unsigned int , unsigned int );
void rtt_put_unack_on_list(struct rtt_unack ** , struct rtt_unack * );
void rtt_delete_unack_from_list(struct rtt_unack ** , struct rtt_unack * );
void rtt_destroy_unack_list(struct rtt_unack ** );
static inline int
tcp_seq_eq(uint32_t s1, uint32_t s2) {
return (int32_t)(s1 - s2) == 0;
}
static inline int
tcp_seq_before(uint32_t s1, uint32_t s2) {
return (int32_t)(s1 - s2) < 0;
}
static inline int
tcp_seq_eq_or_after(uint32_t s1, uint32_t s2) {
return !tcp_seq_before(s1, s2);
}
static inline int
tcp_seq_after(uint32_t s1, uint32_t s2) {
return (int32_t)(s1 - s2) > 0;
}
static inline int
tcp_seq_before_or_eq(uint32_t s1, uint32_t s2) {
return !tcp_seq_after(s1, s2);
}
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __TAP_TCP_STREAM_H__ */