2 * h225 RAS Service Response Time statistics 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>
38 #include "epan/timestats.h"
40 /* following values represent the size of their valuestring arrays */
41 #define NUM_RAS_STATS 7
43 void register_tap_listener_h225rassrt(void);
45 static const value_string ras_message_category
[] = {
47 { 1, "Registration "},
48 { 2, "UnRegistration"},
56 typedef enum _ras_type
{
63 typedef enum _ras_category
{
74 /* Summary of response-time calculations*/
75 typedef struct _h225_rtd_t
{
83 /* used to keep track of the statistics for an entire program interface */
84 typedef struct _h225rassrt_t
{
86 h225_rtd_t ras_rtd
[NUM_RAS_STATS
];
91 h225rassrt_reset(void *phs
)
93 h225rassrt_t
*hs
=(h225rassrt_t
*)phs
;
96 for(i
=0;i
<NUM_RAS_STATS
;i
++) {
97 hs
->ras_rtd
[i
].stats
.num
= 0;
98 hs
->ras_rtd
[i
].stats
.min_num
= 0;
99 hs
->ras_rtd
[i
].stats
.max_num
= 0;
100 hs
->ras_rtd
[i
].stats
.min
.secs
= 0;
101 hs
->ras_rtd
[i
].stats
.min
.nsecs
= 0;
102 hs
->ras_rtd
[i
].stats
.max
.secs
= 0;
103 hs
->ras_rtd
[i
].stats
.max
.nsecs
= 0;
104 hs
->ras_rtd
[i
].stats
.tot
.secs
= 0;
105 hs
->ras_rtd
[i
].stats
.tot
.nsecs
= 0;
106 hs
->ras_rtd
[i
].open_req_num
= 0;
107 hs
->ras_rtd
[i
].disc_rsp_num
= 0;
108 hs
->ras_rtd
[i
].req_dup_num
= 0;
109 hs
->ras_rtd
[i
].rsp_dup_num
= 0;
115 h225rassrt_packet(void *phs
, packet_info
*pinfo _U_
, epan_dissect_t
*edt _U_
, const void *phi
)
117 h225rassrt_t
*hs
=(h225rassrt_t
*)phs
;
118 const h225_packet_info
*pi
=(const h225_packet_info
*)phi
;
120 ras_type rasmsg_type
= RAS_OTHER
;
121 ras_category rascategory
= RAS_OTHERS
;
123 if (pi
->msg_type
!= H225_RAS
|| pi
->msg_tag
== -1) {
124 /* No RAS Message or uninitialized msg_tag -> return */
128 if (pi
->msg_tag
< 21) {
130 rascategory
= (ras_category
)(pi
->msg_tag
/ 3);
131 rasmsg_type
= (ras_type
)(pi
->msg_tag
% 3);
134 /* No SRT yet (ToDo) */
138 switch(rasmsg_type
) {
141 if(pi
->is_duplicate
){
142 hs
->ras_rtd
[rascategory
].req_dup_num
++;
145 hs
->ras_rtd
[rascategory
].open_req_num
++;
150 /* no break - delay calculation is identical for Confirm and Reject */
152 if(pi
->is_duplicate
){
153 /* Duplicate is ignored */
154 hs
->ras_rtd
[rascategory
].rsp_dup_num
++;
156 else if (!pi
->request_available
) {
157 /* no request was seen, ignore response */
158 hs
->ras_rtd
[rascategory
].disc_rsp_num
++;
161 hs
->ras_rtd
[rascategory
].open_req_num
--;
162 time_stat_update(&(hs
->ras_rtd
[rascategory
].stats
),&(pi
->delta_time
), pinfo
);
173 h225rassrt_draw(void *phs
)
175 h225rassrt_t
*hs
=(h225rassrt_t
*)phs
;
177 timestat_t
*rtd_temp
;
179 printf("======================================== H225 RAS Service Response Time ========================================\n");
180 printf("H225 RAS Service Response Time (SRT) Statistics:\n");
181 printf("RAS-Messages | Measurements | Min SRT | Max SRT | Avg SRT | Min in Frame | Max in Frame |\n");
182 for(i
=0;i
<NUM_RAS_STATS
;i
++) {
183 rtd_temp
= &(hs
->ras_rtd
[i
].stats
);
185 printf("%s | %10u | %9.2f msec | %9.2f msec | %9.2f msec | %10u | %10u |\n",
186 val_to_str(i
,ras_message_category
,"Unknown "),rtd_temp
->num
,
187 nstime_to_msec(&(rtd_temp
->min
)), nstime_to_msec(&(rtd_temp
->max
)),
188 get_average(&(rtd_temp
->tot
), rtd_temp
->num
),
189 rtd_temp
->min_num
, rtd_temp
->max_num
193 printf("================================================================================================================\n");
194 printf("RAS-Messages | Open REQ | Discarded RSP | Repeated REQ | Repeated RSP |\n");
195 for(i
=0;i
<NUM_RAS_STATS
;i
++) {
196 rtd_temp
= &(hs
->ras_rtd
[i
].stats
);
198 printf("%s | %10u | %10u | %10u | %10u |\n",
199 val_to_str(i
,ras_message_category
,"Unknown "),
200 hs
->ras_rtd
[i
].open_req_num
, hs
->ras_rtd
[i
].disc_rsp_num
,
201 hs
->ras_rtd
[i
].req_dup_num
, hs
->ras_rtd
[i
].rsp_dup_num
205 printf("================================================================================================================\n");
211 h225rassrt_init(const char *opt_arg
, void* userdata _U_
)
214 GString
*error_string
;
216 hs
= g_new(h225rassrt_t
,1);
217 if(!strncmp(opt_arg
,"h225,srt,",9)){
218 hs
->filter
=g_strdup(opt_arg
+9);
223 h225rassrt_reset(hs
);
225 error_string
=register_tap_listener("h225", hs
, hs
->filter
, 0, NULL
, h225rassrt_packet
, h225rassrt_draw
);
227 /* error, we failed to attach to the tap. clean up */
231 fprintf(stderr
, "tshark: Couldn't register h225,srt tap: %s\n",
233 g_string_free(error_string
, TRUE
);
240 register_tap_listener_h225rassrt(void)
242 register_stat_cmd_arg("h225,srt", h225rassrt_init
,NULL
);