forked from osmocom/wireshark
180 lines
5.4 KiB
C
180 lines
5.4 KiB
C
/** @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 lenght 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;
|
|
|
|
/**
|
|
* Funcions 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 *);
|
|
|
|
/**
|
|
* 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__ */
|