a07c6a412bc52acf968a5b16ac8924e665ab2cda
[openafs.git] / src / libadmin / samples / rxdebug_rx_stats.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  *
9  * Portions Copyright (c) 2003 Apple Computer, Inc.
10  */
11
12 /*
13  * This file contains sample code for the rxstats interface 
14  */
15
16 #include <afsconfig.h>
17 #include <afs/param.h>
18
19
20 #ifdef AFS_NT40_ENV
21 #include <winsock2.h>
22 #include <pthread.h>
23 #endif
24 #include <string.h>
25
26 #include <rx/rx.h>
27 #include <rx/rxstat.h>
28
29 #include <afs/afs_Admin.h>
30 #include <afs/afs_clientAdmin.h>
31 #include <afs/afs_utilAdmin.h>
32
33 #ifdef AFS_DARWIN_ENV
34 pthread_mutex_t des_init_mutex = PTHREAD_MUTEX_INITIALIZER;
35 pthread_mutex_t des_random_mutex = PTHREAD_MUTEX_INITIALIZER;
36 pthread_mutex_t rxkad_random_mutex = PTHREAD_MUTEX_INITIALIZER;
37 #endif /* AFS_DARWIN_ENV */
38
39 void
40 Usage(void)
41 {
42     fprintf(stderr, "Usage: rxdebug_rx_stats <host> <port>\n");
43     exit(1);
44 }
45
46 void
47 ParseArgs(int argc, char *argv[], char **srvrName, long *srvrPort)
48 {
49     char **argp = argv;
50
51     if (!*(++argp))
52         Usage();
53     *srvrName = *(argp++);
54     if (!*(argp))
55         Usage();
56     *srvrPort = strtol(*(argp++), NULL, 0);
57     if (*srvrPort <= 0 || *srvrPort >= 65536)
58         Usage();
59     if (*(argp))
60         Usage();
61 }
62
63 static char *packetTypes[] = RX_PACKET_TYPES;
64
65 int
66 main(int argc, char *argv[])
67 {
68     int rc;
69     afs_status_t st = 0;
70     rxdebugHandle_p handle;
71     char *srvrName;
72     long srvrPort;
73     struct rx_statistics stats;
74     afs_uint32 supportedStats;
75     char tstr[32];
76     int i;
77
78     ParseArgs(argc, argv, &srvrName, &srvrPort);
79
80     rc = afsclient_Init(&st);
81     if (!rc) {
82         fprintf(stderr, "afsclient_Init, status %d\n", st);
83         exit(1);
84     }
85
86     rc = afsclient_RXDebugOpenPort(srvrName, srvrPort, &handle, &st);
87     if (!rc) {
88         fprintf(stderr, "afsclient_RXDebugOpenPort, status %d\n", st);
89         exit(1);
90     }
91
92     rc = util_RXDebugRxStats(handle, &stats, &supportedStats, &st);
93     if (!rc) {
94         fprintf(stderr, "util_RXDebugBasicStats, status %d\n", st);
95         exit(1);
96     }
97
98     rc = afsclient_RXDebugClose(handle, &st);
99     if (!rc) {
100         fprintf(stderr, "afsclient_RXDebugClose, status %d\n", st);
101         exit(1);
102     }
103
104     printf("\n");
105     printf("RX stats: host %s (port %d)\n", srvrName, srvrPort);
106     printf("\n");
107     printf("    packetRequests:              %d\n", stats.packetRequests);
108     printf("    receivePktAllocFailures:     %d\n",
109            stats.receivePktAllocFailures);
110     if (supportedStats & RX_SERVER_DEBUG_NEW_PACKETS) {
111         printf("    receiveCbufPktAllocFailures: %d\n",
112                stats.receiveCbufPktAllocFailures);
113     }
114     printf("    sendPktAllocFailures:        %d\n",
115            stats.sendPktAllocFailures);
116     if (supportedStats & RX_SERVER_DEBUG_NEW_PACKETS) {
117         printf("    sendCbufPktAllocFailures:    %d\n",
118                stats.sendCbufPktAllocFailures);
119     }
120     printf("    specialPktAllocFailures:     %d\n",
121            stats.specialPktAllocFailures);
122     printf("    socketGreedy:                %d\n", stats.socketGreedy);
123     printf("    bogusPacketOnRead:           %d\n", stats.bogusPacketOnRead);
124     printf("    bogusHost:                   %d\n", stats.bogusHost);
125     printf("    noPacketOnRead:              %d\n", stats.noPacketOnRead);
126     printf("    noPacketBuffersOnRead:       %d\n",
127            stats.noPacketBuffersOnRead);
128     printf("    selects:                     %d\n", stats.selects);
129     printf("    sendSelects:                 %d\n", stats.sendSelects);
130     printf("    packetsRead:\n");
131     for (i = 0; i < RX_N_PACKET_TYPES; i++) {
132         strcpy(tstr, packetTypes[i]);
133         printf("\t%-24s %d\n", strcat(tstr, ":"), stats.packetsRead[i]);
134     }
135     printf("    dataPacketsRead:             %d\n", stats.dataPacketsRead);
136     printf("    ackPacketsRead:              %d\n", stats.ackPacketsRead);
137     printf("    dupPacketsRead:              %d\n", stats.dupPacketsRead);
138     printf("    spuriousPacketsRead:         %d\n",
139            stats.spuriousPacketsRead);
140     printf("    ignorePacketDally:           %d\n", stats.ignorePacketDally);
141     printf("    packetsSent:\n");
142     for (i = 0; i < RX_N_PACKET_TYPES; i++) {
143         strcpy(tstr, packetTypes[i]);
144         printf("\t%-24s %d\n", strcat(tstr, ":"), stats.packetsSent[i]);
145     }
146     printf("    ackPacketsSent:              %d\n", stats.ackPacketsSent);
147     printf("    dataPacketsSent:             %d\n", stats.dataPacketsSent);
148     printf("    dataPacketsReSent:           %d\n", stats.dataPacketsReSent);
149     printf("    dataPacketsPushed:           %d\n", stats.dataPacketsPushed);
150     printf("    ignoreAckedPacket:           %d\n", stats.ignoreAckedPacket);
151     printf("    netSendFailures:             %d\n", stats.netSendFailures);
152     printf("    fatalErrors:                 %d\n", stats.fatalErrors);
153     printf("    nRttSamples:                 %d\n", stats.nRttSamples);
154     printf("    totalRtt:                    %.6f\n",
155            clock_Float(&stats.totalRtt));
156     printf("    minRtt:                      %.6f\n",
157            clock_Float(&stats.minRtt));
158     printf("    maxRtt:                      %.6f\n",
159            clock_Float(&stats.maxRtt));
160     printf("    nServerConns:                %d\n", stats.nServerConns);
161     printf("    nClientConns:                %d\n", stats.nClientConns);
162     printf("    nPeerStructs:                %d\n", stats.nPeerStructs);
163     printf("    nCallStructs:                %d\n", stats.nCallStructs);
164     printf("    nFreeCallStructs:            %d\n", stats.nFreeCallStructs);
165     printf("\n");
166
167     exit(0);
168 }