wireshark/ui/voip_calls.h

268 lines
8.1 KiB
C
Raw Permalink Normal View History

/** @file
*
* VoIP calls summary addition for Wireshark
*
* Copyright 2004, Ericsson , Spain
* By Francisco Alcoba <francisco.alcoba@ericsson.com>
*
* based on h323_calls.h
* Copyright 2004, Iskratel, Ltd, Kranj
* By Miha Jemec <m.jemec@iskratel.si>
*
* H323, RTP and Graph Support
* By Alejandro Vaquero, alejandro.vaquero@verso.com
* Copyright 2005, Verso Technologies Inc.
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef __VOIP_CALLS_H__
#define __VOIP_CALLS_H__
2021-02-10 14:32:18 +00:00
#include <glib.h>
#include <stdio.h>
#include "epan/address.h"
#include "epan/packet.h"
#include "epan/guid-utils.h"
#include "epan/tap.h"
#include "epan/tap-voip.h"
#include "epan/sequence_analysis.h"
/** @file
* "VoIP Calls" dialog box common routines.
* @ingroup main_ui_group
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
extern const char *voip_call_state_name[8];
typedef enum _voip_protocol {
VOIP_SIP,
VOIP_ISUP,
VOIP_H323,
VOIP_MGCP,
VOIP_AC_ISDN,
VOIP_AC_CAS,
MEDIA_T38,
TEL_H248,
TEL_SCCP,
TEL_BSSMAP,
TEL_RANAP,
VOIP_UNISTIM,
VOIP_SKINNY,
VOIP_IAX2,
VOIP_COMMON
} voip_protocol;
typedef enum _hash_indexes {
SIP_HASH=0
} hash_indexes;
extern const char *voip_protocol_name[];
typedef enum _flow_show_options
{
FLOW_ALL,
FLOW_ONLY_INVITES
} flow_show_options;
/** defines specific SIP data */
typedef enum _sip_call_state {
SIP_INVITE_SENT,
SIP_200_REC,
SIP_CANCEL_SENT
} sip_call_state;
typedef struct _sip_calls_info {
gchar *call_identifier;
guint32 invite_cseq;
sip_call_state sip_state;
} sip_calls_info_t;
/** defines specific ISUP data */
typedef struct _isup_calls_info {
guint16 cic;
guint32 opc, dpc;
guint8 ni;
} isup_calls_info_t;
/* defines specific H245 data */
typedef struct _h245_address {
address h245_address;
guint16 h245_port;
} h245_address_t;
/** defines specific H323 data */
typedef struct _h323_calls_info {
e_guid_t *guid; /* Call ID to identify a H225 */
GList* h245_list; /**< list of H245 Address and ports for tunneling off calls*/
address h225SetupAddr; /**< we use the SETUP H225 IP to determine if packets are forward or reverse */
gboolean is_h245;
gboolean is_faststart_Setup; /**< if faststart field is included in Setup*/
gboolean is_faststart_Proc; /**< if faststart field is included in Proce, Alerting, Progress or Connect*/
gboolean is_h245Tunneling;
gint32 q931_crv;
gint32 q931_crv2;
guint requestSeqNum;
} h323_calls_info_t;
/**< defines specific MGCP data */
typedef struct _mgcp_calls_info {
gchar *endpointId;
gboolean fromEndpoint; /**< true if the call was originated from the Endpoint, false for calls from MGC */
} mgcp_calls_info_t;
/** defines specific ACTRACE ISDN data */
typedef struct _actrace_isdn_calls_info {
gint32 crv;
int trunk;
} actrace_isdn_calls_info_t;
/** defines specific ACTRACE CAS data */
typedef struct _actrace_cas_calls_info {
gint32 bchannel;
int trunk;
} actrace_cas_calls_info_t;
/** defines specific SKINNY data */
typedef struct _skinny_calls_info {
guint32 callId;
} skinny_calls_info_t;
/** defines info types for graph analysis additional information */
typedef enum _ga_info_type {
GA_INFO_TYPE_NONE=0,
GA_INFO_TYPE_RTP
} ga_info_type;
/** defines a voip call */
typedef struct _voip_calls_info {
voip_call_state call_state;
voip_call_active_state call_active_state;
gchar *call_id;
gchar *from_identity;
gchar *to_identity;
gpointer prot_info;
void (*free_prot_info)(gpointer);
address initial_speaker;
guint32 npackets;
voip_protocol protocol;
gchar *protocol_name;
gchar *call_comment;
guint16 call_num;
/**> The frame_data struct holds the frame number and timing information needed. */
frame_data *start_fd;
nstime_t start_rel_ts;
frame_data *stop_fd;
nstime_t stop_rel_ts;
} voip_calls_info_t;
/**
* structure that holds the information about all detected calls */
/* struct holding all information of the tap */
/*
* XXX Most of these are private to voip_calls.c. We might want to
* make them private.
*/
struct _h245_labels;
typedef struct _voip_calls_tapinfo {
tap_reset_cb tap_reset; /**< tap reset callback */
tap_packet_cb tap_packet; /**< tap per-packet callback */
tap_draw_cb tap_draw; /**< tap draw callback */
void *tap_data; /**< data for tap callbacks */
int ncalls; /**< number of call */
Qt: Initial RTP playback. Note the "initial". This is woefully incomplete. See the "to do" lists below and in the code. This differs a bit from the GTK+ version in that you specify one or more streams to be decoded. Instead of showing waveforms in individual widgets, add them all to a single QCustomPlot. This conserves screen real estate and lets us more easily take advantage of the QCP API. It also looks better IMHO. Change a bunch of checks for QtMultimediaWidgets to QtMultimedia. We probably won't use the widgets until we make 5.0 our minimum Qt version and plain old QtMultimedia lets us support Qt 4 more easily (in theory at least). Add resampling code from libspeex. I initially used this to resample each packet to match the preferred rate of our output device, but this resulted in poorer audio quality than expected. Leave it in and use to create visual samples for QCP and to match rates any time the rate changes. The latter is currently untested. Add some debugging macros. Note that both the RTP player and RTP analysis dialogs decode audio data using different code. Note that voip_calls_packet and voip_calls_init_tap appear to be dead code. To do: - Add silence frames where needed. - Implement the jitter buffer. - Implement the playback timing controls. - Tapping / scanning streams might be too slow. Change-Id: I20dd3b66d3df53c9b1f3501262dc01458849f6b4 Bug: 9007 Reviewed-on: https://code.wireshark.org/review/10458 Petri-Dish: Gerald Combs <gerald@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
2014-12-13 00:51:40 +00:00
GQueue* callsinfos; /**< queue with all calls (voip_calls_info_t) */
GHashTable* callsinfo_hashtable[1]; /**< array of hashes per voip protocol (voip_calls_info_t); currently only the one for SIP is used */
int npackets; /**< total number of packets of all calls */
voip_calls_info_t *filter_calls_fwd; /**< used as filter in some tap modes */
int start_packets;
int completed_calls;
int rejected_calls;
seq_analysis_info_t *graph_analysis;
epan_t *session; /**< epan session */
int nrtpstreams; /**< number of rtp streams */
GList* rtpstream_list; /**< list of rtpstream_info_t */
guint32 rtp_evt_frame_num;
guint8 rtp_evt;
gboolean rtp_evt_end;
gchar *sdp_summary;
guint32 sdp_frame_num;
guint32 mtp3_opc;
guint32 mtp3_dpc;
guint8 mtp3_ni;
guint32 mtp3_frame_num;
struct _h245_labels *h245_labels; /**< H.245 labels */
gchar *q931_calling_number;
gchar *q931_called_number;
guint8 q931_cause_value;
gint32 q931_crv;
guint32 q931_frame_num;
guint32 h225_frame_num;
guint16 h225_call_num;
int h225_cstype; /* XXX actually an enum */
gboolean h225_is_faststart;
guint32 sip_frame_num;
guint32 actrace_frame_num;
gint32 actrace_trunk;
gint32 actrace_direction;
flow_show_options fs_option;
guint32 redraw;
gboolean apply_display_filter;
} voip_calls_tapinfo_t;
Qt: Initial RTP playback. Note the "initial". This is woefully incomplete. See the "to do" lists below and in the code. This differs a bit from the GTK+ version in that you specify one or more streams to be decoded. Instead of showing waveforms in individual widgets, add them all to a single QCustomPlot. This conserves screen real estate and lets us more easily take advantage of the QCP API. It also looks better IMHO. Change a bunch of checks for QtMultimediaWidgets to QtMultimedia. We probably won't use the widgets until we make 5.0 our minimum Qt version and plain old QtMultimedia lets us support Qt 4 more easily (in theory at least). Add resampling code from libspeex. I initially used this to resample each packet to match the preferred rate of our output device, but this resulted in poorer audio quality than expected. Leave it in and use to create visual samples for QCP and to match rates any time the rate changes. The latter is currently untested. Add some debugging macros. Note that both the RTP player and RTP analysis dialogs decode audio data using different code. Note that voip_calls_packet and voip_calls_init_tap appear to be dead code. To do: - Add silence frames where needed. - Implement the jitter buffer. - Implement the playback timing controls. - Tapping / scanning streams might be too slow. Change-Id: I20dd3b66d3df53c9b1f3501262dc01458849f6b4 Bug: 9007 Reviewed-on: https://code.wireshark.org/review/10458 Petri-Dish: Gerald Combs <gerald@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
2014-12-13 00:51:40 +00:00
#if 0
#define VOIP_CALLS_DEBUG(...) { \
char *VOIP_CALLS_DEBUG_MSG = ws_strdup_printf(__VA_ARGS__); \
2021-06-14 23:06:02 +00:00
ws_warning("voip_calls: %s:%d %s", G_STRFUNC, __LINE__, VOIP_CALLS_DEBUG_MSG); \
Qt: Initial RTP playback. Note the "initial". This is woefully incomplete. See the "to do" lists below and in the code. This differs a bit from the GTK+ version in that you specify one or more streams to be decoded. Instead of showing waveforms in individual widgets, add them all to a single QCustomPlot. This conserves screen real estate and lets us more easily take advantage of the QCP API. It also looks better IMHO. Change a bunch of checks for QtMultimediaWidgets to QtMultimedia. We probably won't use the widgets until we make 5.0 our minimum Qt version and plain old QtMultimedia lets us support Qt 4 more easily (in theory at least). Add resampling code from libspeex. I initially used this to resample each packet to match the preferred rate of our output device, but this resulted in poorer audio quality than expected. Leave it in and use to create visual samples for QCP and to match rates any time the rate changes. The latter is currently untested. Add some debugging macros. Note that both the RTP player and RTP analysis dialogs decode audio data using different code. Note that voip_calls_packet and voip_calls_init_tap appear to be dead code. To do: - Add silence frames where needed. - Implement the jitter buffer. - Implement the playback timing controls. - Tapping / scanning streams might be too slow. Change-Id: I20dd3b66d3df53c9b1f3501262dc01458849f6b4 Bug: 9007 Reviewed-on: https://code.wireshark.org/review/10458 Petri-Dish: Gerald Combs <gerald@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
2014-12-13 00:51:40 +00:00
g_free(VOIP_CALLS_DEBUG_MSG); \
}
#else
#define VOIP_CALLS_DEBUG(...)
Qt: Initial RTP playback. Note the "initial". This is woefully incomplete. See the "to do" lists below and in the code. This differs a bit from the GTK+ version in that you specify one or more streams to be decoded. Instead of showing waveforms in individual widgets, add them all to a single QCustomPlot. This conserves screen real estate and lets us more easily take advantage of the QCP API. It also looks better IMHO. Change a bunch of checks for QtMultimediaWidgets to QtMultimedia. We probably won't use the widgets until we make 5.0 our minimum Qt version and plain old QtMultimedia lets us support Qt 4 more easily (in theory at least). Add resampling code from libspeex. I initially used this to resample each packet to match the preferred rate of our output device, but this resulted in poorer audio quality than expected. Leave it in and use to create visual samples for QCP and to match rates any time the rate changes. The latter is currently untested. Add some debugging macros. Note that both the RTP player and RTP analysis dialogs decode audio data using different code. Note that voip_calls_packet and voip_calls_init_tap appear to be dead code. To do: - Add silence frames where needed. - Implement the jitter buffer. - Implement the playback timing controls. - Tapping / scanning streams might be too slow. Change-Id: I20dd3b66d3df53c9b1f3501262dc01458849f6b4 Bug: 9007 Reviewed-on: https://code.wireshark.org/review/10458 Petri-Dish: Gerald Combs <gerald@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
2014-12-13 00:51:40 +00:00
#endif
/****************************************************************************/
/* INTERFACE */
/**
* Registers the voip_calls tap listeners (if not already done).
* From that point on, the calls list will be updated with every redissection.
* This function is also the entry point for the initialization routine of the tap system.
* So whenever voip_calls.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 voip_calls functions that need it.
*/
void voip_calls_init_all_taps(voip_calls_tapinfo_t *tap_id_base);
/**
* Removes the voip_calls tap listener (if not already done)
* From that point on, the voip calls list won't be updated any more.
*/
void voip_calls_remove_all_tap_listeners(voip_calls_tapinfo_t *tap_id_base);
/**
* Cleans up memory of voip calls tap.
*/
void voip_calls_reset_all_taps(voip_calls_tapinfo_t *tapinfo);
/**
* Frees one callsinfo
*/
void
voip_calls_free_callsinfo(voip_calls_info_t *callsinfo);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __VOIP_CALLS_H__ */