2 * h225 message counter for wireshark
3 * Copyright 2003 Lars Roland
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include "epan/packet.h"
33 #include "epan/packet_info.h"
35 #include <epan/stat_cmd_args.h>
36 #include "epan/value_string.h"
37 #include <epan/dissectors/packet-h225.h>
39 /* following values represent the size of their valuestring arrays */
41 #define RAS_MSG_TYPES 33
42 #define CS_MSG_TYPES 13
45 #define RRJ_REASONS 18
48 #define ARJ_REASONS 22
52 #define LRJ_REASONS 16
53 #define IRQNAK_REASONS 4
54 #define REL_CMP_REASONS 26
55 #define FACILITY_REASONS 11
57 void register_tap_listener_h225counter(void);
59 /* used to keep track of the statistics for an entire program interface */
60 typedef struct _h225counter_t
{
62 guint32 ras_msg
[RAS_MSG_TYPES
+ 1];
63 guint32 cs_msg
[CS_MSG_TYPES
+ 1];
64 guint32 grj_reason
[GRJ_REASONS
+ 1];
65 guint32 rrj_reason
[RRJ_REASONS
+ 1];
66 guint32 urq_reason
[URQ_REASONS
+ 1];
67 guint32 urj_reason
[URJ_REASONS
+ 1];
68 guint32 arj_reason
[ARJ_REASONS
+ 1];
69 guint32 brj_reason
[BRJ_REASONS
+ 1];
70 guint32 drq_reason
[DRQ_REASONS
+ 1];
71 guint32 drj_reason
[DRJ_REASONS
+ 1];
72 guint32 lrj_reason
[LRJ_REASONS
+ 1];
73 guint32 irqnak_reason
[IRQNAK_REASONS
+ 1];
74 guint32 rel_cmp_reason
[REL_CMP_REASONS
+ 1];
75 guint32 facility_reason
[FACILITY_REASONS
+ 1];
80 h225counter_reset(void *phs
)
82 h225counter_t
*hs
=(h225counter_t
*)phs
;
83 char *save_filter
= hs
->filter
;
85 memset(hs
, 0, sizeof(h225counter_t
));
87 hs
->filter
= save_filter
;
91 h225counter_packet(void *phs
, packet_info
*pinfo _U_
, epan_dissect_t
*edt _U_
, const void *phi
)
93 h225counter_t
*hs
=(h225counter_t
*)phs
;
94 const h225_packet_info
*pi
=(const h225_packet_info
*)phi
;
96 switch (pi
->msg_type
) {
99 if(pi
->msg_tag
==-1) { /* uninitialized */
102 else if (pi
->msg_tag
>= RAS_MSG_TYPES
) { /* unknown */
103 hs
->ras_msg
[RAS_MSG_TYPES
]++;
106 hs
->ras_msg
[pi
->msg_tag
]++;
109 /* Look for reason tag */
110 if(pi
->reason
==-1) { /* uninitialized */
114 switch(pi
->msg_tag
) {
117 if(pi
->reason
< GRJ_REASONS
)
118 hs
->grj_reason
[pi
->reason
]++;
120 hs
->grj_reason
[GRJ_REASONS
]++;
123 if(pi
->reason
< RRJ_REASONS
)
124 hs
->rrj_reason
[pi
->reason
]++;
126 hs
->rrj_reason
[RRJ_REASONS
]++;
129 if(pi
->reason
< URQ_REASONS
)
130 hs
->urq_reason
[pi
->reason
]++;
132 hs
->urq_reason
[URQ_REASONS
]++;
135 if(pi
->reason
< URJ_REASONS
)
136 hs
->urj_reason
[pi
->reason
]++;
138 hs
->urj_reason
[URJ_REASONS
]++;
141 if(pi
->reason
< ARJ_REASONS
)
142 hs
->arj_reason
[pi
->reason
]++;
144 hs
->arj_reason
[ARJ_REASONS
]++;
147 if(pi
->reason
< BRJ_REASONS
)
148 hs
->brj_reason
[pi
->reason
]++;
150 hs
->brj_reason
[BRJ_REASONS
]++;
153 if(pi
->reason
< DRQ_REASONS
)
154 hs
->drq_reason
[pi
->reason
]++;
156 hs
->drq_reason
[DRQ_REASONS
]++;
159 if(pi
->reason
< DRJ_REASONS
)
160 hs
->drj_reason
[pi
->reason
]++;
162 hs
->drj_reason
[DRJ_REASONS
]++;
165 if(pi
->reason
< LRJ_REASONS
)
166 hs
->lrj_reason
[pi
->reason
]++;
168 hs
->lrj_reason
[LRJ_REASONS
]++;
170 case 29: /* IRQ Nak */
171 if(pi
->reason
< IRQNAK_REASONS
)
172 hs
->irqnak_reason
[pi
->reason
]++;
174 hs
->irqnak_reason
[IRQNAK_REASONS
]++;
185 if(pi
->msg_tag
==-1) { /* uninitialized */
188 else if (pi
->msg_tag
>= CS_MSG_TYPES
) { /* unknown */
189 hs
->cs_msg
[CS_MSG_TYPES
]++;
192 hs
->cs_msg
[pi
->msg_tag
]++;
195 /* Look for reason tag */
196 if(pi
->reason
==-1) { /* uninitialized */
200 switch(pi
->msg_tag
) {
202 case 5: /* ReleaseComplete */
203 if(pi
->reason
< REL_CMP_REASONS
)
204 hs
->rel_cmp_reason
[pi
->reason
]++;
206 hs
->rel_cmp_reason
[REL_CMP_REASONS
]++;
208 case 6: /* Facility */
209 if(pi
->reason
< FACILITY_REASONS
)
210 hs
->facility_reason
[pi
->reason
]++;
212 hs
->facility_reason
[FACILITY_REASONS
]++;
230 h225counter_draw(void *phs
)
232 h225counter_t
*hs
=(h225counter_t
*)phs
;
235 printf("================== H225 Message and Reason Counter ==================\n");
236 printf("RAS-Messages:\n");
237 for(i
=0;i
<=RAS_MSG_TYPES
;i
++) {
238 if(hs
->ras_msg
[i
]!=0) {
239 printf(" %s : %u\n", val_to_str(i
,h225_RasMessage_vals
,"unknown ras-messages "), hs
->ras_msg
[i
]);
243 for(j
=0;j
<=GRJ_REASONS
;j
++) {
244 if(hs
->grj_reason
[j
]!=0) {
245 printf(" %s : %u\n", val_to_str(j
,GatekeeperRejectReason_vals
,"unknown reason "), hs
->grj_reason
[j
]);
250 for(j
=0;j
<=RRJ_REASONS
;j
++) {
251 if(hs
->rrj_reason
[j
]!=0) {
252 printf(" %s : %u\n", val_to_str(j
,RegistrationRejectReason_vals
,"unknown reason "), hs
->rrj_reason
[j
]);
257 for(j
=0;j
<=URQ_REASONS
;j
++) {
258 if(hs
->urq_reason
[j
]!=0) {
259 printf(" %s : %u\n", val_to_str(j
,UnregRequestReason_vals
,"unknown reason "), hs
->urq_reason
[j
]);
264 for(j
=0;j
<=URJ_REASONS
;j
++) {
265 if(hs
->urj_reason
[j
]!=0) {
266 printf(" %s : %u\n", val_to_str(j
,UnregRejectReason_vals
,"unknown reason "), hs
->urj_reason
[j
]);
271 for(j
=0;j
<=ARJ_REASONS
;j
++) {
272 if(hs
->arj_reason
[j
]!=0) {
273 printf(" %s : %u\n", val_to_str(j
,AdmissionRejectReason_vals
,"unknown reason "), hs
->arj_reason
[j
]);
278 for(j
=0;j
<=BRJ_REASONS
;j
++) {
279 if(hs
->brj_reason
[j
]!=0) {
280 printf(" %s : %u\n", val_to_str(j
,BandRejectReason_vals
,"unknown reason "), hs
->brj_reason
[j
]);
285 for(j
=0;j
<=DRQ_REASONS
;j
++) {
286 if(hs
->drq_reason
[j
]!=0) {
287 printf(" %s : %u\n", val_to_str(j
,DisengageReason_vals
,"unknown reason "), hs
->drq_reason
[j
]);
292 for(j
=0;j
<=DRJ_REASONS
;j
++) {
293 if(hs
->drj_reason
[j
]!=0) {
294 printf(" %s : %u\n", val_to_str(j
,DisengageRejectReason_vals
,"unknown reason "), hs
->drj_reason
[j
]);
299 for(j
=0;j
<=LRJ_REASONS
;j
++) {
300 if(hs
->lrj_reason
[j
]!=0) {
301 printf(" %s : %u\n", val_to_str(j
,LocationRejectReason_vals
,"unknown reason "), hs
->lrj_reason
[j
]);
305 case 29: /* IRQNak */
306 for(j
=0;j
<=IRQNAK_REASONS
;j
++) {
307 if(hs
->irqnak_reason
[j
]!=0) {
308 printf(" %s : %u\n", val_to_str(j
,InfoRequestNakReason_vals
,"unknown reason "), hs
->irqnak_reason
[j
]);
315 /* end of reason counter*/
318 printf("Call Signalling:\n");
319 for(i
=0;i
<=CS_MSG_TYPES
;i
++) {
320 if(hs
->cs_msg
[i
]!=0) {
321 printf(" %s : %u\n", val_to_str(i
,T_h323_message_body_vals
,"unknown cs-messages "), hs
->cs_msg
[i
]);
324 case 5: /* ReleaseComplete */
325 for(j
=0;j
<=REL_CMP_REASONS
;j
++) {
326 if(hs
->rel_cmp_reason
[j
]!=0) {
327 printf(" %s : %u\n", val_to_str(j
,h225_ReleaseCompleteReason_vals
,"unknown reason "), hs
->rel_cmp_reason
[j
]);
331 case 6: /* Facility */
332 for(j
=0;j
<=FACILITY_REASONS
;j
++) {
333 if(hs
->facility_reason
[j
]!=0) {
334 printf(" %s : %u\n", val_to_str(j
,FacilityReason_vals
,"unknown reason "), hs
->facility_reason
[j
]);
343 printf("=====================================================================\n");
348 h225counter_init(const char *opt_arg
, void* userdata _U_
)
351 GString
*error_string
;
353 hs
= g_new(h225counter_t
,1);
354 if(!strncmp(opt_arg
,"h225,counter,",13)){
355 hs
->filter
=g_strdup(opt_arg
+13);
360 h225counter_reset(hs
);
362 error_string
=register_tap_listener("h225", hs
, hs
->filter
, 0, NULL
, h225counter_packet
, h225counter_draw
);
364 /* error, we failed to attach to the tap. clean up */
368 fprintf(stderr
, "tshark: Couldn't register h225,counter tap: %s\n",
370 g_string_free(error_string
, TRUE
);
377 register_tap_listener_h225counter(void)
379 register_stat_cmd_arg("h225,counter", h225counter_init
,NULL
);