2 * Copyright 2000, International Business Machines Corporation and others.
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
10 /* RX Authentication Stress test: server side code. */
12 #include <afsconfig.h>
13 #include <afs/param.h>
19 #include <sys/types.h>
24 #include <netinet/in.h>
30 #include <afs/com_err.h>
35 #include "stress_internal.h"
36 #include "rx/rx_globals.h"
37 #ifdef AFS_PTHREAD_ENV
47 StringToAuth(authname)
51 if (strcmp(authname, "rxkad") == 0)
53 if (strcmp(authname, "rxkad_")) {
54 if (strncmp(authname, "rxkad_", 6) == 0)
55 nonoauth++, authname += 6;
56 if (strcmp(authname, "clear") == 0)
58 if (strcmp(authname, "auth") == 0)
60 if (strcmp(authname, "crypt") == 0)
62 if (strcmp(authname, "null") == 0)
64 if (strcmp(authname, "none") == 0)
66 if (strncmp(authname, "noauth", 6) == 0)
68 if (strncmp(authname, "unauth", 6) == 0)
73 "Unknown authentication name %s, using rxkad_clear by default\n",
84 #define aCOPIOUSCALLS 6
86 #define aPRINTTIMING 8
91 #define aHIJACKTEST 13
92 #define aAUTHENTICATION 14
93 #define aMINSERVERAUTH 15
94 #define aREPEATINTERVAL 16
95 #define aREPEATCOUNT 17
96 #define aSTOPSERVER 18
102 #define aUSETOKENS 24
107 CommandProc(as, arock)
109 struct cmd_syndesc *as;
112 int startServer = (as->parms[aSERVER].items != 0);
113 int startClient = (as->parms[aCLIENT].items != 0);
114 #ifndef AFS_PTHREAD_ENV
117 struct serverParms *sParms;
118 struct clientParms *cParms;
120 sParms = (struct serverParms *)osi_Alloc(sizeof(*sParms));
121 cParms = (struct clientParms *)osi_Alloc(sizeof(*cParms));
122 memset(sParms, 0, sizeof(*sParms));
123 memset(cParms, 0, sizeof(*cParms));
124 sParms->whoami = cParms->whoami = whoami;
126 if (!(startServer || startClient)) {
127 /* Default to "-server -client <localhost>" */
128 gethostname(cParms->server, sizeof(cParms->server));
129 startServer = startClient = 1;
133 cParms->printStats = (as->parms[aPRINTSTATS].items != 0);
134 cParms->printTiming = (as->parms[aPRINTTIMING].items != 0);
135 cParms->noExit = (as->parms[aNOEXIT].items != 0);
136 cParms->callTest = (as->parms[aCALLTEST].items != 0);
137 cParms->hijackTest = (as->parms[aHIJACKTEST].items != 0);
138 cParms->stopServer = (as->parms[aSTOPSERVER].items != 0);
139 cParms->useTokens = (as->parms[aUSETOKENS].items != 0);
141 if (as->parms[aMELT1b].items)
143 if (as->parms[aRECLAIM].items)
145 if (as->parms[a2DCHOICE].items)
149 if (as->parms[aTRACE].items) {
150 extern char rxi_tracename[];
151 strcpy(rxi_tracename, as->parms[aTRACE].items->data);
154 /* These options not compatible with -server */
155 if (cParms->stopServer) {
156 code = RXKST_BADARGS;
157 afs_com_err(whoami, code, "stop server not compatible with -client");
161 /* process -server options */
162 sParms->threads = 3; /* one less than channels/conn */
163 if (as->parms[aSTHREADS].items)
164 sParms->threads = atoi(as->parms[aSTHREADS].items->data);
165 sParms->authentication = 0;
166 if (as->parms[aMINSERVERAUTH].items)
167 sParms->authentication =
168 StringToAuth(as->parms[aMINSERVERAUTH].items->data);
169 if (as->parms[aKEYFILE].items)
170 sParms->keyfile = as->parms[aKEYFILE].items->data;
172 #ifdef AFS_PTHREAD_ENV
175 pthread_attr_t tattr;
177 code = pthread_attr_init(&tattr);
179 afs_com_err(whoami, code,
180 "can't pthread_attr_init server process");
185 pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
187 afs_com_err(whoami, code,
188 "can't pthread_attr_setdetachstate server process");
193 pthread_create(&serverID, &tattr, rxkst_StartServer,
198 LWP_CreateProcess(rxkst_StartServer, 16000, LWP_NORMAL_PRIORITY,
199 (opaque) sParms, "Server Process", &pid);
202 afs_com_err(whoami, code, "can't create server process");
206 /* check for server-only args */
210 u_long calls; /* default number of calls */
212 /* process -client options */
213 if (as->parms[aCLIENT].items)
214 lcstring(cParms->server, as->parms[aCLIENT].items->data,
215 sizeof(cParms->server));
216 cParms->threads = 6; /* 150% of channels/conn */
217 if (as->parms[aCTHREADS].items)
218 cParms->threads = atoi(as->parms[aCTHREADS].items->data);
219 if (cParms->callTest || cParms->hijackTest || cParms->printTiming
220 || cParms->stopServer)
224 cParms->fastCalls = cParms->slowCalls = cParms->copiousCalls = calls;
226 cParms->sendLen = cParms->recvLen = 10000;
227 if (as->parms[aSENDLEN].items)
228 cParms->sendLen = atoi(as->parms[aSENDLEN].items->data);
229 if (as->parms[aRECVLEN].items)
230 cParms->recvLen = atoi(as->parms[aRECVLEN].items->data);
231 if (as->parms[aFASTCALLS].items)
232 cParms->fastCalls = atoi(as->parms[aFASTCALLS].items->data);
233 if (as->parms[aSLOWCALLS].items)
234 cParms->slowCalls = atoi(as->parms[aSLOWCALLS].items->data);
235 if (as->parms[aCOPIOUSCALLS].items)
236 cParms->copiousCalls = atoi(as->parms[aCOPIOUSCALLS].items->data);
237 cParms->repeatInterval = cParms->repeatCount = 0;
238 if (as->parms[aREPEATINTERVAL].items)
239 cParms->repeatInterval =
240 atoi(as->parms[aREPEATINTERVAL].items->data);
241 if (as->parms[aREPEATCOUNT].items)
242 cParms->repeatCount = atoi(as->parms[aREPEATCOUNT].items->data);
243 if (as->parms[aMAXSKEW].items) {
244 maxSkew = atoi(as->parms[aMAXSKEW].items->data);
246 printf("Minimum allowed maxSkew is 1, resetting.\n");
251 cParms->authentication = 0;
252 if (as->parms[aAUTHENTICATION].items)
253 cParms->authentication =
254 StringToAuth(as->parms[aAUTHENTICATION].items->data);
255 cParms->cell = RXKST_CLIENT_CELL;
256 if (as->parms[aCELL].items)
257 cParms->cell = as->parms[aCELL].items->data;
259 code = rxkst_StartClient(cParms);
261 afs_com_err(whoami, code, "StartClient returned");
265 if (as->parms[aSENDLEN].items || as->parms[aRECVLEN].items
266 || as->parms[aFASTCALLS].items || as->parms[aSLOWCALLS].items
267 || as->parms[aCOPIOUSCALLS].items) {
268 code = RXKST_BADARGS;
269 afs_com_err(whoami, code,
270 "send/recv len and # calls are client options");
274 /* donate this LWP to server-side */
287 #ifndef AFS_PTHREAD_ENV
288 PROCESS initialProcess;
290 struct cmd_syndesc *ts;
294 initialize_RXK_error_table();
295 initialize_RKS_error_table();
296 initialize_CMD_error_table();
297 initialize_KTC_error_table();
300 rx_SetRxDeadTime(120);
302 afs_com_err(whoami, code, "can't init Rx");
305 #ifndef AFS_PTHREAD_ENV
307 code = LWP_CurrentProcess(&initialProcess);
309 afs_com_err(whoami, code, "LWP initialization failed");
313 ts = cmd_CreateSyntax(NULL, CommandProc, 0,
314 "run Rx authentication stress test");
315 cmd_AddParm(ts, "-server", CMD_FLAG, CMD_OPTIONAL, "start server");
316 cmd_AddParm(ts, "-client", CMD_SINGLE, CMD_OPTIONAL, "start client");
317 cmd_AddParm(ts, "-sendlen", CMD_SINGLE, CMD_OPTIONAL,
318 "bytes to send to server in Copious call");
319 cmd_AddParm(ts, "-recvlen", CMD_SINGLE, CMD_OPTIONAL,
320 "bytes to request from server in Copious call");
321 cmd_AddParm(ts, "-fastcalls", CMD_SINGLE, CMD_OPTIONAL,
322 "number of fast calls to make");
323 cmd_AddParm(ts, "-slowcalls", CMD_SINGLE, CMD_OPTIONAL,
324 "number of slow calls to make (one second)");
325 cmd_AddParm(ts, "-copiouscalls", CMD_SINGLE, CMD_OPTIONAL,
326 "number of fast calls to make");
327 cmd_AddParm(ts, "-printstatistics", CMD_FLAG, CMD_OPTIONAL,
328 "print statistics before exiting");
329 cmd_AddParm(ts, "-printtimings", CMD_FLAG, CMD_OPTIONAL,
330 "print timing information for calls");
331 cmd_AddParm(ts, "-noexit", CMD_FLAG, CMD_OPTIONAL,
332 "don't exit after successful finish");
333 cmd_AddParm(ts, "-sthreads", CMD_SINGLE, CMD_OPTIONAL,
334 "number server threads");
335 cmd_AddParm(ts, "-cthreads", CMD_SINGLE, CMD_OPTIONAL,
336 "number client threads");
337 cmd_AddParm(ts, "-calltest", CMD_FLAG, CMD_OPTIONAL,
338 "check server's call number verification (this takes about 30 seconds)");
339 cmd_AddParm(ts, "-hijacktest", CMD_FLAG, CMD_OPTIONAL,
340 "check hijack prevention measures by making various modifications to incoming/outgoing packets");
341 cmd_AddParm(ts, "-authentication", CMD_SINGLE, CMD_OPTIONAL,
342 "type of authentication to use; one of: none, clear, auth, crypt");
343 cmd_AddParm(ts, "-minserverauth", CMD_SINGLE, CMD_OPTIONAL,
344 "minimum level of authentication permitted by server");
345 cmd_AddParm(ts, "-repeatinterval", CMD_SINGLE, CMD_OPTIONAL,
346 "seconds between load test activity");
347 cmd_AddParm(ts, "-repeatcount", CMD_SINGLE, CMD_OPTIONAL,
348 "repetitions of load test activity");
349 cmd_AddParm(ts, "-stopserver", CMD_FLAG, CMD_OPTIONAL,
350 "send RPC to cause server to exit");
351 cmd_AddParm(ts, "-trace", CMD_SINGLE, CMD_OPTIONAL,
352 "file for per-call trace info");
353 cmd_AddParm(ts, "-nomd1pkt", CMD_FLAG, CMD_OPTIONAL,
354 "dont prefer one-packet calls");
355 cmd_AddParm(ts, "-noreclaim", CMD_FLAG, CMD_OPTIONAL,
356 "dont aggressively reclaim packets");
357 cmd_AddParm(ts, "-no2dchoice", CMD_FLAG, CMD_OPTIONAL,
358 "disable rx_getcall 2d choice code");
359 cmd_AddParm(ts, "-maxskew", CMD_SINGLE, CMD_OPTIONAL,
360 "max client server skew in seconds");
361 cmd_AddParm(ts, "-usetokens", CMD_FLAG, CMD_OPTIONAL, "use ktc tokens");
362 cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "name of test cell");
363 cmd_AddParm(ts, "-keyfile", CMD_SINGLE, CMD_OPTIONAL,
364 "read server key from file");
366 code = cmd_Dispatch(argc, argv);