diff options
Diffstat (limited to 'ui/cli/tap-diameter-avp.c')
-rw-r--r-- | ui/cli/tap-diameter-avp.c | 200 |
1 files changed, 107 insertions, 93 deletions
diff --git a/ui/cli/tap-diameter-avp.c b/ui/cli/tap-diameter-avp.c index a4789737c0..7acc40922b 100644 --- a/ui/cli/tap-diameter-avp.c +++ b/ui/cli/tap-diameter-avp.c @@ -53,13 +53,13 @@ void register_tap_listener_diameteravp(void); /* used to keep track of the statistics for an entire program interface */ typedef struct _diameteravp_t { - guint32 frame; - guint32 diammsg_toprocess; - guint32 cmd_code; - guint32 req_count; - guint32 ans_count; - guint32 paired_ans_count; - gchar* filter; + guint32 frame; + guint32 diammsg_toprocess; + guint32 cmd_code; + guint32 req_count; + guint32 ans_count; + guint32 paired_ans_count; + gchar *filter; } diameteravp_t; /* Copied from proto.c */ @@ -84,36 +84,37 @@ tree_traverse_pre_order(proto_tree *tree, proto_tree_traverse_func func, gpointe } static gboolean -diam_tree_to_csv(proto_node* node, gpointer data) +diam_tree_to_csv(proto_node *node, gpointer data) { - char* val_str=NULL; - char* val_tmp=NULL; - ftenum_t ftype; - field_info* fi; - header_field_info *hfi; - if(!node) { - fprintf(stderr,"traverse end: empty node. node='%p' data='%p'\n",(void *)node,(void *)data); + char *val_str = NULL; + char *val_tmp = NULL; + ftenum_t ftype; + field_info *fi; + header_field_info *hfi; + + if (!node) { + fprintf(stderr, "traverse end: empty node. node='%p' data='%p'\n", (void *)node, (void *)data); return FALSE; } - fi=node->finfo; - hfi=fi ? fi->hfinfo : NULL; - if(!hfi) { - fprintf(stderr,"traverse end: hfi not found. node='%p'\n",(void *)node); + fi = node->finfo; + hfi = fi ? fi->hfinfo : NULL; + if (!hfi) { + fprintf(stderr, "traverse end: hfi not found. node='%p'\n", (void *)node); return FALSE; } - ftype=fvalue_type_ftenum(&fi->value); - if (ftype!=FT_NONE&&ftype!=FT_PROTOCOL) { + ftype = fvalue_type_ftenum(&fi->value); + if (ftype != FT_NONE && ftype != FT_PROTOCOL) { /* convert value to string */ - val_tmp=fvalue_to_string_repr(&fi->value,FTREPR_DISPLAY,NULL); - if(val_tmp) + val_tmp = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, NULL); + if (val_tmp) { - val_str=ep_strdup(val_tmp); + val_str = ep_strdup(val_tmp); g_free(val_tmp); } else - val_str=ep_strdup_printf("unsupported type: %s",ftype_name(ftype)); + val_str = ep_strdup_printf("unsupported type: %s", ftype_name(ftype)); - /*printf("traverse: name='%s', abbrev='%s',desc='%s', val='%s'\n",hfi->name,hfi->abbrev,ftype_name(hfi->type),val_str);*/ - printf("%s='%s' ",hfi->name,val_str); + /*printf("traverse: name='%s', abbrev='%s',desc='%s', val='%s'\n", hfi->name, hfi->abbrev, ftype_name(hfi->type), val_str);*/ + printf("%s='%s' ", hfi->name, val_str); } return FALSE; } @@ -122,47 +123,47 @@ static int diameteravp_packet(void *pds, packet_info *pinfo, epan_dissect_t *edt _U_, const void *pdi) { int ret = 0; - double resp_time=0.; - gboolean is_request=TRUE; - guint32 cmd_code=0; - guint32 req_frame=0; - guint32 ans_frame=0; - guint32 diam_child_node=0; - proto_node* current=NULL; - proto_node* node = NULL; - header_field_info* hfi=NULL; - field_info* finfo=NULL; - const diameter_req_ans_pair_t* dp=(const diameter_req_ans_pair_t*)pdi; - diameteravp_t *ds=NULL; + double resp_time = 0.; + gboolean is_request = TRUE; + guint32 cmd_code = 0; + guint32 req_frame = 0; + guint32 ans_frame = 0; + guint32 diam_child_node = 0; + proto_node *current = NULL; + proto_node *node = NULL; + header_field_info *hfi = NULL; + field_info *finfo = NULL; + const diameter_req_ans_pair_t *dp = (const diameter_req_ans_pair_t *)pdi; + diameteravp_t *ds = NULL; /* Validate paramerers. */ - if(!dp || !edt || !edt->tree) + if (!dp || !edt || !edt->tree) return ret; /* Several diameter messages within one frame are possible. * * Check if we processing the message in same frame like befor or in new frame.*/ - ds=(diameteravp_t *)pds; - if(pinfo->fd->num > ds->frame) { - ds->frame=pinfo->fd->num; - ds->diammsg_toprocess=0; + ds = (diameteravp_t *)pds; + if (pinfo->fd->num > ds->frame) { + ds->frame = pinfo->fd->num; + ds->diammsg_toprocess = 0; } else { - ds->diammsg_toprocess+=1; + ds->diammsg_toprocess += 1; } /* Extract data from request/answer pair provided by diameter dissector.*/ - is_request=dp->processing_request; - cmd_code=dp->cmd_code; - req_frame=dp->req_frame; - ans_frame=dp->ans_frame; - if(!is_request) { + is_request = dp->processing_request; + cmd_code = dp->cmd_code; + req_frame = dp->req_frame; + ans_frame = dp->ans_frame; + if (!is_request) { nstime_t ns; nstime_delta(&ns, &pinfo->fd->abs_ts, &dp->req_time); - resp_time=nstime_to_sec(&ns); - resp_time=resp_time<0?0.:resp_time; + resp_time = nstime_to_sec(&ns); + resp_time = resp_time < 0. ? 0. : resp_time; } /* Check command code provided by command line option.*/ - if (ds->cmd_code && ds->cmd_code!=cmd_code) + if (ds->cmd_code && ds->cmd_code != cmd_code) return ret; /* Loop over top level nodes */ @@ -170,28 +171,28 @@ diameteravp_packet(void *pds, packet_info *pinfo, epan_dissect_t *edt _U_, const while (node != NULL) { current = node; node = current->next; - finfo=current->finfo; - hfi=finfo ? finfo->hfinfo : NULL; - /*fprintf(stderr,"DEBUG: diameteravp_packet %d %p %p node=%p abbrev=%s\n",cmd_code,edt,edt->tree,current,hfi->abbrev);*/ + finfo = current->finfo; + hfi = finfo ? finfo->hfinfo : NULL; + /*fprintf(stderr, "DEBUG: diameteravp_packet %d %p %p node=%p abbrev=%s\n", cmd_code, edt, edt->tree, current, hfi->abbrev);*/ /* process current diameter subtree in the current frame. */ - if(hfi && hfi->abbrev && strcmp(hfi->abbrev,"diameter")==0) { + if (hfi && hfi->abbrev && strcmp(hfi->abbrev, "diameter") == 0) { /* Process current diameter message in the frame */ - if (ds->diammsg_toprocess==diam_child_node) { - if(is_request) { + if (ds->diammsg_toprocess == diam_child_node) { + if (is_request) { ds->req_count++; } else { ds->ans_count++; - if (req_frame>0) + if (req_frame > 0) ds->paired_ans_count++; } /* Output frame data.*/ printf("frame='%d' time='%f' src='%s' srcport='%d' dst='%s' dstport='%d' proto='diameter' msgnr='%d' is_request='%d' cmd='%d' req_frame='%d' ans_frame='%d' resp_time='%f' ", - pinfo->fd->num,nstime_to_sec(&pinfo->fd->abs_ts),ep_address_to_str(&pinfo->src),pinfo->srcport,ep_address_to_str(&pinfo->dst), pinfo->destport,ds->diammsg_toprocess,is_request,cmd_code,req_frame,ans_frame,resp_time); + pinfo->fd->num, nstime_to_sec(&pinfo->fd->abs_ts), ep_address_to_str(&pinfo->src), pinfo->srcport, ep_address_to_str(&pinfo->dst), pinfo->destport, ds->diammsg_toprocess, is_request, cmd_code, req_frame, ans_frame, resp_time); /* Visit selected nodes of one diameter message.*/ tree_traverse_pre_order(current, diam_tree_to_csv, &ds); /* End of message.*/ printf("\n"); - /*printf("hfi: name='%s', msg_curr='%d' abbrev='%s',type='%s'\n",hfi->name,diam_child_node,hfi->abbrev,ftype_name(hfi->type));*/ + /*printf("hfi: name='%s', msg_curr='%d' abbrev='%s',type='%s'\n", hfi->name, diam_child_node, hfi->abbrev, ftype_name(hfi->type));*/ } diam_child_node++; } @@ -200,62 +201,62 @@ diameteravp_packet(void *pds, packet_info *pinfo, epan_dissect_t *edt _U_, const } static void -diameteravp_draw(void* pds) +diameteravp_draw(void *pds) { - diameteravp_t *ds=(diameteravp_t *)pds; + diameteravp_t *ds = (diameteravp_t *)pds; /* printing results */ - printf("=== Diameter Summary ===\nrequset count:\t%d\nanswer count:\t%d\nreq/ans pairs:\t%d\n",ds->req_count,ds->ans_count,ds->paired_ans_count); + printf("=== Diameter Summary ===\nrequset count:\t%d\nanswer count:\t%d\nreq/ans pairs:\t%d\n", ds->req_count, ds->ans_count, ds->paired_ans_count); } static void -diameteravp_init(const char *opt_arg, void* userdata _U_) +diameteravp_init(const char *opt_arg, void *userdata _U_) { - diameteravp_t *ds; - gchar* field=NULL; - gchar** tokens; - guint opt_count=0; - guint opt_idx=0; - GString* filter=NULL; - GString* error_string=NULL; + diameteravp_t *ds; + gchar *field = NULL; + gchar **tokens; + guint opt_count = 0; + guint opt_idx = 0; + GString *filter = NULL; + GString *error_string = NULL; - ds=g_new(diameteravp_t,1); - ds->frame=0; - ds->diammsg_toprocess=0; - ds->cmd_code=0; - ds->req_count=0; - ds->ans_count=0; - ds->paired_ans_count=0; - ds->filter=NULL; + ds = g_new(diameteravp_t, 1); + ds->frame = 0; + ds->diammsg_toprocess = 0; + ds->cmd_code = 0; + ds->req_count = 0; + ds->ans_count = 0; + ds->paired_ans_count = 0; + ds->filter = NULL; - filter=g_string_new("diameter"); + filter = g_string_new("diameter"); /* Split command line options. */ - tokens = g_strsplit(opt_arg,",", 1024); - opt_count=0; + tokens = g_strsplit(opt_arg, ",", 1024); + opt_count = 0; while (tokens[opt_count]) opt_count++; - if (opt_count>2) - ds->cmd_code=(guint32)atoi(tokens[2]); + if (opt_count > 2) + ds->cmd_code = (guint32)atoi(tokens[2]); /* Loop over diameter field names. */ - for(opt_idx=3;opt_idx<opt_count;opt_idx++) + for (opt_idx=3; opt_idx<opt_count; opt_idx++) { /* Current field from command line arguments. */ - field=tokens[opt_idx]; + field = tokens[opt_idx]; /* Connect all requested fields with logical OR. */ - g_string_append(filter,"||"); + g_string_append(filter, "||"); /* Prefix field name with "diameter." by default. */ - if(!strchr(field,'.')) + if (!strchr(field, '.')) g_string_append(filter, "diameter."); /* Append field name to the filter. */ g_string_append(filter, field); } g_strfreev(tokens); - ds->filter=g_string_free(filter,FALSE); + ds->filter = g_string_free(filter, FALSE); - error_string=register_tap_listener("diameter", ds, ds->filter, 0, NULL, diameteravp_packet, diameteravp_draw); - if(error_string){ + error_string = register_tap_listener("diameter", ds, ds->filter, 0, NULL, diameteravp_packet, diameteravp_draw); + if (error_string) { /* error, we failed to attach to the tap. clean up */ g_free(ds); @@ -273,3 +274,16 @@ register_tap_listener_diameteravp(void) register_stat_cmd_arg("diameter,avp", diameteravp_init, NULL); } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 8 + * tab-width: 8 + * indent-tabs-mode: t + * End: + * + * vi: set shiftwidth=8 tabstop=8 noexpandtab: + * :indentSize=8:tabSize=8:noTabs=false: + */ |