From 1d4f630589e3faa1be659b8eefad9841f588036a Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Wed, 14 Mar 2012 16:46:59 +0000 Subject: [PATCH] voip_calls.c Use the hastable instead, we should do away with the list. graph_analysis.h Doxygen changes. svn path=/trunk/; revision=41545 --- ui/gtk/graph_analysis.h | 62 +++++++++++++++++++------------------- ui/gtk/voip_calls.c | 67 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 33 deletions(-) diff --git a/ui/gtk/graph_analysis.h b/ui/gtk/graph_analysis.h index 8643a15443..e45e4cd72d 100644 --- a/ui/gtk/graph_analysis.h +++ b/ui/gtk/graph_analysis.h @@ -37,51 +37,51 @@ #define MAX_NUM_NODES 40 -/* defines an entry in for the graph analysis */ +/** defines an entry for the graph analysis */ typedef struct _graph_analysis_item { - frame_data *fd; /* Holds the frame number and time information */ + frame_data *fd; /**< Holds the frame number and time information */ address src_addr; guint16 port_src; address dst_addr; guint16 port_dst; - gchar *frame_label; /* the label on top of the arrow */ - gchar *comment; /* a comment that appears at the left of the graph */ - guint16 conv_num; /* the conversation number, each conversation will be colored */ - gboolean display; /* indicate if the packet is displayed or not in the graph */ - guint16 src_node; /* this is used by graph_analysis.c to identify the node */ - guint16 dst_node; /* a node is an IP address that will be displayed in columns */ - guint16 line_style; /* the arrow line width in pixels*/ + gchar *frame_label; /**< the label on top of the arrow */ + gchar *comment; /**< a comment that appears at the left of the graph */ + guint16 conv_num; /**< the conversation number, each conversation will be colored */ + gboolean display; /**< indicate if the packet is displayed or not in the graph */ + guint16 src_node; /**< this is used by graph_analysis.c to identify the node */ + guint16 dst_node; /**< a node is an IP address that will be displayed in columns */ + guint16 line_style; /**< the arrow line width in pixels*/ } graph_analysis_item_t; -/* defines the graph analysis structure */ +/** defines the graph analysis structure */ typedef struct _graph_analysis_info { - int nconv; /* number of conversations in the list */ - GList* list; /* list with the graph analysis items */ - GHashTable *ht; /* hash table for retrieving graph analysis items */ + int nconv; /**< number of conversations in the list */ + GList* list; /**< list with the graph analysis items */ + GHashTable *ht; /**< hash table for retrieving graph analysis items */ } graph_analysis_info_t; -/* max number of nodes to display, each node will be an IP address */ +/** max number of nodes to display, each node will be an IP address */ #define MAX_NUM_COL_CONV 10 #define NODE_OVERFLOW MAX_NUM_NODES+1 #define NUM_DISPLAY_ITEMS 1000 typedef struct _display_items { - frame_data *fd; /* Holds the frame number and time information */ + frame_data *fd; /**< Holds the frame number and time information */ guint16 port_src; guint16 port_dst; - gchar *frame_label; /* the label on top of the arrow */ - gchar *comment; /* a comment that appears at the left of the graph */ - guint16 conv_num; /* the conversation number, each conversation will be colored */ - guint16 src_node; /* this is used by graph_analysis.c to identify the node */ - guint16 dst_node; /* a node is an IP address that will be displayed in columns */ - guint16 line_style; /* the arrow line width in pixels*/ + gchar *frame_label; /**< the label on top of the arrow */ + gchar *comment; /**< a comment that appears at the left of the graph */ + guint16 conv_num; /**< the conversation number, each conversation will be colored */ + guint16 src_node; /**< this is used by graph_analysis.c to identify the node */ + guint16 dst_node; /**< a node is an IP address that will be displayed in columns */ + guint16 line_style; /**< the arrow line width in pixels*/ } display_items_t; typedef struct _graph_analysis_dialog_data_t { GtkWidget *window; GtkWidget *parent_w; gboolean needs_redraw; - gboolean inverse; /* set the nodes in reverse mode as "dst <---- src" instead of "src ----> dst"*/ + gboolean inverse; /**< set the nodes in reverse mode as "dst <---- src" instead of "src ----> dst"*/ gint selected_row; GtkWidget *draw_area_time; GtkWidget *draw_area; @@ -103,29 +103,29 @@ typedef struct _graph_analysis_dialog_data_t { GtkWidget *hpane; int surface_width; int surface_height; - guint16 first_node; /* the first node on the left to show in the screen */ - guint32 first_item; /* the first item (row) to show from the top */ - guint32 selected_item; /* the selected item */ + guint16 first_node; /**< the first node on the left to show in the screen */ + guint32 first_item; /**< the first item (row) to show from the top */ + guint32 selected_item; /**< the selected item */ display_items_t items[NUM_DISPLAY_ITEMS]; guint32 left_x_border; char *save_file; - char *title; /* Graph analysis window's title */ + char *title; /**< Graph analysis window's title */ } graph_analysis_dialog_data_t; typedef void (*destroy_user_data_cb)(void *data); -/* structure that holds general information and the dialog */ +/** structure that holds general information and the dialog */ typedef struct _graph_analysis_data_t { - /* graphic data */ + /**> graphic data */ graph_analysis_info_t *graph_info; - /* dialog associated data */ + /**> dialog associated data */ graph_analysis_dialog_data_t dlg; address nodes[MAX_NUM_NODES]; guint32 num_nodes; guint32 num_items; - destroy_user_data_cb on_destroy_user_data; /* callback info for destroy */ - void *data; /* data to be passes when on destroy */ + destroy_user_data_cb on_destroy_user_data; /**< callback info for destroy */ + void *data; /**< data to be passes when on destroy */ } graph_analysis_data_t; graph_analysis_data_t* graph_analysis_init(void); diff --git a/ui/gtk/voip_calls.c b/ui/gtk/voip_calls.c index ca0637b98e..4410ed7ec2 100644 --- a/ui/gtk/voip_calls.c +++ b/ui/gtk/voip_calls.c @@ -385,6 +385,7 @@ static void insert_to_graph_t38(voip_calls_tapinfo_t *tapinfo _U_, packet_info * gai = 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_hash_table_insert(tapinfo->graph_analysis->ht, &new_gai->fd->num, new_gai); inserted = TRUE; break; } @@ -392,7 +393,10 @@ static void insert_to_graph_t38(voip_calls_tapinfo_t *tapinfo _U_, packet_info * item_num++; } - if (!inserted) tapinfo->graph_analysis->list = g_list_prepend(tapinfo->graph_analysis->list, new_gai); + if (!inserted){ + tapinfo->graph_analysis->list = g_list_prepend(tapinfo->graph_analysis->list, new_gai); + g_hash_table_insert(tapinfo->graph_analysis->ht, &new_gai->fd->num, new_gai); + } } /****************************************************************************/ @@ -588,6 +592,65 @@ RTP_packet(void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt _U_, void cons /****************************************************************************/ /* whenever a redraw in the RTP tap listener */ static void RTP_packet_draw(void *prs _U_) +{ + voip_rtp_tapinfo_t *rtp_tapinfo = &the_tapinfo_rtp_struct; + GList *rtp_streams_list; + voip_rtp_stream_info_t *rtp_listinfo; + GList *voip_calls_graph_list; + graph_analysis_item_t *gai; + graph_analysis_item_t *new_gai; + guint16 conv_num; + guint32 duration; + + /* add each rtp stream to the graph */ + rtp_streams_list = g_list_first(rtp_tapinfo->list); + while (rtp_streams_list) + { + 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); + + gai = g_hash_table_lookup(the_tapinfo_struct.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 = g_hash_table_lookup(the_tapinfo_struct.graph_analysis->ht, &rtp_listinfo->start_fd->num); + if(gai != NULL){ + duration = (guint32)(nstime_to_msec(&rtp_listinfo->stop_fd->rel_ts) - nstime_to_msec(&rtp_listinfo->start_fd->rel_ts)); + g_free(gai->comment); + gai->comment = g_strdup_printf("%s Num packets:%u Duration:%u.%03us SSRC:0x%X", + (rtp_listinfo->is_srtp)?"SRTP":"RTP", rtp_listinfo->npackets, + duration/1000,(duration%1000), rtp_listinfo->ssrc); + }else{ + new_gai = g_malloc(sizeof(graph_analysis_item_t)); + new_gai->fd = rtp_listinfo->start_fd; + COPY_ADDRESS(&(new_gai->src_addr),&(rtp_listinfo->src_addr)); + COPY_ADDRESS(&(new_gai->dst_addr),&(rtp_listinfo->dest_addr)); + new_gai->port_src = rtp_listinfo->src_port; + new_gai->port_dst = rtp_listinfo->dest_port; + duration = (guint32)(nstime_to_msec(&rtp_listinfo->stop_fd->rel_ts) - nstime_to_msec(&rtp_listinfo->start_fd->rel_ts)); + new_gai->frame_label = g_strdup_printf("%s (%s) %s", + (rtp_listinfo->is_srtp)?"SRTP":"RTP", + rtp_listinfo->pt_str, + (rtp_listinfo->rtp_event == -1)? + "":val_to_str_const(rtp_listinfo->rtp_event, rtp_event_type_values, "Unknown RTP Event")); + new_gai->comment = g_strdup_printf("%s Num packets:%u Duration:%u.%03us SSRC:0x%X", + (rtp_listinfo->is_srtp)?"SRTP":"RTP", rtp_listinfo->npackets, + duration/1000,(duration%1000), rtp_listinfo->ssrc); + new_gai->conv_num = conv_num; + 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); + } + } + rtp_streams_list = g_list_next(rtp_streams_list); + }/* while (rtp_streams_list) */ +} +#if 0 +static void RTP_packet_draw(void *prs _U_) { voip_rtp_tapinfo_t *rtp_tapinfo = &the_tapinfo_rtp_struct; GList *rtp_streams_list; @@ -664,7 +727,7 @@ static void RTP_packet_draw(void *prs _U_) rtp_streams_list = g_list_next(rtp_streams_list); } } - +#endif static gboolean have_RTP_tap_listener=FALSE; /****************************************************************************/ void