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(struct cmd_syndesc *as, void *arock)
110 int startServer = (as->parms[aSERVER].items != 0);
111 int startClient = (as->parms[aCLIENT].items != 0);
112 #ifndef AFS_PTHREAD_ENV
115 struct serverParms *sParms;
116 struct clientParms *cParms;
118 sParms = (struct serverParms *)osi_Alloc(sizeof(*sParms));
119 cParms = (struct clientParms *)osi_Alloc(sizeof(*cParms));
120 memset(sParms, 0, sizeof(*sParms));
121 memset(cParms, 0, sizeof(*cParms));
122 sParms->whoami = cParms->whoami = whoami;
124 if (!(startServer || startClient)) {
125 /* Default to "-server -client <localhost>" */
126 gethostname(cParms->server, sizeof(cParms->server));
127 startServer = startClient = 1;
131 cParms->printStats = (as->parms[aPRINTSTATS].items != 0);
132 cParms->printTiming = (as->parms[aPRINTTIMING].items != 0);
133 cParms->noExit = (as->parms[aNOEXIT].items != 0);
134 cParms->callTest = (as->parms[aCALLTEST].items != 0);
135 cParms->hijackTest = (as->parms[aHIJACKTEST].items != 0);
136 cParms->stopServer = (as->parms[aSTOPSERVER].items != 0);
137 cParms->useTokens = (as->parms[aUSETOKENS].items != 0);
139 if (as->parms[aMELT1b].items)
141 if (as->parms[aRECLAIM].items)
143 if (as->parms[a2DCHOICE].items)
147 if (as->parms[aTRACE].items) {
148 extern char rxi_tracename[];
149 strcpy(rxi_tracename, as->parms[aTRACE].items->data);
152 /* These options not compatible with -server */
153 if (cParms->stopServer) {
154 code = RXKST_BADARGS;
155 afs_com_err(whoami, code, "stop server not compatible with -client");
159 /* process -server options */
160 sParms->threads = 3; /* one less than channels/conn */
161 if (as->parms[aSTHREADS].items)
162 sParms->threads = atoi(as->parms[aSTHREADS].items->data);
163 sParms->authentication = 0;
164 if (as->parms[aMINSERVERAUTH].items)
165 sParms->authentication =
166 StringToAuth(as->parms[aMINSERVERAUTH].items->data);
167 if (as->parms[aKEYFILE].items)
168 sParms->keyfile = as->parms[aKEYFILE].items->data;
170 #ifdef AFS_PTHREAD_ENV
173 pthread_attr_t tattr;
175 code = pthread_attr_init(&tattr);
177 afs_com_err(whoami, code,
178 "can't pthread_attr_init server process");
183 pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
185 afs_com_err(whoami, code,
186 "can't pthread_attr_setdetachstate server process");
191 pthread_create(&serverID, &tattr, rxkst_StartServer,
196 LWP_CreateProcess(rxkst_StartServer, 16000, LWP_NORMAL_PRIORITY,
197 (opaque) sParms, "Server Process", &pid);
200 afs_com_err(whoami, code, "can't create server process");
204 /* check for server-only args */
208 u_long calls; /* default number of calls */
210 /* process -client options */
211 if (as->parms[aCLIENT].items)
212 lcstring(cParms->server, as->parms[aCLIENT].items->data,
213 sizeof(cParms->server));
214 cParms->threads = 6; /* 150% of channels/conn */
215 if (as->parms[aCTHREADS].items)
216 cParms->threads = atoi(as->parms[aCTHREADS].items->data);
217 if (cParms->callTest || cParms->hijackTest || cParms->printTiming
218 || cParms->stopServer)
222 cParms->fastCalls = cParms->slowCalls = cParms->copiousCalls = calls;
224 cParms->sendLen = cParms->recvLen = 10000;
225 if (as->parms[aSENDLEN].items)
226 cParms->sendLen = atoi(as->parms[aSENDLEN].items->data);
227 if (as->parms[aRECVLEN].items)
228 cParms->recvLen = atoi(as->parms[aRECVLEN].items->data);
229 if (as->parms[aFASTCALLS].items)
230 cParms->fastCalls = atoi(as->parms[aFASTCALLS].items->data);
231 if (as->parms[aSLOWCALLS].items)
232 cParms->slowCalls = atoi(as->parms[aSLOWCALLS].items->data);
233 if (as->parms[aCOPIOUSCALLS].items)
234 cParms->copiousCalls = atoi(as->parms[aCOPIOUSCALLS].items->data);
235 cParms->repeatInterval = cParms->repeatCount = 0;
236 if (as->parms[aREPEATINTERVAL].items)
237 cParms->repeatInterval =
238 atoi(as->parms[aREPEATINTERVAL].items->data);
239 if (as->parms[aREPEATCOUNT].items)
240 cParms->repeatCount = atoi(as->parms[aREPEATCOUNT].items->data);
241 if (as->parms[aMAXSKEW].items) {
242 maxSkew = atoi(as->parms[aMAXSKEW].items->data);
244 printf("Minimum allowed maxSkew is 1, resetting.\n");
249 cParms->authentication = 0;
250 if (as->parms[aAUTHENTICATION].items)
251 cParms->authentication =
252 StringToAuth(as->parms[aAUTHENTICATION].items->data);
253 cParms->cell = RXKST_CLIENT_CELL;
254 if (as->parms[aCELL].items)
255 cParms->cell = as->parms[aCELL].items->data;
257 code = rxkst_StartClient(cParms);
259 afs_com_err(whoami, code, "StartClient returned");
263 if (as->parms[aSENDLEN].items || as->parms[aRECVLEN].items
264 || as->parms[aFASTCALLS].items || as->parms[aSLOWCALLS].items
265 || as->parms[aCOPIOUSCALLS].items) {
266 code = RXKST_BADARGS;
267 afs_com_err(whoami, code,
268 "send/recv len and # calls are client options");
272 /* donate this LWP to server-side */
285 #ifndef AFS_PTHREAD_ENV
286 PROCESS initialProcess;
288 struct cmd_syndesc *ts;
292 initialize_RXK_error_table();
293 initialize_RKS_error_table();
294 initialize_CMD_error_table();
295 initialize_KTC_error_table();
298 rx_SetRxDeadTime(120);
300 afs_com_err(whoami, code, "can't init Rx");
303 #ifndef AFS_PTHREAD_ENV
305 code = LWP_CurrentProcess(&initialProcess);
307 afs_com_err(whoami, code, "LWP initialization failed");
311 ts = cmd_CreateSyntax(NULL, CommandProc, NULL,
312 "run Rx authentication stress test");
313 cmd_AddParm(ts, "-server", CMD_FLAG, CMD_OPTIONAL, "start server");
314 cmd_AddParm(ts, "-client", CMD_SINGLE, CMD_OPTIONAL, "start client");
315 cmd_AddParm(ts, "-sendlen", CMD_SINGLE, CMD_OPTIONAL,
316 "bytes to send to server in Copious call");
317 cmd_AddParm(ts, "-recvlen", CMD_SINGLE, CMD_OPTIONAL,
318 "bytes to request from server in Copious call");
319 cmd_AddParm(ts, "-fastcalls", CMD_SINGLE, CMD_OPTIONAL,
320 "number of fast calls to make");
321 cmd_AddParm(ts, "-slowcalls", CMD_SINGLE, CMD_OPTIONAL,
322 "number of slow calls to make (one second)");
323 cmd_AddParm(ts, "-copiouscalls", CMD_SINGLE, CMD_OPTIONAL,
324 "number of fast calls to make");
325 cmd_AddParm(ts, "-printstatistics", CMD_FLAG, CMD_OPTIONAL,
326 "print statistics before exiting");
327 cmd_AddParm(ts, "-printtimings", CMD_FLAG, CMD_OPTIONAL,
328 "print timing information for calls");
329 cmd_AddParm(ts, "-noexit", CMD_FLAG, CMD_OPTIONAL,
330 "don't exit after successful finish");
331 cmd_AddParm(ts, "-sthreads", CMD_SINGLE, CMD_OPTIONAL,
332 "number server threads");
333 cmd_AddParm(ts, "-cthreads", CMD_SINGLE, CMD_OPTIONAL,
334 "number client threads");
335 cmd_AddParm(ts, "-calltest", CMD_FLAG, CMD_OPTIONAL,
336 "check server's call number verification (this takes about 30 seconds)");
337 cmd_AddParm(ts, "-hijacktest", CMD_FLAG, CMD_OPTIONAL,
338 "check hijack prevention measures by making various modifications to incoming/outgoing packets");
339 cmd_AddParm(ts, "-authentication", CMD_SINGLE, CMD_OPTIONAL,
340 "type of authentication to use; one of: none, clear, auth, crypt");
341 cmd_AddParm(ts, "-minserverauth", CMD_SINGLE, CMD_OPTIONAL,
342 "minimum level of authentication permitted by server");
343 cmd_AddParm(ts, "-repeatinterval", CMD_SINGLE, CMD_OPTIONAL,
344 "seconds between load test activity");
345 cmd_AddParm(ts, "-repeatcount", CMD_SINGLE, CMD_OPTIONAL,
346 "repetitions of load test activity");
347 cmd_AddParm(ts, "-stopserver", CMD_FLAG, CMD_OPTIONAL,
348 "send RPC to cause server to exit");
349 cmd_AddParm(ts, "-trace", CMD_SINGLE, CMD_OPTIONAL,
350 "file for per-call trace info");
351 cmd_AddParm(ts, "-nomd1pkt", CMD_FLAG, CMD_OPTIONAL,
352 "dont prefer one-packet calls");
353 cmd_AddParm(ts, "-noreclaim", CMD_FLAG, CMD_OPTIONAL,
354 "dont aggressively reclaim packets");
355 cmd_AddParm(ts, "-no2dchoice", CMD_FLAG, CMD_OPTIONAL,
356 "disable rx_getcall 2d choice code");
357 cmd_AddParm(ts, "-maxskew", CMD_SINGLE, CMD_OPTIONAL,
358 "max client server skew in seconds");
359 cmd_AddParm(ts, "-usetokens", CMD_FLAG, CMD_OPTIONAL, "use ktc tokens");
360 cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "name of test cell");
361 cmd_AddParm(ts, "-keyfile", CMD_SINGLE, CMD_OPTIONAL,
362 "read server key from file");
364 code = cmd_Dispatch(argc, argv);