2 * h225 message counter for ethereal
3 * Copyright 2003 Lars Roland
7 * Ethereal - Network traffic analyzer
8 * By Gerald Combs <gerald@ethereal.com>
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 /* With MSVC and a libethereal.dll this file needs to import some variables
27 in a special way. Therefore _NEED_VAR_IMPORT_ is defined. */
28 #define _NEED_VAR_IMPORT_
36 #ifdef HAVE_SYS_TYPES_H
37 # include <sys/types.h>
41 #include "epan/packet_info.h"
43 #include "epan/value_string.h"
45 #include <epan/dissectors/packet-h225.h>
47 /* following values represent the size of their valuestring arrays */
49 #define RAS_MSG_TYPES 33
50 #define CS_MSG_TYPES 13
53 #define RRJ_REASONS 18
56 #define ARJ_REASONS 22
60 #define LRJ_REASONS 16
61 #define IRQNAK_REASONS 4
62 #define REL_CMP_REASONS 26
63 #define FACILITY_REASONS 11
66 /* used to keep track of the statistics for an entire program interface */
67 typedef struct _h225counter_t {
69 guint32 ras_msg[RAS_MSG_TYPES + 1];
70 guint32 cs_msg[CS_MSG_TYPES + 1];
71 guint32 grj_reason[GRJ_REASONS + 1];
72 guint32 rrj_reason[RRJ_REASONS + 1];
73 guint32 urq_reason[URQ_REASONS + 1];
74 guint32 urj_reason[URJ_REASONS + 1];
75 guint32 arj_reason[ARJ_REASONS + 1];
76 guint32 brj_reason[BRJ_REASONS + 1];
77 guint32 drq_reason[DRQ_REASONS + 1];
78 guint32 drj_reason[DRJ_REASONS + 1];
79 guint32 lrj_reason[LRJ_REASONS + 1];
80 guint32 irqnak_reason[IRQNAK_REASONS + 1];
81 guint32 rel_cmp_reason[REL_CMP_REASONS + 1];
82 guint32 facility_reason[FACILITY_REASONS + 1];
87 h225counter_reset(void *phs)
89 h225counter_t *hs=(h225counter_t *)phs;
92 for(i=0;i<=RAS_MSG_TYPES;i++) {
95 for(i=0;i<=CS_MSG_TYPES;i++) {
98 for(i=0;i<=GRJ_REASONS;i++) {
99 hs->grj_reason[i] = 0;
101 for(i=0;i<=RRJ_REASONS;i++) {
102 hs->rrj_reason[i] = 0;
104 for(i=0;i<=URQ_REASONS;i++) {
105 hs->urq_reason[i] = 0;
107 for(i=0;i<=URJ_REASONS;i++) {
108 hs->urj_reason[i] = 0;
110 for(i=0;i<=ARJ_REASONS;i++) {
111 hs->arj_reason[i] = 0;
113 for(i=0;i<=BRJ_REASONS;i++) {
114 hs->brj_reason[i] = 0;
116 for(i=0;i<=DRQ_REASONS;i++) {
117 hs->drq_reason[i] = 0;
119 for(i=0;i<=DRJ_REASONS;i++) {
120 hs->drj_reason[i] = 0;
122 for(i=0;i<=LRJ_REASONS;i++) {
123 hs->lrj_reason[i] = 0;
125 for(i=0;i<=IRQNAK_REASONS;i++) {
126 hs->irqnak_reason[i] = 0;
128 for(i=0;i<=REL_CMP_REASONS;i++) {
129 hs->rel_cmp_reason[i] = 0;
131 for(i=0;i<=FACILITY_REASONS;i++) {
132 hs->facility_reason[i] = 0;
137 h225counter_packet(void *phs, packet_info *pinfo _U_, epan_dissect_t *edt _U_, void *phi)
139 h225counter_t *hs=(h225counter_t *)phs;
140 h225_packet_info *pi=phi;
142 switch (pi->msg_type) {
145 if(pi->msg_tag==-1) { /* uninitialized */
148 else if (pi->msg_tag >= RAS_MSG_TYPES) { /* unknown */
149 hs->ras_msg[RAS_MSG_TYPES]++;
152 hs->ras_msg[pi->msg_tag]++;
155 /* Look for reason tag */
156 if(pi->reason==-1) { /* uninitialized */
160 switch(pi->msg_tag) {
163 if(pi->reason < GRJ_REASONS)
164 hs->grj_reason[pi->reason]++;
166 hs->grj_reason[GRJ_REASONS]++;
169 if(pi->reason < RRJ_REASONS)
170 hs->rrj_reason[pi->reason]++;
172 hs->rrj_reason[RRJ_REASONS]++;
175 if(pi->reason < URQ_REASONS)
176 hs->urq_reason[pi->reason]++;
178 hs->urq_reason[URQ_REASONS]++;
181 if(pi->reason < URJ_REASONS)
182 hs->urj_reason[pi->reason]++;
184 hs->urj_reason[URJ_REASONS]++;
187 if(pi->reason < ARJ_REASONS)
188 hs->arj_reason[pi->reason]++;
190 hs->arj_reason[ARJ_REASONS]++;
193 if(pi->reason < BRJ_REASONS)
194 hs->brj_reason[pi->reason]++;
196 hs->brj_reason[BRJ_REASONS]++;
199 if(pi->reason < DRQ_REASONS)
200 hs->drq_reason[pi->reason]++;
202 hs->drq_reason[DRQ_REASONS]++;
205 if(pi->reason < DRJ_REASONS)
206 hs->drj_reason[pi->reason]++;
208 hs->drj_reason[DRJ_REASONS]++;
211 if(pi->reason < LRJ_REASONS)
212 hs->lrj_reason[pi->reason]++;
214 hs->lrj_reason[LRJ_REASONS]++;
216 case 29: /* IRQ Nak */
217 if(pi->reason < IRQNAK_REASONS)
218 hs->irqnak_reason[pi->reason]++;
220 hs->irqnak_reason[IRQNAK_REASONS]++;
231 if(pi->msg_tag==-1) { /* uninitialized */
234 else if (pi->msg_tag >= CS_MSG_TYPES) { /* unknown */
235 hs->cs_msg[CS_MSG_TYPES]++;
238 hs->cs_msg[pi->msg_tag]++;
241 /* Look for reason tag */
242 if(pi->reason==-1) { /* uninitialized */
246 switch(pi->msg_tag) {
248 case 5: /* ReleaseComplete */
249 if(pi->reason < REL_CMP_REASONS)
250 hs->rel_cmp_reason[pi->reason]++;
252 hs->rel_cmp_reason[REL_CMP_REASONS]++;
254 case 6: /* Facility */
255 if(pi->reason < FACILITY_REASONS)
256 hs->facility_reason[pi->reason]++;
258 hs->facility_reason[FACILITY_REASONS]++;
277 h225counter_draw(void *phs)
279 h225counter_t *hs=(h225counter_t *)phs;
282 printf("================== H225 Message and Reason Counter ==================\n");
283 printf("RAS-Messages:\n");
284 for(i=0;i<=RAS_MSG_TYPES;i++) {
285 if(hs->ras_msg[i]!=0) {
286 printf(" %s : %u\n", val_to_str(i,RasMessage_vals,"unknown ras-messages "), hs->ras_msg[i]);
290 for(j=0;j<=GRJ_REASONS;j++) {
291 if(hs->grj_reason[j]!=0) {
292 printf(" %s : %u\n", val_to_str(j,GatekeeperRejectReason_vals,"unknown reason "), hs->grj_reason[j]);
297 for(j=0;j<=RRJ_REASONS;j++) {
298 if(hs->rrj_reason[j]!=0) {
299 printf(" %s : %u\n", val_to_str(j,RegistrationRejectReason_vals,"unknown reason "), hs->rrj_reason[j]);
304 for(j=0;j<=URQ_REASONS;j++) {
305 if(hs->urq_reason[j]!=0) {
306 printf(" %s : %u\n", val_to_str(j,UnregRequestReason_vals,"unknown reason "), hs->urq_reason[j]);
311 for(j=0;j<=URJ_REASONS;j++) {
312 if(hs->urj_reason[j]!=0) {
313 printf(" %s : %u\n", val_to_str(j,UnregRejectReason_vals,"unknown reason "), hs->urj_reason[j]);
318 for(j=0;j<=ARJ_REASONS;j++) {
319 if(hs->arj_reason[j]!=0) {
320 printf(" %s : %u\n", val_to_str(j,AdmissionRejectReason_vals,"unknown reason "), hs->arj_reason[j]);
325 for(j=0;j<=BRJ_REASONS;j++) {
326 if(hs->brj_reason[j]!=0) {
327 printf(" %s : %u\n", val_to_str(j,BandRejectReason_vals,"unknown reason "), hs->brj_reason[j]);
332 for(j=0;j<=DRQ_REASONS;j++) {
333 if(hs->drq_reason[j]!=0) {
334 printf(" %s : %u\n", val_to_str(j,DisengageReason_vals,"unknown reason "), hs->drq_reason[j]);
339 for(j=0;j<=DRJ_REASONS;j++) {
340 if(hs->drj_reason[j]!=0) {
341 printf(" %s : %u\n", val_to_str(j,DisengageRejectReason_vals,"unknown reason "), hs->drj_reason[j]);
346 for(j=0;j<=LRJ_REASONS;j++) {
347 if(hs->lrj_reason[j]!=0) {
348 printf(" %s : %u\n", val_to_str(j,LocationRejectReason_vals,"unknown reason "), hs->lrj_reason[j]);
351 case 29: /* IRQNak */
352 for(j=0;j<=IRQNAK_REASONS;j++) {
353 if(hs->irqnak_reason[j]!=0) {
354 printf(" %s : %u\n", val_to_str(j,InfoRequestNakReason_vals,"unknown reason "), hs->irqnak_reason[j]);
361 /* end of reason counter*/
364 printf("Call Signalling:\n");
365 for(i=0;i<=CS_MSG_TYPES;i++) {
366 if(hs->cs_msg[i]!=0) {
367 printf(" %s : %u\n", val_to_str(i,h323_message_body_vals,"unknown cs-messages "), hs->cs_msg[i]);
370 case 5: /* ReleaseComplete */
371 for(j=0;j<=REL_CMP_REASONS;j++) {
372 if(hs->rel_cmp_reason[j]!=0) {
373 printf(" %s : %u\n", val_to_str(j,ReleaseCompleteReason_vals,"unknown reason "), hs->rel_cmp_reason[j]);
377 case 6: /* Facility */
378 for(j=0;j<=FACILITY_REASONS;j++) {
379 if(hs->facility_reason[j]!=0) {
380 printf(" %s : %u\n", val_to_str(j,FacilityReason_vals,"unknown reason "), hs->facility_reason[j]);
389 printf("=====================================================================\n");
394 h225counter_init(char *optarg)
398 GString *error_string;
400 if(!strncmp(optarg,"h225,counter,",13)){
407 hs = g_malloc(sizeof(h225counter_t));
408 hs->filter=g_malloc(strlen(filter)+1);
409 strcpy(hs->filter, filter);
411 h225counter_reset(hs);
413 error_string=register_tap_listener("h225", hs, filter, NULL, h225counter_packet, h225counter_draw);
415 /* error, we failed to attach to the tap. clean up */
419 fprintf(stderr, "tethereal: Couldn't register h225,counter tap: %s\n",
421 g_string_free(error_string, TRUE);
428 register_tap_listener_h225counter(void)
430 register_ethereal_tap("h225,counter", h225counter_init);