From a67b7f5b5c563e54ca630370cdf7f696e4ce59a5 Mon Sep 17 00:00:00 2001 From: Balint Reczey Date: Sun, 22 Jun 2014 12:53:48 -0700 Subject: Use GQueue for generating statistics This makes reversing the list back and forth to keep adding data at O(n) complexity obsolete. Bug: 9696 Change-Id: Ice77328b8f6c5bf72bbfcfd82e08d09d4f986d3f Reviewed-on: https://code.wireshark.org/review/2571 Reviewed-by: Balint Reczey Tested-by: Balint Reczey --- ui/gtk/flow_graph.c | 1 + ui/gtk/graph_analysis.c | 2 +- ui/gtk/lbm_uimflow_dlg.c | 12 +-- ui/gtk/rtp_player.c | 4 +- ui/gtk/voip_calls.c | 242 ++++++++++++++++++++++--------------------- ui/gtk/voip_calls.h | 3 +- ui/gtk/voip_calls_dlg.c | 31 +++--- ui/qt/lbm_uimflow_dialog.cpp | 7 +- ui/qt/sequence_diagram.cpp | 2 +- ui/qt/sequence_dialog.cpp | 2 +- ui/tap-sequence-analysis.c | 100 +++++++++--------- ui/tap-sequence-analysis.h | 2 +- 12 files changed, 198 insertions(+), 210 deletions(-) (limited to 'ui') diff --git a/ui/gtk/flow_graph.c b/ui/gtk/flow_graph.c index 53eeb1e5bf..aadf624d69 100644 --- a/ui/gtk/flow_graph.c +++ b/ui/gtk/flow_graph.c @@ -67,6 +67,7 @@ flow_graph_data_init(void) { graph_analysis = (seq_analysis_info_t *)g_malloc0(sizeof(seq_analysis_info_t)); graph_analysis->type = SEQ_ANALYSIS_ANY; graph_analysis->all_packets = TRUE; + graph_analysis->items = g_queue_new(); } diff --git a/ui/gtk/graph_analysis.c b/ui/gtk/graph_analysis.c index 609cd3c537..d15277829a 100644 --- a/ui/gtk/graph_analysis.c +++ b/ui/gtk/graph_analysis.c @@ -430,7 +430,7 @@ static void dialog_graph_draw(graph_analysis_data_t *user_data) display_items = draw_height/ITEM_HEIGHT; /* get the items to display and fill the matrix array */ - list = g_list_first(user_data->graph_info->list); + list = g_queue_peek_nth_link(user_data->graph_info->items, 0); current_item = 0; i = 0; while (list) diff --git a/ui/gtk/lbm_uimflow_dlg.c b/ui/gtk/lbm_uimflow_dlg.c index 80430fa876..6de90a2b2b 100644 --- a/ui/gtk/lbm_uimflow_dlg.c +++ b/ui/gtk/lbm_uimflow_dlg.c @@ -65,7 +65,7 @@ static void lbmc_uim_flow_graph_data_init(void) dialog_data.graph_analysis->all_packets = TRUE; dialog_data.graph_analysis->any_addr = TRUE; dialog_data.graph_analysis->nconv = 0; - dialog_data.graph_analysis->list = NULL; + dialog_data.graph_analysis->items = g_queue_new(); dialog_data.graph_analysis->ht = NULL; dialog_data.graph_analysis->num_nodes = 0; } @@ -96,7 +96,7 @@ static void lbmc_uim_flow_tap_reset(void * tap_data _U_) if (dialog_data.graph_analysis != NULL) { /* free the graph data items */ - list = g_list_first(dialog_data.graph_analysis->list); + list = g_queue_peek_nth_link(dialog_data.graph_analysis->items, 0); while (list) { graph_item = (seq_analysis_item_t *)list->data; @@ -106,9 +106,8 @@ static void lbmc_uim_flow_tap_reset(void * tap_data _U_) g_free(list->data); list = g_list_next(list); } - g_list_free(dialog_data.graph_analysis->list); + g_queue_clear(dialog_data.graph_analysis->items); dialog_data.graph_analysis->nconv = 0; - dialog_data.graph_analysis->list = NULL; } } @@ -223,7 +222,7 @@ static int lbmc_uim_flow_graph_add_to_graph(packet_info * pinfo, const lbm_uim_s item->conv_num = (guint16)LBM_CHANNEL_ID(stream_info->channel); item->display = TRUE; item->line_style = 1; - dialog_data.graph_analysis->list = g_list_prepend(dialog_data.graph_analysis->list, (gpointer)item); + g_queue_push_tail(dialog_data.graph_analysis->items, item); return (1); } @@ -280,9 +279,8 @@ static void lbmc_uim_flow_graph_on_ok_cb(GtkButton * button _U_, gpointer user_d dialog_data.have_tap_listener = TRUE; } cf_retap_packets(&cfile); - dialog_data.graph_analysis->list = g_list_reverse(dialog_data.graph_analysis->list); /* Fill in the timestamps. */ - list = g_list_first(dialog_data.graph_analysis->list); + list = g_queue_peek_nth_link(dialog_data.graph_analysis->items, 0); while (list != NULL) { seq_analysis_item_t * seq_item = (seq_analysis_item_t *)list->data; diff --git a/ui/gtk/rtp_player.c b/ui/gtk/rtp_player.c index 335880b60a..856bcb5e2f 100644 --- a/ui/gtk/rtp_player.c +++ b/ui/gtk/rtp_player.c @@ -438,14 +438,14 @@ mark_rtp_stream_to_play(gchar *key _U_ , rtp_stream_info_t *rsi, gpointer ptr _U rsi->play = FALSE; /* and associate the RTP stream with a call using the first RTP packet in the stream */ - graph_list = g_list_first(voip_calls->graph_analysis->list); + graph_list = g_queue_peek_nth_link(voip_calls->graph_analysis->items, 0); while (graph_list) { graph_item = (seq_analysis_item_t *)graph_list->data; if (rsi->first_frame_number == graph_item->fd->num) { rsi->call_num = graph_item->conv_num; /* if it is in the graph list, then check if the voip_call is selected */ - voip_calls_list = g_list_first(voip_calls->callsinfo_list); + voip_calls_list = g_queue_peek_nth_link(voip_calls->callsinfos, 0); while (voip_calls_list) { tmp_voip_call = (voip_calls_info_t *)voip_calls_list->data; diff --git a/ui/gtk/voip_calls.c b/ui/gtk/voip_calls.c index 29ee319de5..e4a98f7862 100644 --- a/ui/gtk/voip_calls.c +++ b/ui/gtk/voip_calls.c @@ -145,9 +145,6 @@ typedef struct _voip_rtp_stream_info { } voip_rtp_stream_info_t; /****************************************************************************/ -/* the one and only global voip_calls_tapinfo_t structure */ -static voip_calls_tapinfo_t the_tapinfo_struct = - {0, NULL, {0}, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* the one and only global voip_rtp_tapinfo_t structure */ static voip_rtp_tapinfo_t the_tapinfo_rtp_struct = @@ -169,7 +166,7 @@ void voip_calls_reset(voip_calls_tapinfo_t *tapinfo) #endif /* free the data items first */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { callsinfo = (voip_calls_info_t *)list->data; @@ -186,22 +183,20 @@ void voip_calls_reset(voip_calls_tapinfo_t *tapinfo) g_free(list->data); list = g_list_next(list); } - g_list_free(tapinfo->callsinfo_list); + g_queue_clear(tapinfo->callsinfos); /* free the SIP_HASH */ if(NULL!=tapinfo->callsinfo_hashtable[SIP_HASH]) g_hash_table_remove_all (tapinfo->callsinfo_hashtable[SIP_HASH]); - tapinfo->callsinfo_list = NULL; tapinfo->ncalls = 0; tapinfo->npackets = 0; tapinfo->start_packets = 0; tapinfo->completed_calls = 0; tapinfo->rejected_calls = 0; - tapinfo->reversed= 0; /* free the graph data items first */ if(NULL!=tapinfo->graph_analysis->ht) g_hash_table_remove_all(tapinfo->graph_analysis->ht); - list = g_list_first(tapinfo->graph_analysis->list); + list = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0); while (list) { graph_item = (seq_analysis_item_t *)list->data; @@ -213,9 +208,8 @@ void voip_calls_reset(voip_calls_tapinfo_t *tapinfo) g_free(list->data); list = g_list_next(list); } - g_list_free(tapinfo->graph_analysis->list); + g_queue_clear(tapinfo->graph_analysis->items); tapinfo->graph_analysis->nconv = 0; - tapinfo->graph_analysis->list = NULL; ++(tapinfo->launch_count); @@ -235,10 +229,11 @@ void voip_calls_reset(voip_calls_tapinfo_t *tapinfo) /****************************************************************************/ void graph_analysis_data_init(void) { - the_tapinfo_struct.graph_analysis = (seq_analysis_info_t *)g_malloc(sizeof(seq_analysis_info_t)); - the_tapinfo_struct.graph_analysis->nconv = 0; - the_tapinfo_struct.graph_analysis->list = NULL; - the_tapinfo_struct.graph_analysis->ht= g_hash_table_new(g_int_hash, g_int_equal); + voip_calls_tapinfo_t *voip_tapinfo = voip_calls_get_info(); + voip_tapinfo->graph_analysis = (seq_analysis_info_t *)g_malloc(sizeof(seq_analysis_info_t)); + voip_tapinfo->graph_analysis->nconv = 0; + voip_tapinfo->graph_analysis->items = g_queue_new();; + voip_tapinfo->graph_analysis->ht= g_hash_table_new(g_int_hash, g_int_equal); } /****************************************************************************/ @@ -270,7 +265,7 @@ static void add_to_graph(voip_calls_tapinfo_t *tapinfo _U_, packet_info *pinfo, gai->time_str = g_strdup(time_str); gai->display=FALSE; - tapinfo->graph_analysis->list = g_list_prepend(tapinfo->graph_analysis->list, gai); + g_queue_push_tail(tapinfo->graph_analysis->items, gai); g_hash_table_insert(tapinfo->graph_analysis->ht, &gai->fd->num, gai); } @@ -342,7 +337,7 @@ static guint change_call_num_graph(voip_calls_tapinfo_t *tapinfo _U_, guint16 ca guint items_changed; items_changed = 0; - list = g_list_first(tapinfo->graph_analysis->list); + list = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0); while (list) { gai = (seq_analysis_item_t *)list->data; @@ -389,12 +384,12 @@ static void insert_to_graph_t38(voip_calls_tapinfo_t *tapinfo _U_, packet_info * item_num = 0; inserted = FALSE; - list = g_list_first(tapinfo->graph_analysis->list); + list = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0); while (list) { gai = (seq_analysis_item_t *)list->data; if (gai->fd->num > frame_num) { - the_tapinfo_struct.graph_analysis->list = g_list_insert(the_tapinfo_struct.graph_analysis->list, new_gai, item_num); + g_queue_insert_before(tapinfo->graph_analysis->items, list, new_gai); g_hash_table_insert(tapinfo->graph_analysis->ht, &new_gai->fd->num, new_gai); inserted = TRUE; break; @@ -404,7 +399,7 @@ static void insert_to_graph_t38(voip_calls_tapinfo_t *tapinfo _U_, packet_info * } if (!inserted) { - tapinfo->graph_analysis->list = g_list_prepend(tapinfo->graph_analysis->list, new_gai); + g_queue_push_tail(tapinfo->graph_analysis->items, new_gai); g_hash_table_insert(tapinfo->graph_analysis->ht, &new_gai->fd->num, new_gai); } } @@ -591,7 +586,7 @@ RTP_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, void cons } } - the_tapinfo_struct.redraw = TRUE; + voip_calls_get_info()->redraw = TRUE; return 1; } @@ -617,14 +612,14 @@ static void RTP_packet_draw(void *prs _U_) rtp_listinfo = (voip_rtp_stream_info_t *)rtp_streams_list->data; /* using the setup frame number of the RTP stream, we get the call number that it belongs to*/ - /* voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list); */ + /* voip_calls_graph_list = g_list_first(voip_calls_get_info()->graph_analysis->list); */ - gai = (seq_analysis_item_t *)g_hash_table_lookup(the_tapinfo_struct.graph_analysis->ht, &rtp_listinfo->setup_frame_number); + gai = (seq_analysis_item_t *)g_hash_table_lookup(voip_calls_get_info()->graph_analysis->ht, &rtp_listinfo->setup_frame_number); if(gai != NULL) { /* Found the setup frame*/ conv_num = gai->conv_num; /* if RTP was already in the Graph, just update the comment information */ - gai = (seq_analysis_item_t *)g_hash_table_lookup(the_tapinfo_struct.graph_analysis->ht, &rtp_listinfo->start_fd->num); + gai = (seq_analysis_item_t *)g_hash_table_lookup(voip_calls_get_info()->graph_analysis->ht, &rtp_listinfo->start_fd->num); if(gai != NULL) { duration = (guint32)(nstime_to_msec(&rtp_listinfo->stop_rel_ts) - nstime_to_msec(&rtp_listinfo->start_rel_ts)); g_free(gai->comment); @@ -652,8 +647,8 @@ static void RTP_packet_draw(void *prs _U_) new_gai->time_str = g_strdup(time_str); new_gai->display=FALSE; new_gai->line_style = 2; /* the arrow line will be 2 pixels width */ - the_tapinfo_struct.graph_analysis->list = g_list_prepend(the_tapinfo_struct.graph_analysis->list, new_gai); - g_hash_table_insert(the_tapinfo_struct.graph_analysis->ht, &rtp_listinfo->start_fd, new_gai); + g_queue_push_tail(voip_calls_get_info()->graph_analysis->items, new_gai); + g_hash_table_insert(voip_calls_get_info()->graph_analysis->ht, &rtp_listinfo->start_fd, new_gai); } } rtp_streams_list = g_list_next(rtp_streams_list); @@ -680,7 +675,7 @@ static void RTP_packet_draw(void *prs _U_) rtp_listinfo = rtp_streams_list->data; /* using the setup frame number of the RTP stream, we get the call number that it belongs to*/ - voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list); + voip_calls_graph_list = g_list_first(voip_calls_get_info()->graph_analysis->list); while (voip_calls_graph_list) { gai = voip_calls_graph_list->data; @@ -688,7 +683,7 @@ static void RTP_packet_draw(void *prs _U_) /* if we get the setup frame number, then get the time position to graph the RTP arrow */ if (rtp_listinfo->setup_frame_number == gai->fd->num) { /* look again from the beginning because there are cases where the Setup frame is after the RTP */ - voip_calls_graph_list = g_list_first(the_tapinfo_struct.graph_analysis->list); + voip_calls_graph_list = g_list_first(voip_calls_get_info()->graph_analysis->list); item = 0; while(voip_calls_graph_list) { gai = voip_calls_graph_list->data; @@ -728,7 +723,7 @@ static void RTP_packet_draw(void *prs _U_) new_gai->time_str = g_strdup(time_str); new_gai->display=FALSE; new_gai->line_style = 2; /* the arrow line will be 2 pixels width */ - the_tapinfo_struct.graph_analysis->list = g_list_insert(the_tapinfo_struct.graph_analysis->list, new_gai, item); + voip_calls_get_info()->graph_analysis->list = g_list_insert(voip_calls_get_info()->graph_analysis->list, new_gai, item); break; } if (voip_calls_graph_list) item++; @@ -785,7 +780,7 @@ remove_tap_listener_rtp(void) static int T38_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *T38info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *callsinfo = NULL; voip_calls_info_t *tmp_listinfo; @@ -802,7 +797,7 @@ T38_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo if (pi->setup_frame_number != 0) { /* using the setup frame number of the T38 packet, we get the call number that it belongs */ - voip_calls_graph_list = g_list_first(tapinfo->graph_analysis->list); + voip_calls_graph_list = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0); while (voip_calls_graph_list) { tmp_gai = (seq_analysis_item_t *)voip_calls_graph_list->data; @@ -822,7 +817,7 @@ T38_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo */ if ( (pi->setup_frame_number == 0) || (gai == NULL) ) { /* check whether we already have a call with these parameters in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -849,7 +844,7 @@ T38_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const vo callsinfo->free_prot_info = NULL; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } callsinfo->stop_fd = pinfo->fd; callsinfo->stop_rel_ts = pinfo->rel_ts; @@ -938,7 +933,7 @@ t38_init_tap(void) if(have_T38_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("t38", &(the_tapinfo_struct.t38_dummy), NULL, + error_string = register_tap_listener("t38", &(voip_calls_get_info()->t38_dummy), NULL, 0, voip_calls_dlg_reset, T38_packet, @@ -958,7 +953,7 @@ t38_init_tap(void) void remove_tap_listener_t38(void) { - remove_tap_listener(&(the_tapinfo_struct.t38_dummy)); + remove_tap_listener(&(voip_calls_get_info()->t38_dummy)); have_T38_tap_listener=FALSE; } @@ -985,7 +980,7 @@ static void free_sip_info(gpointer p) { static int SIPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *SIPinfo) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); /* we just take note of the ISUP data here; when we receive the MTP3 part everything will be compared with existing calls */ @@ -1049,7 +1044,7 @@ SIPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con /* show method in comment in conversation list dialog, user can discern different conversation types */ callsinfo->call_comment=g_strdup(pi->request_method); - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); /* insert the call information in the SIP_HASH */ g_hash_table_insert(tapinfo->callsinfo_hashtable[SIP_HASH], tmp_sipinfo->call_identifier, callsinfo); @@ -1161,6 +1156,13 @@ SIPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con /****************************************************************************/ voip_calls_tapinfo_t* voip_calls_get_info(void) { + /* the one and only global voip_calls_tapinfo_t structure */ + static voip_calls_tapinfo_t the_tapinfo_struct = + {0, NULL, {0}, 0, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + if (!the_tapinfo_struct.callsinfos) { + /* not initialized yet */ + the_tapinfo_struct.callsinfos = g_queue_new(); + } return &the_tapinfo_struct; } @@ -1177,7 +1179,7 @@ sip_calls_init_tap(void) if(have_SIP_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("sip", &(the_tapinfo_struct.sip_dummy), NULL, + error_string = register_tap_listener("sip", &(voip_calls_get_info()->sip_dummy), NULL, 0, voip_calls_dlg_reset, SIPcalls_packet, @@ -1197,7 +1199,7 @@ sip_calls_init_tap(void) void remove_tap_listener_sip_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.sip_dummy)); + remove_tap_listener(&(voip_calls_get_info()->sip_dummy)); have_SIP_tap_listener=FALSE; } @@ -1216,7 +1218,7 @@ static guint32 mtp3_frame_num; static int isup_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *isup_info _U_) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *tmp_listinfo; voip_calls_info_t *callsinfo = NULL; isup_calls_info_t *tmp_isupinfo; @@ -1227,14 +1229,14 @@ isup_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co gchar *frame_label = NULL; gchar *comment = NULL; - /*voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; unused */ + /*voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); unused */ const isup_tap_rec_t *pi = (const isup_tap_rec_t *)isup_info; /* check if the lower layer is MTP matching the frame number */ if (mtp3_frame_num != pinfo->fd->num) return 0; /* check whether we already have a call with these parameters in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { right_pair = TRUE; @@ -1299,7 +1301,7 @@ isup_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co tmp_isupinfo->cic = pinfo->circuit_id; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } @@ -1385,7 +1387,7 @@ isup_calls_init_tap(void) if(have_isup_tap_listener==FALSE) { - error_string = register_tap_listener("isup", &(the_tapinfo_struct.isup_dummy), + error_string = register_tap_listener("isup", &(voip_calls_get_info()->isup_dummy), NULL, 0, voip_calls_dlg_reset, @@ -1408,7 +1410,7 @@ isup_calls_init_tap(void) void remove_tap_listener_isup_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.isup_dummy)); + remove_tap_listener(&(voip_calls_get_info()->isup_dummy)); have_isup_tap_listener=FALSE; } @@ -1449,7 +1451,7 @@ mtp3_calls_init_tap(void) if(have_mtp3_tap_listener==FALSE) { - error_string = register_tap_listener("mtp3", &(the_tapinfo_struct.mtp3_dummy), + error_string = register_tap_listener("mtp3", &(voip_calls_get_info()->mtp3_dummy), NULL, 0, voip_calls_dlg_reset, @@ -1468,7 +1470,7 @@ mtp3_calls_init_tap(void) if(have_m3ua_tap_listener==FALSE) { - error_string = register_tap_listener("m3ua", &(the_tapinfo_struct.mtp3_dummy), + error_string = register_tap_listener("m3ua", &(voip_calls_get_info()->mtp3_dummy), NULL, 0, voip_calls_dlg_reset, @@ -1492,8 +1494,8 @@ mtp3_calls_init_tap(void) void remove_tap_listener_mtp3_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.mtp3_dummy)); - remove_tap_listener(&(the_tapinfo_struct.m3ua_dummy)); + remove_tap_listener(&(voip_calls_get_info()->mtp3_dummy)); + remove_tap_listener(&(voip_calls_get_info()->m3ua_dummy)); have_mtp3_tap_listener=FALSE; have_m3ua_tap_listener=FALSE; @@ -1528,7 +1530,7 @@ static int q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *q931_info) { GList *list,*list2; - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); h323_calls_info_t *tmp_h323info,*tmp2_h323info; actrace_isdn_calls_info_t *tmp_actrace_isdn_info; voip_calls_info_t *tmp_listinfo; @@ -1559,7 +1561,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co /* add staff to H323 calls */ if (h225_frame_num == q931_frame_num) { tmp_h323info = NULL; - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1595,7 +1597,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co /* TODO: we are just checking the DialedNumer in LRQ/LCF against the Setup we should also check if the h225 signaling IP and port match the destination Setup ip and port */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1625,7 +1627,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co g_list_free(tmp_h323info->h245_list); tmp_h323info->h245_list = NULL; g_free(tmp_listinfo->prot_info); - tapinfo->callsinfo_list = g_list_remove(tapinfo->callsinfo_list, tmp_listinfo); + g_queue_unlink(tapinfo->callsinfos, list); break; } } @@ -1657,7 +1659,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co } else if (h245_labels.frame_num == q931_frame_num) { /* there are empty H225 frames that don't have guid (guaid=0) but they have h245 info, so the only way to match those frames is with the Q931 CRV number */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1687,7 +1689,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co comment = NULL; callsinfo = NULL; - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1723,7 +1725,7 @@ q931_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co tmp_actrace_isdn_info->trunk=actrace_trunk; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } callsinfo->stop_fd = pinfo->fd; @@ -1792,7 +1794,7 @@ q931_calls_init_tap(void) if(have_q931_tap_listener==FALSE) { - error_string = register_tap_listener("q931", &(the_tapinfo_struct.q931_dummy), + error_string = register_tap_listener("q931", &(voip_calls_get_info()->q931_dummy), NULL, 0, voip_calls_dlg_reset, @@ -1815,7 +1817,7 @@ q931_calls_init_tap(void) void remove_tap_listener_q931_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.q931_dummy)); + remove_tap_listener(&(voip_calls_get_info()->q931_dummy)); have_q931_tap_listener=FALSE; } @@ -1857,7 +1859,7 @@ static void free_h225_info(gpointer p) { static int H225calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *H225info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *tmp_listinfo; voip_calls_info_t *callsinfo = NULL; h323_calls_info_t *tmp_h323info = NULL; @@ -1880,7 +1882,7 @@ H225calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con if (!pi->request_available) return 0; /* check whether we already have a call with this request SeqNum */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1896,7 +1898,7 @@ H225calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con } } else { /* check whether we already have a call with this guid in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -1948,7 +1950,7 @@ H225calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con callsinfo->call_num = tapinfo->ncalls++; callsinfo->npackets = 0; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } h225_frame_num = pinfo->fd->num; @@ -2085,7 +2087,7 @@ h225_calls_init_tap(void) if(have_H225_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("h225", &(the_tapinfo_struct.h225_dummy), NULL, + error_string = register_tap_listener("h225", &(voip_calls_get_info()->h225_dummy), NULL, 0, voip_calls_dlg_reset, H225calls_packet, @@ -2106,7 +2108,7 @@ h225_calls_init_tap(void) void remove_tap_listener_h225_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.h225_dummy)); + remove_tap_listener(&(voip_calls_get_info()->h225_dummy)); have_H225_tap_listener=FALSE; } @@ -2119,7 +2121,7 @@ void h245_add_to_graph(guint32 new_frame_num) if (new_frame_num != h245_labels.frame_num) return; for (n=0; ncallsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -2241,7 +2243,7 @@ h245dg_calls_init_tap(void) if(have_H245dg_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("h245dg", &(the_tapinfo_struct.h245dg_dummy), NULL, + error_string = register_tap_listener("h245dg", &(voip_calls_get_info()->h245dg_dummy), NULL, 0, voip_calls_dlg_reset, H245dgcalls_packet, @@ -2262,7 +2264,7 @@ h245dg_calls_init_tap(void) void remove_tap_listener_h245dg_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.h245dg_dummy)); + remove_tap_listener(&(voip_calls_get_info()->h245dg_dummy)); have_H245dg_tap_listener=FALSE; } @@ -2274,7 +2276,7 @@ remove_tap_listener_h245dg_calls(void) static int SDPcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *SDPinfo) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); const sdp_packet_info *pi = (const sdp_packet_info *)SDPinfo; /* There are protocols like MGCP/SIP where the SDP is called before the tap for the @@ -2306,7 +2308,7 @@ sdp_calls_init_tap(void) if(have_sdp_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("sdp", &(the_tapinfo_struct.sdp_dummy), NULL, + error_string = register_tap_listener("sdp", &(voip_calls_get_info()->sdp_dummy), NULL, 0, voip_calls_dlg_reset, SDPcalls_packet, @@ -2327,7 +2329,7 @@ sdp_calls_init_tap(void) void remove_tap_listener_sdp_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.sdp_dummy)); + remove_tap_listener(&(voip_calls_get_info()->sdp_dummy)); have_sdp_tap_listener=FALSE; } @@ -2448,7 +2450,7 @@ static void mgcpDialedDigits(gchar *signalStr, gchar **dialedDigits) static int MGCPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *MGCPinfo) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *tmp_listinfo; voip_calls_info_t *callsinfo = NULL; @@ -2467,7 +2469,7 @@ MGCPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co if ((pi->mgcp_type == MGCP_REQUEST) && !pi->is_duplicate ) { /* check whether we already have a call with this Endpoint and it is active*/ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -2513,13 +2515,13 @@ MGCPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co ((pi->mgcp_type == MGCP_REQUEST) && pi->is_duplicate) ) { /* if it is a response OR if it is a duplicated Request, lets look in the Graph to see if there is a request that matches */ - listGraph = g_list_first(tapinfo->graph_analysis->list); + listGraph = g_queue_peek_nth_link(tapinfo->graph_analysis->items, 0); while (listGraph) { gai = (seq_analysis_item_t *)listGraph->data; if (gai->fd->num == pi->req_num) { /* there is a request that match, so look the associated call with this call_num */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -2564,7 +2566,7 @@ MGCPcalls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, co tmp_mgcpinfo->fromEndpoint = fromEndpoint; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } g_assert(tmp_mgcpinfo != NULL); @@ -2686,7 +2688,7 @@ mgcp_calls_init_tap(void) * routine. */ error_string = register_tap_listener("mgcp", - &(the_tapinfo_struct.mgcp_dummy), + &(voip_calls_get_info()->mgcp_dummy), NULL, TL_REQUIRES_PROTO_TREE, voip_calls_dlg_reset, @@ -2707,7 +2709,7 @@ mgcp_calls_init_tap(void) void remove_tap_listener_mgcp_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.mgcp_dummy)); + remove_tap_listener(&(voip_calls_get_info()->mgcp_dummy)); have_MGCP_tap_listener=FALSE; } @@ -2721,7 +2723,7 @@ remove_tap_listener_mgcp_calls(void) static int ACTRACEcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *ACTRACEinfo) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); const actrace_info_t *pi = (const actrace_info_t *)ACTRACEinfo; GList *list; actrace_cas_calls_info_t *tmp_actrace_cas_info; @@ -2738,7 +2740,7 @@ ACTRACEcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, gchar *comment = NULL; callsinfo = NULL; - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo=(voip_calls_info_t *)list->data; @@ -2775,7 +2777,7 @@ ACTRACEcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, tmp_actrace_cas_info->trunk=actrace_trunk; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } callsinfo->stop_fd = pinfo->fd; @@ -2813,7 +2815,7 @@ actrace_calls_init_tap(void) if(have_actrace_tap_listener==FALSE) { /* don't register tap listener, if we have it already */ - error_string = register_tap_listener("actrace", &(the_tapinfo_struct.actrace_dummy), NULL, + error_string = register_tap_listener("actrace", &(voip_calls_get_info()->actrace_dummy), NULL, 0, voip_calls_dlg_reset, ACTRACEcalls_packet, @@ -2834,7 +2836,7 @@ actrace_calls_init_tap(void) void remove_tap_listener_actrace_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.actrace_dummy)); + remove_tap_listener(&(voip_calls_get_info()->actrace_dummy)); have_actrace_tap_listener=FALSE; } @@ -2852,7 +2854,7 @@ static gboolean have_megaco_tap_listener = FALSE; type == GCP_CMD_CTX_ATTR_AUDIT_REQ ) static int h248_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *prot_info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); const gcp_cmd_t *cmd = (const gcp_cmd_t *)prot_info; GList *list; voip_calls_info_t *callsinfo = NULL; @@ -2875,7 +2877,7 @@ static int h248_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t * address_to_str_buf(mgw, mgw_addr, 128); /* check whether we already have this context in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { voip_calls_info_t* tmp_listinfo = (voip_calls_info_t *)list->data; @@ -2912,7 +2914,7 @@ static int h248_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t * callsinfo->selected = FALSE; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } else { GString *s = g_string_new(""); @@ -2957,7 +2959,7 @@ void h248_calls_init_tap(void) if(have_megaco_tap_listener==FALSE) { - error_string = register_tap_listener("megaco", &(the_tapinfo_struct.megaco_dummy), + error_string = register_tap_listener("megaco", &(voip_calls_get_info()->megaco_dummy), NULL, 0, voip_calls_dlg_reset, @@ -2976,7 +2978,7 @@ void h248_calls_init_tap(void) if(have_h248_tap_listener==FALSE) { - error_string = register_tap_listener("h248", &(the_tapinfo_struct.h248_dummy), + error_string = register_tap_listener("h248", &(voip_calls_get_info()->h248_dummy), NULL, 0, voip_calls_dlg_reset, @@ -2997,8 +2999,8 @@ void h248_calls_init_tap(void) void remove_tap_listener_h248_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.h248_dummy)); - remove_tap_listener(&(the_tapinfo_struct.megaco_dummy)); + remove_tap_listener(&(voip_calls_get_info()->h248_dummy)); + remove_tap_listener(&(voip_calls_get_info()->megaco_dummy)); have_megaco_tap_listener=FALSE; have_h248_tap_listener=FALSE; @@ -3021,7 +3023,7 @@ static const voip_protocol sccp_proto_map[] = { const value_string* sccp_payload_values; static int sccp_calls(packet_info *pinfo, const void *prot_info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); const sccp_msg_info_t* msg = (const sccp_msg_info_t *)prot_info; sccp_assoc_info_t* assoc = msg->data.co.assoc; GList *list; @@ -3030,7 +3032,7 @@ static int sccp_calls(packet_info *pinfo, const void *prot_info) { const gchar *comment = NULL; /* check whether we already have this assoc in the list */ - for(list = g_list_first(tapinfo->callsinfo_list) ; list ; list = g_list_next (list) ) { + for(list = g_queue_peek_nth_link(tapinfo->callsinfos, 0) ; list ; list = g_list_next (list) ) { if ( ((voip_calls_info_t*)(list->data))->prot_info == assoc ) { callsinfo = (voip_calls_info_t*)(list->data); break; @@ -3070,7 +3072,7 @@ static int sccp_calls(packet_info *pinfo, const void *prot_info) { callsinfo->selected = FALSE; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } else { if ( assoc->calling_party ) { @@ -3141,7 +3143,7 @@ void sccp_calls_init_tap(void) if(have_sccp_tap_listener==FALSE) { - error_string = register_tap_listener("sccp", &(the_tapinfo_struct.sccp_dummy), + error_string = register_tap_listener("sccp", &(voip_calls_get_info()->sccp_dummy), NULL, 0, voip_calls_dlg_reset, @@ -3160,7 +3162,7 @@ void sccp_calls_init_tap(void) if(have_sua_tap_listener==FALSE) { - error_string = register_tap_listener("sua", &(the_tapinfo_struct.sua_dummy), + error_string = register_tap_listener("sua", &(voip_calls_get_info()->sua_dummy), NULL, 0, voip_calls_dlg_reset, @@ -3182,7 +3184,7 @@ void sccp_calls_init_tap(void) void remove_tap_listener_sccp_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.sccp_dummy)); + remove_tap_listener(&(voip_calls_get_info()->sccp_dummy)); have_sccp_tap_listener=FALSE; have_sua_tap_listener=FALSE; @@ -3196,7 +3198,7 @@ remove_tap_listener_sccp_calls(void) static int unistim_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *unistim_info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *tmp_listinfo; voip_calls_info_t *callsinfo = NULL; unistim_info_t *tmp_unistim_info = NULL; @@ -3212,7 +3214,7 @@ unistim_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, g_tmp = g_string_new(NULL); /* Check to see if this is a dup */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while(list) { @@ -3308,7 +3310,7 @@ unistim_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, callsinfo->free_prot_info = g_free; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } else { @@ -3564,7 +3566,7 @@ unistim_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, callsinfo->free_prot_info = g_free; callsinfo->npackets = 0; callsinfo->call_num = tapinfo->ncalls++; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); /* Open stream */ /* Each packet COULD BE OUR LAST!!!! */ @@ -3669,7 +3671,7 @@ unistim_calls_init_tap(void) { if(have_unistim_tap_listener==FALSE) { - error_string = register_tap_listener("unistim", &(the_tapinfo_struct.unistim_dummy), + error_string = register_tap_listener("unistim", &(voip_calls_get_info()->unistim_dummy), NULL, 0, voip_calls_dlg_reset, @@ -3692,7 +3694,7 @@ unistim_calls_init_tap(void) { void remove_tap_listener_unistim_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.unistim_dummy)); + remove_tap_listener(&(voip_calls_get_info()->unistim_dummy)); have_unistim_tap_listener=FALSE; } @@ -3723,7 +3725,7 @@ static const voip_call_state skinny_tap_voip_state[] = { static int skinny_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *skinny_info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); GList* list; voip_calls_info_t *callsinfo = NULL; address* phone; @@ -3734,7 +3736,7 @@ skinny_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, if (si == NULL || (si->callId == 0 && si->passThruId == 0)) return 0; /* check whether we already have this context in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { voip_calls_info_t* tmp_listinfo = (voip_calls_info_t *)list->data; @@ -3777,7 +3779,7 @@ skinny_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, callsinfo->stop_rel_ts = pinfo->rel_ts; callsinfo->selected = FALSE; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } else { if (si->callingParty) { g_free(callsinfo->from_identity); @@ -3835,7 +3837,7 @@ skinny_calls_init_tap(void) * routine. */ error_string = register_tap_listener("skinny", - &(the_tapinfo_struct.skinny_dummy), + &(voip_calls_get_info()->skinny_dummy), NULL, TL_REQUIRES_PROTO_TREE, voip_calls_dlg_reset, @@ -3856,7 +3858,7 @@ skinny_calls_init_tap(void) void remove_tap_listener_skinny_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.skinny_dummy)); + remove_tap_listener(&(voip_calls_get_info()->skinny_dummy)); have_skinny_tap_listener=FALSE; } @@ -3877,7 +3879,7 @@ static void free_iax2_info(gpointer p) { static int iax2_calls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *iax2_info) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); GList* list; voip_calls_info_t *callsinfo = NULL; address* phone; @@ -3887,7 +3889,7 @@ iax2_calls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, c if (ii == NULL || ii->ptype != IAX2_FULL_PACKET || (ii->scallno == 0 && ii->dcallno == 0)) return 0; /* check whether we already have this context in the list */ - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { voip_calls_info_t* tmp_listinfo = (voip_calls_info_t *)list->data; @@ -3933,7 +3935,7 @@ iax2_calls_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, c callsinfo->stop_rel_ts = pinfo->rel_ts; callsinfo->selected = FALSE; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } else { callsinfo->call_state = ii->callState; @@ -3974,7 +3976,7 @@ iax2_calls_init_tap(void) * appear to be true of the IAX2 dissector. */ error_string = register_tap_listener("IAX2", - &(the_tapinfo_struct.iax2_dummy), + &(voip_calls_get_info()->iax2_dummy), NULL, TL_REQUIRES_PROTO_TREE, voip_calls_dlg_reset, @@ -3995,7 +3997,7 @@ iax2_calls_init_tap(void) void remove_tap_listener_iax2_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.iax2_dummy)); + remove_tap_listener(&(voip_calls_get_info()->iax2_dummy)); have_iax2_tap_listener=FALSE; } @@ -4007,14 +4009,14 @@ remove_tap_listener_iax2_calls(void) static int VoIPcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *VoIPinfo) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); voip_calls_info_t *callsinfo = NULL; voip_calls_info_t *tmp_listinfo; GList *list = NULL; const voip_packet_info_t *pi = (const voip_packet_info_t *)VoIPinfo; if (pi->call_id) - list = g_list_first(tapinfo->callsinfo_list); + list = g_queue_peek_nth_link(tapinfo->callsinfos, 0); while (list) { tmp_listinfo = (voip_calls_info_t *)list->data; if ( tmp_listinfo->protocol == VOIP_COMMON ) { @@ -4046,7 +4048,7 @@ VoIPcalls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, con callsinfo->call_num = tapinfo->ncalls++; callsinfo->npackets = 0; - tapinfo->callsinfo_list = g_list_prepend(tapinfo->callsinfo_list, callsinfo); + g_queue_push_tail(tapinfo->callsinfos, callsinfo); } callsinfo->call_active_state = pi->call_active_state; @@ -4080,7 +4082,7 @@ VoIPcalls_init_tap(void) if(have_voip_tap_listener==FALSE) { - error_string = register_tap_listener("voip", &(the_tapinfo_struct.voip_dummy), + error_string = register_tap_listener("voip", &(voip_calls_get_info()->voip_dummy), NULL, 0, voip_calls_dlg_reset, @@ -4101,7 +4103,7 @@ VoIPcalls_init_tap(void) void remove_tap_listener_voip_calls(void) { - remove_tap_listener(&(the_tapinfo_struct.voip_dummy)); + remove_tap_listener(&(voip_calls_get_info()->voip_dummy)); have_voip_tap_listener=FALSE; } @@ -4129,7 +4131,7 @@ void VoIPcalls_set_flow_show_option(flow_show_options option) static int prot_calls_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const void *prot_info _U_) { - voip_calls_tapinfo_t *tapinfo = &the_tapinfo_struct; + voip_calls_tapinfo_t *tapinfo = voip_calls_get_info(); if (callsinfo!=NULL) { callsinfo->stop_abs = pinfo->fd->abs_ts; callsinfo->stop_rel = pinfo->rel_ts; @@ -4154,7 +4156,7 @@ prot_calls_init_tap(void) if(have_prot__tap_listener==FALSE) { - error_string = register_tap_listener("prot_", &(the_tapinfo_struct.prot__dummy), + error_string = register_tap_listener("prot_", &(voip_calls_get_info()->prot__dummy), NULL, 0, voip_calls_dlg_reset, @@ -4177,7 +4179,7 @@ prot_calls_init_tap(void) void remove_tap_listener_prot__calls(void) { - remove_tap_listener(&(the_tapinfo_struct.prot__dummy)); + remove_tap_listener(&(voip_calls_get_info()->prot__dummy)); have_prot__tap_listener=FALSE; } diff --git a/ui/gtk/voip_calls.h b/ui/gtk/voip_calls.h index f478c56aab..c9124c5e42 100644 --- a/ui/gtk/voip_calls.h +++ b/ui/gtk/voip_calls.h @@ -170,7 +170,7 @@ typedef struct _voip_calls_info { typedef struct _voip_calls_tapinfo { int ncalls; /**< number of call */ - GList* callsinfo_list; /**< list with all calls */ + GQueue* callsinfos; /**< queue with all calls */ GHashTable* callsinfo_hashtable[1]; /**< array of hashes per voip protocol; 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 */ @@ -179,7 +179,6 @@ typedef struct _voip_calls_tapinfo { int completed_calls; int rejected_calls; seq_analysis_info_t* graph_analysis; - gboolean reversed; gboolean redraw; /* * Now add dummy variables, one for each tap listener. diff --git a/ui/gtk/voip_calls_dlg.c b/ui/gtk/voip_calls_dlg.c index 78bb0eaf21..155d4ea182 100644 --- a/ui/gtk/voip_calls_dlg.c +++ b/ui/gtk/voip_calls_dlg.c @@ -209,11 +209,11 @@ voip_calls_on_filter(GtkButton *button _U_, gpointer user_data _U_) g_string_append_printf(filter_string_fwd, "("); /* Build a new filter based on frame numbers */ - lista = g_list_first(voip_calls_get_info()->callsinfo_list); + lista = g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0); while (lista) { listinfo = (voip_calls_info_t *)lista->data; if (listinfo->selected) { - listb = g_list_first(voip_calls_get_info()->graph_analysis->list); + listb = g_queue_peek_nth_link(voip_calls_get_info()->graph_analysis->items, 0); while (listb) { gai = (seq_analysis_item_t *)listb->data; if (gai->conv_num == listinfo->call_num) { @@ -238,7 +238,7 @@ voip_calls_on_filter(GtkButton *button _U_, gpointer user_data _U_) g_string_append_printf(filter_string_fwd, "("); is_first = TRUE; /* Build a new filter based on protocol fields */ - lista = g_list_first(voip_calls_get_info()->callsinfo_list); + lista = g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0); while (lista) { listinfo = (voip_calls_info_t *)lista->data; if (listinfo->selected) { @@ -314,10 +314,10 @@ voip_calls_on_select_all(GtkButton *button _U_, gpointer user_data _U_) /* compare two list entries by packet no */ static gint -graph_analysis_sort_compare(gconstpointer a, gconstpointer b) +graph_analysis_sort_compare(gconstpointer a, gconstpointer b, gpointer user_data _U_) { - const seq_analysis_item_t *entry_a = (const seq_analysis_item_t *)a; - const seq_analysis_item_t *entry_b = (const seq_analysis_item_t *)b; + const seq_analysis_item_t *entry_a = (const seq_analysis_item_t *)a; + const seq_analysis_item_t *entry_b = (const seq_analysis_item_t *)b; if(entry_a->fd->num < entry_b->fd->num) return -1; @@ -337,15 +337,10 @@ on_graph_bt_clicked(GtkButton *button _U_, gpointer user_data _U_) GList* listb; voip_calls_info_t *listinfo; - if(!voip_calls_get_info()->reversed) { - voip_calls_get_info()->callsinfo_list= - g_list_reverse(voip_calls_get_info()->callsinfo_list); - voip_calls_get_info()->graph_analysis->list= - g_list_sort(voip_calls_get_info()->graph_analysis->list, graph_analysis_sort_compare); - voip_calls_get_info()->reversed=1; - } + g_queue_sort(voip_calls_get_info()->graph_analysis->items, graph_analysis_sort_compare, NULL); + /* reset the "display" parameter in graph analysis */ - listb = g_list_first(voip_calls_get_info()->graph_analysis->list); + listb = g_queue_peek_nth_link(voip_calls_get_info()->graph_analysis->items, 0); while (listb) { gai = (seq_analysis_item_t *)listb->data; gai->display = FALSE; @@ -353,11 +348,11 @@ on_graph_bt_clicked(GtkButton *button _U_, gpointer user_data _U_) } /* set the display for selected calls */ - lista = g_list_first(voip_calls_get_info()->callsinfo_list); + lista = g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0); while (lista) { listinfo = (voip_calls_info_t *)lista->data; if (listinfo->selected) { - listb = g_list_first(voip_calls_get_info()->graph_analysis->list); + listb = g_queue_peek_nth_link(voip_calls_get_info()->graph_analysis->items, 0); while (listb) { gai = (seq_analysis_item_t *)listb->data; if (gai->conv_num == listinfo->call_num) { @@ -790,7 +785,7 @@ voip_calls_dlg_update(GList *listx) g_snprintf(label_text, sizeof(label_text), "Total: Calls: %u Start packets: %u Completed calls: %u Rejected calls: %u", - g_list_length(voip_calls_get_info()->callsinfo_list), + g_queue_get_length(voip_calls_get_info()->callsinfos), voip_calls_get_info()->start_packets, voip_calls_get_info()->completed_calls, voip_calls_get_info()->rejected_calls); @@ -825,7 +820,7 @@ void voip_calls_dlg_draw(void *ptr _U_) { if (voip_calls_get_info()->redraw) { - voip_calls_dlg_update(voip_calls_get_info()->callsinfo_list); + voip_calls_dlg_update(g_queue_peek_nth_link(voip_calls_get_info()->callsinfos, 0)); voip_calls_get_info()->redraw = FALSE; } } diff --git a/ui/qt/lbm_uimflow_dialog.cpp b/ui/qt/lbm_uimflow_dialog.cpp index faff6d8a26..8b04651766 100644 --- a/ui/qt/lbm_uimflow_dialog.cpp +++ b/ui/qt/lbm_uimflow_dialog.cpp @@ -152,7 +152,7 @@ static gboolean lbm_uimflow_add_to_graph(seq_analysis_info_t * seq_info, packet_ item->conv_num = (guint16)LBM_CHANNEL_ID(stream_info->channel); item->display = TRUE; item->line_style = 1; - seq_info->list = g_list_prepend(seq_info->list, (gpointer)item); + g_queue_push_tail(seq_info->items, item); return (TRUE); } @@ -178,11 +178,10 @@ static void lbm_uimflow_get_analysis(capture_file * cfile, seq_analysis_info_t * register_tap_listener("lbm_uim", (void *)seq_info, NULL, TL_REQUIRES_COLUMNS, NULL, lbm_uimflow_tap_packet, NULL); cf_retap_packets(cfile); - seq_info->list = g_list_reverse(seq_info->list); remove_tap_listener((void *)seq_info); /* Fill in the timestamps. */ - list = g_list_first(seq_info->list); + list = g_queue_peek_nth_link(seq_info->items, 0); while (list != NULL) { seq_analysis_item_t * seq_item = (seq_analysis_item_t *)list->data; @@ -506,7 +505,7 @@ void LBMUIMFlowDialog::fillDiagram(void) seq_analysis_info_t new_sa; new_sa = m_sequence_analysis; - new_sa.list = NULL; + new_sa.items = g_queue_new(); new_sa.ht = NULL; new_sa.num_nodes = 0; lbm_uimflow_get_analysis(m_capture_file, &new_sa); diff --git a/ui/qt/sequence_diagram.cpp b/ui/qt/sequence_diagram.cpp index 3caef3572b..8660c4295c 100644 --- a/ui/qt/sequence_diagram.cpp +++ b/ui/qt/sequence_diagram.cpp @@ -106,7 +106,7 @@ void SequenceDiagram::setData(seq_analysis_info_t *sainfo) QFontMetrics com_fm(comment_axis_->tickLabelFont()); int elide_w = com_fm.height() * max_comment_em_width_; - for (GList *cur = g_list_first(sainfo->list); cur; cur = g_list_next(cur)) { + for (GList *cur = g_queue_peek_nth_link(sainfo->items, 0); cur; cur = g_list_next(cur)) { seq_analysis_item_t *sai = (seq_analysis_item_t *) cur->data; new_data.key = cur_key; diff --git a/ui/qt/sequence_dialog.cpp b/ui/qt/sequence_dialog.cpp index 743fbb376b..68eb6013f0 100644 --- a/ui/qt/sequence_dialog.cpp +++ b/ui/qt/sequence_dialog.cpp @@ -346,7 +346,7 @@ void SequenceDialog::fillDiagram() seq_analysis_info_t new_sa; new_sa = seq_analysis_; - new_sa.list = NULL; + new_sa.items = g_queue_new(); new_sa.ht = NULL; new_sa.num_nodes = 0; sequence_analysis_list_get(cap_file_, &new_sa); diff --git a/ui/tap-sequence-analysis.c b/ui/tap-sequence-analysis.c index 459637ef5c..6b9e9d4933 100644 --- a/ui/tap-sequence-analysis.c +++ b/ui/tap-sequence-analysis.c @@ -129,7 +129,7 @@ seq_analysis_frame_packet( void *ptr, packet_info *pinfo, epan_dissect_t *edt _U sai->conv_num=0; sai->display=TRUE; - sainfo->list = g_list_prepend(sainfo->list, sai); + g_queue_push_tail(sainfo->items, sai); } return TRUE; @@ -195,18 +195,24 @@ seq_analysis_tcp_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt sai->conv_num = 0; sai->display = TRUE; - sainfo->list = g_list_prepend(sainfo->list, sai); + g_queue_push_tail(sainfo->items, sai); } return TRUE; } -void -sequence_analysis_list_get(capture_file *cf, seq_analysis_info_t *sainfo) +static void sequence_analysis_item_set_timestamp(gpointer data, gpointer user_data) { - GList *list; gchar time_str[COL_MAX_LEN]; + seq_analysis_item_t *seq_item = (seq_analysis_item_t *)data; + const struct epan_session *epan = (const struct epan_session *)user_data; + set_fd_time(epan, seq_item->fd, time_str); + seq_item->time_str = g_strdup(time_str); +} +void +sequence_analysis_list_get(capture_file *cf, seq_analysis_info_t *sainfo) +{ if (!cf || !sainfo) return; switch (sainfo->type) { @@ -234,42 +240,34 @@ sequence_analysis_list_get(capture_file *cf, seq_analysis_info_t *sainfo) } cf_retap_packets(cf); - sainfo->list = g_list_reverse(sainfo->list); remove_tap_listener(sainfo); /* Fill in the timestamps */ - list = g_list_first(sainfo->list); - while (list) - { - seq_analysis_item_t *seq_item = (seq_analysis_item_t *)list->data; - set_fd_time(cf->epan, seq_item->fd, time_str); - seq_item->time_str = g_strdup(time_str); - list = g_list_next(list); - } + g_queue_foreach(sainfo->items, sequence_analysis_item_set_timestamp, cf->epan); +} + + +static void sequence_analysis_item_free(gpointer data) +{ + seq_analysis_item_t *seq_item = (seq_analysis_item_t *)data; + g_free(seq_item->frame_label); + g_free(seq_item->time_str); + g_free(seq_item->comment); } void sequence_analysis_list_free(seq_analysis_info_t *sainfo) { - GList *list; int i; if (!sainfo) return; /* free the graph data items */ - list = g_list_first(sainfo->list); - while (list) - { - seq_analysis_item_t *seq_item = (seq_analysis_item_t *)list->data; - g_free(seq_item->frame_label); - g_free(seq_item->time_str); - g_free(seq_item->comment); - g_free(list->data); - list = g_list_next(list); - } - g_list_free(sainfo->list); - sainfo->list = NULL; + g_queue_free_full(sainfo->items, sequence_analysis_item_free); + + sainfo->items = NULL; sainfo->nconv = 0; + sainfo->items = g_queue_new(); for (i=0; inodes[i].type = AT_NONE; @@ -362,37 +360,33 @@ static gint add_or_get_node(seq_analysis_info_t *sainfo, address *node) { } } +struct sainfo_counter { + seq_analysis_info_t *sainfo; + int num_items; +}; + +static void sequence_analysis_get_nodes_item_proc(gpointer data, gpointer user_data) +{ + seq_analysis_item_t *gai = (seq_analysis_item_t *)data; + struct sainfo_counter *sc = (struct sainfo_counter *)user_data; + if (gai->display) { + (sc->num_items)++; + gai->src_node = (guint16)add_or_get_node(sc->sainfo, &(gai->src_addr)); + gai->dst_node = (guint16)add_or_get_node(sc->sainfo, &(gai->dst_addr)); + } +} + /* Get the nodes from the list */ /****************************************************************************/ int sequence_analysis_get_nodes(seq_analysis_info_t *sainfo) { - GList *list; - seq_analysis_item_t *gai; - int num_items = 0; + struct sainfo_counter sc = {sainfo, 0}; /* fill the node array */ - list = g_list_first(sainfo->list); - while (list) - { - gai = (seq_analysis_item_t *)list->data; - if (gai->display) { - num_items++; -#if 0 /* inverse is always false ? */ - if (!user_data->dlg.inverse) { -#endif - gai->src_node = (guint16)add_or_get_node(sainfo, &(gai->src_addr)); - gai->dst_node = (guint16)add_or_get_node(sainfo, &(gai->dst_addr)); -#if 0 /* inverse is always false ? */ - } else { - gai->dst_node = (guint16)add_or_get_node(sainfo, &(gai->src_addr)); - gai->src_node = (guint16)add_or_get_node(sainfo, &(gai->dst_addr)); - } -#endif - } - list = g_list_next(list); - } - return num_items; + g_queue_foreach(sainfo->items, sequence_analysis_get_nodes_item_proc, &sc); + + return sc.num_items; } /****************************************************************************/ @@ -428,7 +422,7 @@ sequence_analysis_dump_to_file(const char *pathname, seq_analysis_info_t *sainfo tmp_str2 = g_string_new(""); display_items = 0; - list = g_list_first(sainfo->list); + list = g_queue_peek_nth_link(sainfo->items, 0); while (list) { sai = (seq_analysis_item_t *)list->data; @@ -509,7 +503,7 @@ sequence_analysis_dump_to_file(const char *pathname, seq_analysis_info_t *sainfo * Draw the items */ - list = g_list_first(sainfo->list); + list = g_queue_peek_nth_link(sainfo->items, 0); while (list) { sai = (seq_analysis_item_t *)list->data; diff --git a/ui/tap-sequence-analysis.h b/ui/tap-sequence-analysis.h index d80a20aa5f..ab359d958f 100644 --- a/ui/tap-sequence-analysis.h +++ b/ui/tap-sequence-analysis.h @@ -71,7 +71,7 @@ typedef struct _seq_analysis_info { gboolean all_packets; /**< all packets vs only displayed */ gboolean any_addr; /**< any addr (DL+net) vs net-only */ int nconv; /**< number of conversations in the list */ - GList* list; /**< list with the graph analysis items */ + GQueue* items; /**< list with the graph analysis items */ GHashTable *ht; /**< hash table for retrieving graph analysis items */ address nodes[MAX_NUM_NODES]; /**< horizontal node list */ guint32 num_nodes; /**< actual number of nodes */ -- cgit v1.2.3