2 * H.225 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>
34 #include <epan/epan.h>
35 #include <epan/value_string.h>
37 #include <epan/dissectors/packet-h225.h>
39 #include "ui/simple_dialog.h"
41 #include "../stat_menu.h"
43 #include "ui/gtk/gui_stat_util.h"
44 #include "ui/gtk/dlg_utils.h"
45 #include "ui/gtk/tap_param_dlg.h"
46 #include "ui/gtk/gui_utils.h"
47 #include "ui/gtk/main.h"
49 #include "ui/gtk/old-gtk-compat.h"
51 static void gtk_h225counter_init(const char *opt_arg
, void *userdata
);
53 static tap_param h225_counter_params
[] = {
54 { PARAM_FILTER
, "Filter", NULL
}
57 static tap_param_dlg h225_counter_dlg
= {
58 "H.225 Messages and Message Reasons",
62 G_N_ELEMENTS(h225_counter_params
),
66 /* following values represent the size of their valuestring arrays */
68 #define RAS_MSG_TYPES 33
69 #define CS_MSG_TYPES 13
72 #define RRJ_REASONS 18
75 #define ARJ_REASONS 22
79 #define LRJ_REASONS 16
80 #define IRQNAK_REASONS 4
81 #define REL_CMP_REASONS 26
82 #define FACILITY_REASONS 11
85 /* used to keep track of the statistics for an entire program interface */
86 typedef struct _h225counter_t
{
90 GtkWidget
*scrolled_window
;
92 guint32 ras_msg
[RAS_MSG_TYPES
+ 1];
93 guint32 cs_msg
[CS_MSG_TYPES
+ 1];
94 guint32 grj_reason
[GRJ_REASONS
+ 1];
95 guint32 rrj_reason
[RRJ_REASONS
+ 1];
96 guint32 urq_reason
[URQ_REASONS
+ 1];
97 guint32 urj_reason
[URJ_REASONS
+ 1];
98 guint32 arj_reason
[ARJ_REASONS
+ 1];
99 guint32 brj_reason
[BRJ_REASONS
+ 1];
100 guint32 drq_reason
[DRQ_REASONS
+ 1];
101 guint32 drj_reason
[DRJ_REASONS
+ 1];
102 guint32 lrj_reason
[LRJ_REASONS
+ 1];
103 guint32 irqnak_reason
[IRQNAK_REASONS
+ 1];
104 guint32 rel_cmp_reason
[REL_CMP_REASONS
+ 1];
105 guint32 facility_reason
[FACILITY_REASONS
+ 1];
110 h225counter_reset(void *phs
)
112 h225counter_t
*hs
=(h225counter_t
*)phs
;
115 for(i
=0;i
<=RAS_MSG_TYPES
;i
++) {
118 for(i
=0;i
<=CS_MSG_TYPES
;i
++) {
121 for(i
=0;i
<=GRJ_REASONS
;i
++) {
122 hs
->grj_reason
[i
] = 0;
124 for(i
=0;i
<=RRJ_REASONS
;i
++) {
125 hs
->rrj_reason
[i
] = 0;
127 for(i
=0;i
<=URQ_REASONS
;i
++) {
128 hs
->urq_reason
[i
] = 0;
130 for(i
=0;i
<=URJ_REASONS
;i
++) {
131 hs
->urj_reason
[i
] = 0;
133 for(i
=0;i
<=ARJ_REASONS
;i
++) {
134 hs
->arj_reason
[i
] = 0;
136 for(i
=0;i
<=BRJ_REASONS
;i
++) {
137 hs
->brj_reason
[i
] = 0;
139 for(i
=0;i
<=DRQ_REASONS
;i
++) {
140 hs
->drq_reason
[i
] = 0;
142 for(i
=0;i
<=DRJ_REASONS
;i
++) {
143 hs
->drj_reason
[i
] = 0;
145 for(i
=0;i
<=LRJ_REASONS
;i
++) {
146 hs
->lrj_reason
[i
] = 0;
148 for(i
=0;i
<=IRQNAK_REASONS
;i
++) {
149 hs
->irqnak_reason
[i
] = 0;
151 for(i
=0;i
<=REL_CMP_REASONS
;i
++) {
152 hs
->rel_cmp_reason
[i
] = 0;
154 for(i
=0;i
<=FACILITY_REASONS
;i
++) {
155 hs
->facility_reason
[i
] = 0;
160 h225counter_packet(void *phs
, packet_info
*pinfo _U_
, epan_dissect_t
*edt _U_
, const void *phi
)
162 h225counter_t
*hs
=(h225counter_t
*)phs
;
163 const h225_packet_info
*pi
=(h225_packet_info
*)phi
;
165 switch (pi
->msg_type
) {
168 if(pi
->msg_tag
==-1) { /* uninitialized */
171 else if (pi
->msg_tag
>= RAS_MSG_TYPES
) { /* unknown */
172 hs
->ras_msg
[RAS_MSG_TYPES
]++;
175 hs
->ras_msg
[pi
->msg_tag
]++;
178 /* Look for reason tag */
179 if(pi
->reason
==-1) { /* uninitialized */
183 switch(pi
->msg_tag
) {
186 if(pi
->reason
< GRJ_REASONS
)
187 hs
->grj_reason
[pi
->reason
]++;
189 hs
->grj_reason
[GRJ_REASONS
]++;
192 if(pi
->reason
< RRJ_REASONS
)
193 hs
->rrj_reason
[pi
->reason
]++;
195 hs
->rrj_reason
[RRJ_REASONS
]++;
198 if(pi
->reason
< URQ_REASONS
)
199 hs
->urq_reason
[pi
->reason
]++;
201 hs
->urq_reason
[URQ_REASONS
]++;
204 if(pi
->reason
< URJ_REASONS
)
205 hs
->urj_reason
[pi
->reason
]++;
207 hs
->urj_reason
[URJ_REASONS
]++;
210 if(pi
->reason
< ARJ_REASONS
)
211 hs
->arj_reason
[pi
->reason
]++;
213 hs
->arj_reason
[ARJ_REASONS
]++;
216 if(pi
->reason
< BRJ_REASONS
)
217 hs
->brj_reason
[pi
->reason
]++;
219 hs
->brj_reason
[BRJ_REASONS
]++;
222 if(pi
->reason
< DRQ_REASONS
)
223 hs
->drq_reason
[pi
->reason
]++;
225 hs
->drq_reason
[DRQ_REASONS
]++;
228 if(pi
->reason
< DRJ_REASONS
)
229 hs
->drj_reason
[pi
->reason
]++;
231 hs
->drj_reason
[DRJ_REASONS
]++;
234 if(pi
->reason
< LRJ_REASONS
)
235 hs
->lrj_reason
[pi
->reason
]++;
237 hs
->lrj_reason
[LRJ_REASONS
]++;
239 case 29: /* IRQ Nak */
240 if(pi
->reason
< IRQNAK_REASONS
)
241 hs
->irqnak_reason
[pi
->reason
]++;
243 hs
->irqnak_reason
[IRQNAK_REASONS
]++;
254 if(pi
->msg_tag
==-1) { /* uninitialized */
257 else if (pi
->msg_tag
>= CS_MSG_TYPES
) { /* unknown */
258 hs
->cs_msg
[CS_MSG_TYPES
]++;
261 hs
->cs_msg
[pi
->msg_tag
]++;
264 /* Look for reason tag */
265 if(pi
->reason
==-1) { /* uninitialized */
269 switch(pi
->msg_tag
) {
271 case 5: /* ReleaseComplete */
272 if(pi
->reason
< REL_CMP_REASONS
)
273 hs
->rel_cmp_reason
[pi
->reason
]++;
275 hs
->rel_cmp_reason
[REL_CMP_REASONS
]++;
277 case 6: /* Facility */
278 if(pi
->reason
< FACILITY_REASONS
)
279 hs
->facility_reason
[pi
->reason
]++;
281 hs
->facility_reason
[FACILITY_REASONS
]++;
298 h225counter_draw(void *phs
)
300 h225counter_t
*hs
=(h225counter_t
*)phs
;
306 /* Now print Message and Reason Counter Table */
307 /* clear list before printing */
308 store
= GTK_LIST_STORE(gtk_tree_view_get_model(hs
->table
));
309 gtk_list_store_clear(store
);
311 for(i
=0;i
<=RAS_MSG_TYPES
;i
++) {
312 if(hs
->ras_msg
[i
]!=0) {
313 g_snprintf(str
, 256, "%s", val_to_str(i
,h225_RasMessage_vals
,"unknown ras-messages"));
314 gtk_list_store_append(store
, &iter
);
315 gtk_list_store_set(store
, &iter
,
316 0, val_to_str(i
,h225_RasMessage_vals
,"unknown ras-messages"),
317 1, hs
->ras_msg
[i
], -1);
322 for(j
=0;j
<=GRJ_REASONS
;j
++) {
323 if(hs
->grj_reason
[j
]!=0) {
324 g_snprintf(str
, 256," %s",
325 val_to_str(j
,GatekeeperRejectReason_vals
,"unknown reason"));
326 gtk_list_store_append(store
, &iter
);
327 gtk_list_store_set(store
, &iter
,
329 1, hs
->grj_reason
[j
], -1);
334 for(j
=0;j
<=RRJ_REASONS
;j
++) {
335 if(hs
->rrj_reason
[j
]!=0) {
336 g_snprintf(str
, 256," %s",
337 val_to_str(j
,RegistrationRejectReason_vals
,"unknown reason"));
338 gtk_list_store_append(store
, &iter
);
339 gtk_list_store_set(store
, &iter
,
341 1, hs
->rrj_reason
[j
], -1);
346 for(j
=0;j
<=URQ_REASONS
;j
++) {
347 if(hs
->urq_reason
[j
]!=0) {
348 g_snprintf(str
, 256," %s",
349 val_to_str(j
,UnregRequestReason_vals
,"unknown reason"));
350 gtk_list_store_append(store
, &iter
);
351 gtk_list_store_set(store
, &iter
,
353 1, hs
->urq_reason
[j
], -1);
358 for(j
=0;j
<=URJ_REASONS
;j
++) {
359 if(hs
->urj_reason
[j
]!=0) {
360 g_snprintf(str
, 256," %s",
361 val_to_str(j
,UnregRejectReason_vals
,"unknown reason"));
362 gtk_list_store_append(store
, &iter
);
363 gtk_list_store_set(store
, &iter
,
365 1, hs
->urj_reason
[j
], -1);
370 for(j
=0;j
<=ARJ_REASONS
;j
++) {
371 if(hs
->arj_reason
[j
]!=0) {
372 g_snprintf(str
, 256," %s",
373 val_to_str(j
,AdmissionRejectReason_vals
,"unknown reason"));
374 gtk_list_store_append(store
, &iter
);
375 gtk_list_store_set(store
, &iter
,
377 1, hs
->arj_reason
[j
], -1);
382 for(j
=0;j
<=BRJ_REASONS
;j
++) {
383 if(hs
->brj_reason
[j
]!=0) {
384 g_snprintf(str
, 256," %s",
385 val_to_str(j
,BandRejectReason_vals
,"unknown reason"));
386 gtk_list_store_append(store
, &iter
);
387 gtk_list_store_set(store
, &iter
,
389 1, hs
->brj_reason
[j
], -1);
394 for(j
=0;j
<=DRQ_REASONS
;j
++) {
395 if(hs
->drq_reason
[j
]!=0) {
396 g_snprintf(str
, 256," %s",
397 val_to_str(j
,DisengageReason_vals
,"unknown reason"));
398 gtk_list_store_append(store
, &iter
);
399 gtk_list_store_set(store
, &iter
,
401 1, hs
->drq_reason
[j
], -1);
406 for(j
=0;j
<=DRJ_REASONS
;j
++) {
407 if(hs
->drj_reason
[j
]!=0) {
408 g_snprintf(str
, 256," %s",
409 val_to_str(j
,DisengageRejectReason_vals
,"unknown reason"));
410 gtk_list_store_set(store
, &iter
,
412 1, hs
->drj_reason
[j
], -1);
417 for(j
=0;j
<=LRJ_REASONS
;j
++) {
418 if(hs
->lrj_reason
[j
]!=0) {
419 g_snprintf(str
, 256," %s",
420 val_to_str(j
,LocationRejectReason_vals
,"unknown reason"));
421 gtk_list_store_append(store
, &iter
);
422 gtk_list_store_set(store
, &iter
,
424 1, hs
->lrj_reason
[j
], -1);
428 case 29: /* IRQNak */
429 for(j
=0;j
<=IRQNAK_REASONS
;j
++) {
430 if(hs
->irqnak_reason
[j
]!=0) {
431 g_snprintf(str
, 256," %s",
432 val_to_str(j
,InfoRequestNakReason_vals
,"unknown reason"));
433 gtk_list_store_append(store
, &iter
);
434 gtk_list_store_set(store
, &iter
,
436 1, hs
->irqnak_reason
[j
], -1);
443 /* end of reason counter*/
447 for(i
=0;i
<=CS_MSG_TYPES
;i
++) {
448 if(hs
->cs_msg
[i
]!=0) {
449 gtk_list_store_append(store
, &iter
);
450 gtk_list_store_set(store
, &iter
,
451 0, val_to_str(i
,T_h323_message_body_vals
,"unknown cs-messages"),
452 1, hs
->cs_msg
[i
], -1);
456 case 5: /* ReleaseComplete */
457 for(j
=0;j
<=REL_CMP_REASONS
;j
++) {
458 if(hs
->rel_cmp_reason
[j
]!=0) {
459 g_snprintf(str
, 256," %s",
460 val_to_str(j
,h225_ReleaseCompleteReason_vals
,"unknown reason"));
461 gtk_list_store_append(store
, &iter
);
462 gtk_list_store_set(store
, &iter
,
464 1, hs
->rel_cmp_reason
[j
], -1);
468 case 6: /* Facility */
469 for(j
=0;j
<=FACILITY_REASONS
;j
++) {
470 if(hs
->facility_reason
[j
]!=0) {
471 g_snprintf(str
, 256," %s",
472 val_to_str(j
,FacilityReason_vals
,"unknown reason"));
473 gtk_list_store_append(store
, &iter
);
474 gtk_list_store_set(store
, &iter
,
476 1, hs
->facility_reason
[j
], -1);
488 win_destroy_cb(GtkWindow
*win _U_
, gpointer data
)
490 h225counter_t
*hs
=(h225counter_t
*)data
;
492 remove_tap_listener(hs
);
501 static const stat_column titles
[]={
502 {G_TYPE_STRING
, LEFT
, "Message Type or Reason"},
503 {G_TYPE_UINT
, RIGHT
, "Count" }
507 gtk_h225counter_init(const char *opt_arg
, void *userdata _U_
)
510 GString
*error_string
;
514 hs
=(h225counter_t
*)g_malloc(sizeof(h225counter_t
));
516 if(strncmp(opt_arg
,"h225,counter,",13) == 0){
517 hs
->filter
=g_strdup(opt_arg
+13);
522 h225counter_reset(hs
);
524 hs
->win
= dlg_window_new("Wireshark: H.225 counters"); /* transient_for top_level */
525 gtk_window_set_destroy_with_parent (GTK_WINDOW(hs
->win
), TRUE
);
527 gtk_window_set_default_size(GTK_WINDOW(hs
->win
), 400, 200);
529 hs
->vbox
=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 3, FALSE
);
530 gtk_container_set_border_width(GTK_CONTAINER(hs
->vbox
), 12);
532 init_main_stat_window(hs
->win
, hs
->vbox
, "H.225 Message and Message Reason Counter", hs
->filter
);
534 /* init a scrolled window*/
535 hs
->scrolled_window
= scrolled_window_new(NULL
, NULL
);
537 hs
->table
= create_stat_table(hs
->scrolled_window
, hs
->vbox
, 2, titles
);
539 error_string
=register_tap_listener("h225", hs
, hs
->filter
, 0, h225counter_reset
, h225counter_packet
, h225counter_draw
);
541 simple_dialog(ESD_TYPE_ERROR
, ESD_BTN_OK
, "%s", error_string
->str
);
542 g_string_free(error_string
, TRUE
);
549 bbox
= dlg_button_row_new(GTK_STOCK_CLOSE
, NULL
);
550 gtk_box_pack_end(GTK_BOX(hs
->vbox
), bbox
, FALSE
, FALSE
, 0);
552 close_bt
= (GtkWidget
*)g_object_get_data(G_OBJECT(bbox
), GTK_STOCK_CLOSE
);
553 window_set_cancel_button(hs
->win
, close_bt
, window_cancel_button_cb
);
555 g_signal_connect(hs
->win
, "delete_event", G_CALLBACK(window_delete_event_cb
), NULL
);
556 g_signal_connect(hs
->win
, "destroy", G_CALLBACK(win_destroy_cb
), hs
);
558 gtk_widget_show_all(hs
->win
);
559 window_present(hs
->win
);
561 cf_retap_packets(&cfile
);
562 gdk_window_raise(gtk_widget_get_window(hs
->win
));
566 register_tap_listener_gtk_h225counter(void)
568 register_param_stat(&h225_counter_dlg
, "_H.225",
569 REGISTER_STAT_GROUP_TELEPHONY
);