Make dissection of AVP: 3GPP-User-Location-Info(22) l=15 f=V-- vnd=TGPP val=303231...
[obnox/wireshark/wip.git] / tap-gsm_astat.c
index d5096d47dc2f41a30469d2c2ef776e9f9cd07e07..cd523aff6712a320f2344132f8aa6d15f02db0c9 100644 (file)
@@ -5,8 +5,8 @@
  *
  * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * 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
 #include "epan/packet_info.h"
 #include "epan/value_string.h"
 #include <epan/tap.h>
+#include <epan/stat_cmd_args.h>
 #include <epan/dissectors/packet-bssap.h>
-#include <epan/dissectors/packet-gsm_a.h>
-#include "stat.h"
-#include "register.h"
+#include <epan/dissectors/packet-gsm_a_common.h>
 
 
 typedef struct _gsm_a_stat_t {
@@ -57,6 +56,8 @@ typedef struct _gsm_a_stat_t {
     int                dtap_sms_message_type[0xff];
     int                dtap_sm_message_type[0xff];
     int                dtap_ss_message_type[0xff];
+    int                dtap_tp_message_type[0xff];
+    int                sacch_rr_message_type[0xff];
 } gsm_a_stat_t;
 
 
@@ -100,6 +101,9 @@ gsm_a_stat_packet(
        case PD_SS:
            stat_p->dtap_ss_message_type[tap_p->message_type]++;
            break;
+       case PD_TP:
+           stat_p->dtap_tp_message_type[tap_p->message_type]++;
+           break;
        default:
            /*
             * unsupported PD
@@ -108,6 +112,19 @@ gsm_a_stat_packet(
        }
        break;
 
+   case GSM_A_PDU_TYPE_SACCH:
+   switch (tap_p->protocol_disc)
+   {
+   case 0:
+      stat_p->sacch_rr_message_type[tap_p->message_type]++;
+      break;
+   default:
+      /* unknown Short PD */
+      break;
+   }
+   break;
+
+
     default:
        /*
         * unknown PDU type !!!
@@ -265,12 +282,46 @@ gsm_a_stat_draw(
        i++;
     }
 
+    printf("\nDTAP %s\n", gsm_a_pd_str[PD_TP]);
+    printf("Message (ID)Type                                        Number\n");
+
+    i = 0;
+    while (gsm_a_dtap_msg_tp_strings[i].strptr)
+    {
+       if (stat_p->dtap_tp_message_type[gsm_a_dtap_msg_tp_strings[i].value] > 0)
+       {
+           printf("0x%02x  %-50s%d\n",
+               gsm_a_dtap_msg_tp_strings[i].value,
+               gsm_a_dtap_msg_tp_strings[i].strptr,
+               stat_p->dtap_tp_message_type[gsm_a_dtap_msg_tp_strings[i].value]);
+       }
+
+       i++;
+    }
+
+    printf("\nSACCH Radio Resources Management messages\n");
+    printf("Message (ID)Type                                        Number\n");
+
+    i = 0;
+    while (gsm_a_sacch_msg_rr_strings[i].strptr)
+    {
+       if (stat_p->sacch_rr_message_type[gsm_a_sacch_msg_rr_strings[i].value] > 0)
+       {
+           printf("0x%02x  %-50s%d\n",
+               gsm_a_sacch_msg_rr_strings[i].value,
+               gsm_a_sacch_msg_rr_strings[i].strptr,
+               stat_p->sacch_rr_message_type[gsm_a_sacch_msg_rr_strings[i].value]);
+       }
+
+       i++;
+    }
+
     printf("==============================================================\n");
 }
 
 
 static void
-gsm_a_stat_init(const char *optarg _U_)
+gsm_a_stat_init(const char *optarg _U_,void* userdata _U_)
 {
     gsm_a_stat_t       *stat_p;
     GString            *err_p;
@@ -280,7 +331,7 @@ gsm_a_stat_init(const char *optarg _U_)
     memset(stat_p, 0, sizeof(gsm_a_stat_t));
 
     err_p =
-       register_tap_listener("gsm_a", stat_p, NULL,
+       register_tap_listener("gsm_a", stat_p, NULL, 0,
            NULL,
            gsm_a_stat_packet,
            gsm_a_stat_draw);
@@ -298,5 +349,5 @@ gsm_a_stat_init(const char *optarg _U_)
 void
 register_tap_listener_gsm_astat(void)
 {
-    register_stat_cmd_arg("gsm_a,", gsm_a_stat_init);
+    register_stat_cmd_arg("gsm_a,", gsm_a_stat_init,NULL);
 }