aboutsummaryrefslogtreecommitdiffstats
path: root/tap-camelcounter.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2006-10-03 22:12:47 +0000
committerAnders Broman <anders.broman@ericsson.com>2006-10-03 22:12:47 +0000
commitad50bdf507d4b93b5b5eb31365d2620245d00d91 (patch)
tree5619b3f4bb88076372c479657d0b8bcd490cfb91 /tap-camelcounter.c
parent8a60a1006ba395c17a23d2ca97a071ef85e07d2c (diff)
From Florent.Drouin@alcatel.fr:
Please find two new TAP for Camel Statistics. The first one updates counters related to camel operations. It is located in the GSM submenu. The second one , named Camel Service Response Time, gives the time ellapsed between a couple of camel specifics operations. (For example InitialDP/Continue or InitialDP GPRS/Continue GPRS). With Wireshark, you can have the Min/Max/Mean delay time for your traces files, and with Tshark, you have the additional information for percentile (1%,95% 99% etc ) To enable the use of the Camel statistics, you have 2 new parameters in the preferences, - SRT, enable the service Response Time calculation. - persistentSRT, keep the data in a context, even after the camel session has been closed. This is mandatory with Wireshark, to have a clean display of the stats. Only the new files checked in for now because of include problems. svn path=/trunk/; revision=19420
Diffstat (limited to 'tap-camelcounter.c')
-rw-r--r--tap-camelcounter.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/tap-camelcounter.c b/tap-camelcounter.c
new file mode 100644
index 0000000000..b5ab177d15
--- /dev/null
+++ b/tap-camelcounter.c
@@ -0,0 +1,146 @@
+/* tap_camelcounter.c
+ * camel message counter for tshark
+ * Copyright 2006 Florent DROUIN
+ * This part of code is extracted from tap-h225counter.c from Lars Roland
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#include <string.h>
+#include "epan/packet_info.h"
+#include "epan/tap.h"
+#include "epan/value_string.h"
+#include "register.h"
+#include "epan/stat_cmd_args.h"
+#include "epan/camel-persistentdata.h"
+
+void register_tap_listener_camelcounter(void);
+
+/* used to keep track of the statistics for an entire program interface */
+struct camelcounter_t {
+ char *filter;
+ guint32 camel_msg[camel_MAX_NUM_OPR_CODES];
+};
+
+
+static void camelcounter_reset(void *phs)
+{
+ struct camelcounter_t * p_counter= ( struct camelcounter_t *) phs;
+ memset(p_counter,0,sizeof(struct camelcounter_t));
+}
+
+static int camelcounter_packet(void *phs,
+ packet_info *pinfo _U_,
+ epan_dissect_t *edt _U_,
+ const void *phi)
+{
+ struct camelcounter_t * p_counter =(struct camelcounter_t *)phs;
+ const struct camelsrt_info_t * pi=phi;
+ if (pi->opcode != 255)
+ p_counter->camel_msg[pi->opcode]++;
+
+ return 1;
+}
+
+
+static void camelcounter_draw(void *phs)
+{
+ struct camelcounter_t * p_counter= (struct camelcounter_t *)phs;
+ int i;
+ printf("\n");
+ printf("CAMEL Message and Response Status Counter:\n");
+ printf("------------------------------------------\n");
+
+ for(i=0;i<camel_MAX_NUM_OPR_CODES;i++) {
+ /* Message counter */
+ if(p_counter->camel_msg[i]!=0) {
+ printf("%30s ", val_to_str(i,camel_opr_code_strings,"Unknown message "));
+ printf("%6d\n", p_counter->camel_msg[i]);
+ }
+ } /* Message Type */
+ printf("------------------------------------------\n");
+}
+
+static void camelcounter_init(const char *optarg, void* userdata _U_)
+{
+ struct camelcounter_t *p_camelcounter;
+ const char *filter=NULL;
+ const char *emptyfilter="";
+ GString *error_string;
+
+ if(!strncmp(optarg,"camel,counter,",13)){
+ filter=optarg+13;
+ } else {
+ filter=NULL;
+ }
+
+ p_camelcounter = g_malloc(sizeof(struct camelcounter_t));
+ if(filter){
+ p_camelcounter->filter=g_malloc(strlen(filter)+1);
+ strcpy(p_camelcounter->filter,filter);
+ } else {
+ p_camelcounter->filter=NULL;
+ }
+
+ camelcounter_reset(p_camelcounter);
+
+ if (filter) {
+ error_string=register_tap_listener("CAMEL",
+ p_camelcounter,
+ filter,
+ NULL,
+ camelcounter_packet,
+ camelcounter_draw);
+ } else {
+ error_string=register_tap_listener("CAMEL",
+ p_camelcounter,
+ emptyfilter,
+ NULL,
+ camelcounter_packet,
+ camelcounter_draw);
+ }
+
+ if(error_string){
+ /* error, we failed to attach to the tap. clean up */
+ g_free(p_camelcounter->filter);
+ g_free(p_camelcounter);
+
+ fprintf(stderr, "tshark: Couldn't register camel,counter tap: %s\n",
+ error_string->str);
+ g_string_free(error_string, TRUE);
+ exit(1);
+ }
+}
+
+
+void /* Next line mandatory */
+register_tap_listener_camelcounter(void)
+{
+ register_stat_cmd_arg("camel,counter", camelcounter_init, NULL);
+}