1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
/** @file
*
* RTP streams handler functions used by tshark and wireshark
*
* Copyright 2008, Ericsson AB
* By Balint Reczey <balint.reczey@ericsson.com>
*
* most functions are copied from ui/gtk/rtp_stream.c and ui/gtk/rtp_analisys.c
* Copyright 2003, Alcatel Business Systems
* By Lars Ruoff <lars.ruoff@gmx.net>
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef __TAP_RTP_COMMON_H__
#define __TAP_RTP_COMMON_H__
#include "ui/rtp_stream.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* type of error when saving voice in a file didn't succeed */
typedef enum {
TAP_RTP_NO_ERROR,
TAP_RTP_WRONG_CODEC,
TAP_RTP_WRONG_LENGTH,
TAP_RTP_PADDING_ERROR,
TAP_RTP_SHORT_FRAME,
TAP_RTP_FILE_OPEN_ERROR,
TAP_RTP_FILE_WRITE_ERROR,
TAP_RTP_NO_DATA
} tap_rtp_error_type_t;
typedef struct _tap_rtp_save_info_t {
FILE *fp;
guint32 count;
tap_rtp_error_type_t error_type;
gboolean saved;
} tap_rtp_save_info_t;
typedef struct _rtpstream_info_calc {
gchar *src_addr_str;
guint16 src_port;
gchar *dst_addr_str;
guint16 dst_port;
guint32 ssrc;
gchar *all_payload_type_names; /* Name of codec derived from fixed or dynamic codec names */
guint32 packet_count;
guint32 total_nr;
guint32 packet_expected; /* Count of expected packets, derived from length of RTP stream */
gint32 lost_num;
double lost_perc;
double max_delta;
double min_delta;
double mean_delta;
double min_jitter;
double max_jitter;
double max_skew;
double mean_jitter;
gboolean problem; /* Indication that RTP stream contains something unusual -GUI should indicate it somehow */
double clock_drift_ms;
double freq_drift_hz;
double freq_drift_perc;
double duration_ms;
guint32 sequence_err;
double start_time_ms; /**< Unit is ms */
guint32 first_packet_num;
guint32 last_packet_num;
} rtpstream_info_calc_t;
/**
* Functions for init and destroy of rtpstream_info_t and attached structures
*/
void rtpstream_info_init(rtpstream_info_t* info);
rtpstream_info_t *rtpstream_info_malloc_and_init(void);
void rtpstream_info_copy_deep(rtpstream_info_t *dest, const rtpstream_info_t *src);
rtpstream_info_t *rtpstream_info_malloc_and_copy_deep(const rtpstream_info_t *src);
void rtpstream_info_free_data(rtpstream_info_t* info);
void rtpstream_info_free_all(rtpstream_info_t* info);
/**
* Compares two RTP stream infos (GCompareFunc style comparison function)
*
* @return -1,0,1
*/
gint rtpstream_info_cmp(gconstpointer aa, gconstpointer bb);
/**
* Compares the endpoints of two RTP streams.
*
* @return TRUE if the
*/
gboolean rtpstream_info_is_reverse(const rtpstream_info_t *stream_a, rtpstream_info_t *stream_b);
/**
* Checks if payload_type is used in rtpstream.
*
* @returns TRUE if is used
*/
gboolean rtpstream_is_payload_used(const rtpstream_info_t *stream_info, const guint8 payload_type);
/****************************************************************************/
/* INTERFACE */
/**
* Registers the rtp_streams tap listener (if not already done).
* From that point on, the RTP streams list will be updated with every redissection.
* This function is also the entry point for the initialization routine of the tap system.
* So whenever rtp_stream.c is added to the list of WIRESHARK_TAP_SRCs, the tap will be registered on startup.
* If not, it will be registered on demand by the rtp_streams and rtp_analysis functions that need it.
*/
void register_tap_listener_rtpstream(rtpstream_tapinfo_t *tapinfo, const char *fstring, rtpstream_tap_error_cb tap_error);
/**
* Removes the rtp_streams tap listener (if not already done)
* From that point on, the RTP streams list won't be updated any more.
*/
void remove_tap_listener_rtpstream(rtpstream_tapinfo_t *tapinfo);
/**
* Cleans up memory of rtp streams tap.
*/
void rtpstream_reset(rtpstream_tapinfo_t *tapinfo);
void rtpstream_reset_cb(void*);
void rtp_write_header(rtpstream_info_t*, FILE*);
tap_packet_status rtpstream_packet_cb(void*, packet_info*, epan_dissect_t *, const void *, tap_flags_t);
/**
* Evaluate rtpstream_info_t calculations
*/
void rtpstream_info_calculate(const rtpstream_info_t *strinfo, rtpstream_info_calc_t *calc);
/**
* Free rtpstream_info_calc_t structure (internal items)
*/
void rtpstream_info_calc_free(rtpstream_info_calc_t *calc);
/**
* Init analyse counters in rtpstream_info_t from pinfo
*/
void rtpstream_info_analyse_init(rtpstream_info_t *stream_info, const packet_info *pinfo, const struct _rtp_info *rtpinfo);
/**
* Update analyse counters in rtpstream_info_t from pinfo
*/
void rtpstream_info_analyse_process(rtpstream_info_t *stream_info, const packet_info *pinfo, const struct _rtp_info *rtpinfo);
/**
* Get hash key for rtpstream_info_t
*/
guint rtpstream_to_hash(gconstpointer key);
/**
* Insert new_stream_info into multihash
*/
void rtpstream_info_multihash_insert(GHashTable *multihash, rtpstream_info_t *new_stream_info);
/**
* Lookup stream_info in stream_info multihash
*/
rtpstream_info_t *rtpstream_info_multihash_lookup(GHashTable *multihash, rtpstream_id_t *stream_id);
/**
* GHFunc () for destroying GList in multihash
*/
void rtpstream_info_multihash_destroy_value(gpointer key, gpointer value, gpointer user_data);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __TAP_RTP_COMMON_H__ */
|