1 /* voip_calls.h
2  * VoIP calls summary addition for Wireshark
3  *
4  * Copyright 2004, Ericsson , Spain
5  * By Francisco Alcoba <francisco.alcoba@ericsson.com>
6  *
7  * based on h323_calls.h
8  * Copyright 2004, Iskratel, Ltd, Kranj
9  * By Miha Jemec <m.jemec@iskratel.si>
10  *
11  * H323, RTP and Graph Support
12  * By Alejandro Vaquero, alejandro.vaquero@verso.com
13  * Copyright 2005, Verso Technologies Inc.
14  *
15  * Wireshark - Network traffic analyzer
16  * By Gerald Combs <gerald@wireshark.org>
17  * Copyright 1998 Gerald Combs
18  *
19  * SPDX-License-Identifier: GPL-2.0-or-later
20  */
21 
22 #ifndef __VOIP_CALLS_H__
23 #define __VOIP_CALLS_H__
24 
25 #include <glib.h>
26 
27 #include <stdio.h>
28 
29 #include "epan/address.h"
30 #include "epan/packet.h"
31 #include "epan/guid-utils.h"
32 #include "epan/tap.h"
33 #include "epan/tap-voip.h"
34 #include "epan/sequence_analysis.h"
35 
36 /** @file
37  *  "VoIP Calls" dialog box common routines.
38  *  @ingroup main_ui_group
39  */
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif /* __cplusplus */
44 
45 /****************************************************************************/
46 extern const char *voip_call_state_name[8];
47 
48 typedef enum _voip_protocol {
49     VOIP_SIP,
50     VOIP_ISUP,
51     VOIP_H323,
52     VOIP_MGCP,
53     VOIP_AC_ISDN,
54     VOIP_AC_CAS,
55     MEDIA_T38,
56     TEL_H248,
57     TEL_SCCP,
58     TEL_BSSMAP,
59     TEL_RANAP,
60     VOIP_UNISTIM,
61     VOIP_SKINNY,
62     VOIP_IAX2,
63     VOIP_COMMON
64 } voip_protocol;
65 
66 typedef enum _hash_indexes {
67     SIP_HASH=0
68 } hash_indexes;
69 
70 extern const char *voip_protocol_name[];
71 
72 typedef enum _flow_show_options
73 {
74     FLOW_ALL,
75     FLOW_ONLY_INVITES
76 } flow_show_options;
77 
78 /** defines specific SIP data */
79 
80 typedef enum _sip_call_state {
81     SIP_INVITE_SENT,
82     SIP_200_REC,
83     SIP_CANCEL_SENT
84 } sip_call_state;
85 
86 typedef struct _sip_calls_info {
87     gchar *call_identifier;
88     guint32 invite_cseq;
89     sip_call_state sip_state;
90 } sip_calls_info_t;
91 
92 /** defines specific ISUP data */
93 typedef struct _isup_calls_info {
94     guint16 cic;
95     guint32 opc, dpc;
96     guint8  ni;
97 } isup_calls_info_t;
98 
99 /* defines specific H245 data */
100 typedef struct _h245_address {
101     address h245_address;
102     guint16 h245_port;
103 } h245_address_t;
104 
105 /** defines specific H323 data */
106 typedef struct _h323_calls_info {
107     e_guid_t *guid;               /* Call ID to identify a H225 */
108     GList*    h245_list;          /**< list of H245 Address and ports for tunneling off calls*/
109     address   h225SetupAddr;      /**< we use the SETUP H225 IP to determine if packets are forward or reverse */
110     gboolean  is_h245;
111     gboolean  is_faststart_Setup; /**< if faststart field is included in Setup*/
112     gboolean  is_faststart_Proc;  /**< if faststart field is included in Proce, Alerting, Progress or Connect*/
113     gboolean  is_h245Tunneling;
114     gint32    q931_crv;
115     gint32    q931_crv2;
116     guint     requestSeqNum;
117 } h323_calls_info_t;
118 
119 /**< defines specific MGCP data */
120 typedef struct _mgcp_calls_info {
121     gchar *endpointId;
122     gboolean fromEndpoint; /**< true if the call was originated from the Endpoint, false for calls from MGC */
123 } mgcp_calls_info_t;
124 
125 /** defines specific ACTRACE ISDN data */
126 typedef struct _actrace_isdn_calls_info {
127     gint32 crv;
128     int trunk;
129 } actrace_isdn_calls_info_t;
130 
131 /** defines specific ACTRACE CAS data */
132 typedef struct _actrace_cas_calls_info {
133     gint32 bchannel;
134     int trunk;
135 } actrace_cas_calls_info_t;
136 
137 /** defines specific SKINNY data */
138 typedef struct _skinny_calls_info {
139     guint32 callId;
140 } skinny_calls_info_t;
141 
142 /** defines info types for graph analysis additional information */
143 typedef enum _ga_info_type {
144     GA_INFO_TYPE_NONE=0,
145     GA_INFO_TYPE_RTP
146 } ga_info_type;
147 
148 /** defines a voip call */
149 typedef struct _voip_calls_info {
150     voip_call_state         call_state;
151     voip_call_active_state  call_active_state;
152     gchar                  *call_id;
153     gchar                  *from_identity;
154     gchar                  *to_identity;
155     gpointer                prot_info;
156     void (*free_prot_info)(gpointer);
157     address                 initial_speaker;
158     guint32                 npackets;
159     voip_protocol           protocol;
160     gchar                  *protocol_name;
161     gchar                  *call_comment;
162     guint16                 call_num;
163     /**> The frame_data struct holds the frame number and timing information needed. */
164     frame_data             *start_fd;
165     nstime_t                start_rel_ts;
166     frame_data             *stop_fd;
167     nstime_t                stop_rel_ts;
168 } voip_calls_info_t;
169 
170 /**
171  * structure that holds the information about all detected calls */
172 /* struct holding all information of the tap */
173 /*
174  * XXX Most of these are private to voip_calls.c. We might want to
175  * make them private.
176  */
177 struct _h245_labels;
178 typedef struct _voip_calls_tapinfo {
179     tap_reset_cb          tap_reset; /**< tap reset callback */
180     tap_packet_cb         tap_packet; /**< tap per-packet callback */
181     tap_draw_cb           tap_draw; /**< tap draw callback */
182     void                 *tap_data; /**< data for tap callbacks */
183     int                   ncalls; /**< number of call */
184     GQueue*               callsinfos; /**< queue with all calls (voip_calls_info_t) */
185     GHashTable*           callsinfo_hashtable[1]; /**< array of hashes per voip protocol (voip_calls_info_t); currently only the one for SIP is used */
186     int                   npackets; /**< total number of packets of all calls */
187     voip_calls_info_t    *filter_calls_fwd; /**< used as filter in some tap modes */
188     int                   start_packets;
189     int                   completed_calls;
190     int                   rejected_calls;
191     seq_analysis_info_t  *graph_analysis;
192     epan_t               *session; /**< epan session */
193     int                   nrtpstreams; /**< number of rtp streams */
194     GList*                rtpstream_list; /**< list of rtpstream_info_t */
195     guint32               rtp_evt_frame_num;
196     guint8                rtp_evt;
197     gboolean              rtp_evt_end;
198     gchar                *sdp_summary;
199     guint32               sdp_frame_num;
200     guint32               mtp3_opc;
201     guint32               mtp3_dpc;
202     guint8                mtp3_ni;
203     guint32               mtp3_frame_num;
204     struct _h245_labels  *h245_labels; /**< H.245 labels */
205     gchar                *q931_calling_number;
206     gchar                *q931_called_number;
207     guint8                q931_cause_value;
208     gint32                q931_crv;
209     guint32               q931_frame_num;
210     guint32               h225_frame_num;
211     guint16               h225_call_num;
212     int                   h225_cstype; /* XXX actually an enum */
213     gboolean              h225_is_faststart;
214     guint32               sip_frame_num;
215     guint32               actrace_frame_num;
216     gint32                actrace_trunk;
217     gint32                actrace_direction;
218     flow_show_options     fs_option;
219     guint32               redraw;
220     gboolean              apply_display_filter;
221 } voip_calls_tapinfo_t;
222 
223 #if 0
224 #define VOIP_CALLS_DEBUG(...) { \
225     char *VOIP_CALLS_DEBUG_MSG = g_strdup_printf(__VA_ARGS__); \
226     ws_warning("voip_calls: %s:%d %s", G_STRFUNC, __LINE__, VOIP_CALLS_DEBUG_MSG); \
227     g_free(VOIP_CALLS_DEBUG_MSG); \
228 }
229 #else
230 #define VOIP_CALLS_DEBUG(...)
231 #endif
232 
233 /****************************************************************************/
234 /* INTERFACE */
235 
236 /**
237  * Registers the voip_calls tap listeners (if not already done).
238  * From that point on, the calls list will be updated with every redissection.
239  * This function is also the entry point for the initialization routine of the tap system.
240  * So whenever voip_calls.c is added to the list of WIRESHARK_TAP_SRCs, the tap will be registered on startup.
241  * If not, it will be registered on demand by the voip_calls functions that need it.
242  */
243 void voip_calls_init_all_taps(voip_calls_tapinfo_t *tap_id_base);
244 
245 /**
246  * Removes the voip_calls tap listener (if not already done)
247  * From that point on, the voip calls list won't be updated any more.
248  */
249 void voip_calls_remove_all_tap_listeners(voip_calls_tapinfo_t *tap_id_base);
250 
251 /**
252  * Cleans up memory of voip calls tap.
253  */
254 void voip_calls_reset_all_taps(voip_calls_tapinfo_t *tapinfo);
255 
256 /**
257  * Frees one callsinfo
258  */
259 void
260 voip_calls_free_callsinfo(voip_calls_info_t *callsinfo);
261 
262 #ifdef __cplusplus
263 }
264 #endif /* __cplusplus */
265 
266 #endif /* __VOIP_CALLS_H__ */
267