1*7ab6e6acSAndroid Build Coastguard Worker /*
2*7ab6e6acSAndroid Build Coastguard Worker * iperf, Copyright (c) 2014-2020, The Regents of the University of
3*7ab6e6acSAndroid Build Coastguard Worker * California, through Lawrence Berkeley National Laboratory (subject
4*7ab6e6acSAndroid Build Coastguard Worker * to receipt of any required approvals from the U.S. Dept. of
5*7ab6e6acSAndroid Build Coastguard Worker * Energy). All rights reserved.
6*7ab6e6acSAndroid Build Coastguard Worker *
7*7ab6e6acSAndroid Build Coastguard Worker * If you have questions about your rights to use or distribute this
8*7ab6e6acSAndroid Build Coastguard Worker * software, please contact Berkeley Lab's Technology Transfer
9*7ab6e6acSAndroid Build Coastguard Worker * Department at [email protected].
10*7ab6e6acSAndroid Build Coastguard Worker *
11*7ab6e6acSAndroid Build Coastguard Worker * NOTICE. This software is owned by the U.S. Department of Energy.
12*7ab6e6acSAndroid Build Coastguard Worker * As such, the U.S. Government has been granted for itself and others
13*7ab6e6acSAndroid Build Coastguard Worker * acting on its behalf a paid-up, nonexclusive, irrevocable,
14*7ab6e6acSAndroid Build Coastguard Worker * worldwide license in the Software to reproduce, prepare derivative
15*7ab6e6acSAndroid Build Coastguard Worker * works, and perform publicly and display publicly. Beginning five
16*7ab6e6acSAndroid Build Coastguard Worker * (5) years after the date permission to assert copyright is obtained
17*7ab6e6acSAndroid Build Coastguard Worker * from the U.S. Department of Energy, and subject to any subsequent
18*7ab6e6acSAndroid Build Coastguard Worker * five (5) year renewals, the U.S. Government is granted for itself
19*7ab6e6acSAndroid Build Coastguard Worker * and others acting on its behalf a paid-up, nonexclusive,
20*7ab6e6acSAndroid Build Coastguard Worker * irrevocable, worldwide license in the Software to reproduce,
21*7ab6e6acSAndroid Build Coastguard Worker * prepare derivative works, distribute copies to the public, perform
22*7ab6e6acSAndroid Build Coastguard Worker * publicly and display publicly, and to permit others to do so.
23*7ab6e6acSAndroid Build Coastguard Worker *
24*7ab6e6acSAndroid Build Coastguard Worker * This code is distributed under a BSD style license, see the LICENSE
25*7ab6e6acSAndroid Build Coastguard Worker * file for complete information.
26*7ab6e6acSAndroid Build Coastguard Worker */
27*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
28*7ab6e6acSAndroid Build Coastguard Worker #include <errno.h>
29*7ab6e6acSAndroid Build Coastguard Worker #include <netdb.h>
30*7ab6e6acSAndroid Build Coastguard Worker #include <string.h>
31*7ab6e6acSAndroid Build Coastguard Worker #include <stdlib.h>
32*7ab6e6acSAndroid Build Coastguard Worker #include <stdarg.h>
33*7ab6e6acSAndroid Build Coastguard Worker #include "iperf.h"
34*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_api.h"
35*7ab6e6acSAndroid Build Coastguard Worker
36*7ab6e6acSAndroid Build Coastguard Worker int gerror;
37*7ab6e6acSAndroid Build Coastguard Worker
38*7ab6e6acSAndroid Build Coastguard Worker char iperf_timestrerr[100];
39*7ab6e6acSAndroid Build Coastguard Worker
40*7ab6e6acSAndroid Build Coastguard Worker /* Do a printf to stderr. */
41*7ab6e6acSAndroid Build Coastguard Worker void
iperf_err(struct iperf_test * test,const char * format,...)42*7ab6e6acSAndroid Build Coastguard Worker iperf_err(struct iperf_test *test, const char *format, ...)
43*7ab6e6acSAndroid Build Coastguard Worker {
44*7ab6e6acSAndroid Build Coastguard Worker va_list argp;
45*7ab6e6acSAndroid Build Coastguard Worker char str[1000];
46*7ab6e6acSAndroid Build Coastguard Worker time_t now;
47*7ab6e6acSAndroid Build Coastguard Worker struct tm *ltm = NULL;
48*7ab6e6acSAndroid Build Coastguard Worker char *ct = NULL;
49*7ab6e6acSAndroid Build Coastguard Worker
50*7ab6e6acSAndroid Build Coastguard Worker /* Timestamp if requested */
51*7ab6e6acSAndroid Build Coastguard Worker if (test != NULL && test->timestamps) {
52*7ab6e6acSAndroid Build Coastguard Worker time(&now);
53*7ab6e6acSAndroid Build Coastguard Worker ltm = localtime(&now);
54*7ab6e6acSAndroid Build Coastguard Worker strftime(iperf_timestrerr, sizeof(iperf_timestrerr), test->timestamp_format, ltm);
55*7ab6e6acSAndroid Build Coastguard Worker ct = iperf_timestrerr;
56*7ab6e6acSAndroid Build Coastguard Worker }
57*7ab6e6acSAndroid Build Coastguard Worker
58*7ab6e6acSAndroid Build Coastguard Worker va_start(argp, format);
59*7ab6e6acSAndroid Build Coastguard Worker vsnprintf(str, sizeof(str), format, argp);
60*7ab6e6acSAndroid Build Coastguard Worker if (test != NULL && test->json_output && test->json_top != NULL)
61*7ab6e6acSAndroid Build Coastguard Worker cJSON_AddStringToObject(test->json_top, "error", str);
62*7ab6e6acSAndroid Build Coastguard Worker else
63*7ab6e6acSAndroid Build Coastguard Worker if (test && test->outfile && test->outfile != stdout) {
64*7ab6e6acSAndroid Build Coastguard Worker if (ct) {
65*7ab6e6acSAndroid Build Coastguard Worker fprintf(test->outfile, "%s", ct);
66*7ab6e6acSAndroid Build Coastguard Worker }
67*7ab6e6acSAndroid Build Coastguard Worker fprintf(test->outfile, "iperf3: %s\n", str);
68*7ab6e6acSAndroid Build Coastguard Worker }
69*7ab6e6acSAndroid Build Coastguard Worker else {
70*7ab6e6acSAndroid Build Coastguard Worker if (ct) {
71*7ab6e6acSAndroid Build Coastguard Worker fprintf(stderr, "%s", ct);
72*7ab6e6acSAndroid Build Coastguard Worker }
73*7ab6e6acSAndroid Build Coastguard Worker fprintf(stderr, "iperf3: %s\n", str);
74*7ab6e6acSAndroid Build Coastguard Worker }
75*7ab6e6acSAndroid Build Coastguard Worker va_end(argp);
76*7ab6e6acSAndroid Build Coastguard Worker }
77*7ab6e6acSAndroid Build Coastguard Worker
78*7ab6e6acSAndroid Build Coastguard Worker /* Do a printf to stderr or log file as appropriate, then exit. */
79*7ab6e6acSAndroid Build Coastguard Worker void
iperf_errexit(struct iperf_test * test,const char * format,...)80*7ab6e6acSAndroid Build Coastguard Worker iperf_errexit(struct iperf_test *test, const char *format, ...)
81*7ab6e6acSAndroid Build Coastguard Worker {
82*7ab6e6acSAndroid Build Coastguard Worker va_list argp;
83*7ab6e6acSAndroid Build Coastguard Worker char str[1000];
84*7ab6e6acSAndroid Build Coastguard Worker time_t now;
85*7ab6e6acSAndroid Build Coastguard Worker struct tm *ltm = NULL;
86*7ab6e6acSAndroid Build Coastguard Worker char *ct = NULL;
87*7ab6e6acSAndroid Build Coastguard Worker
88*7ab6e6acSAndroid Build Coastguard Worker /* Timestamp if requested */
89*7ab6e6acSAndroid Build Coastguard Worker if (test != NULL && test->timestamps) {
90*7ab6e6acSAndroid Build Coastguard Worker time(&now);
91*7ab6e6acSAndroid Build Coastguard Worker ltm = localtime(&now);
92*7ab6e6acSAndroid Build Coastguard Worker strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%c ", ltm);
93*7ab6e6acSAndroid Build Coastguard Worker ct = iperf_timestrerr;
94*7ab6e6acSAndroid Build Coastguard Worker }
95*7ab6e6acSAndroid Build Coastguard Worker
96*7ab6e6acSAndroid Build Coastguard Worker va_start(argp, format);
97*7ab6e6acSAndroid Build Coastguard Worker vsnprintf(str, sizeof(str), format, argp);
98*7ab6e6acSAndroid Build Coastguard Worker if (test != NULL && test->json_output && test->json_top != NULL) {
99*7ab6e6acSAndroid Build Coastguard Worker cJSON_AddStringToObject(test->json_top, "error", str);
100*7ab6e6acSAndroid Build Coastguard Worker iperf_json_finish(test);
101*7ab6e6acSAndroid Build Coastguard Worker } else
102*7ab6e6acSAndroid Build Coastguard Worker if (test && test->outfile && test->outfile != stdout) {
103*7ab6e6acSAndroid Build Coastguard Worker if (ct) {
104*7ab6e6acSAndroid Build Coastguard Worker fprintf(test->outfile, "%s", ct);
105*7ab6e6acSAndroid Build Coastguard Worker }
106*7ab6e6acSAndroid Build Coastguard Worker fprintf(test->outfile, "iperf3: %s\n", str);
107*7ab6e6acSAndroid Build Coastguard Worker }
108*7ab6e6acSAndroid Build Coastguard Worker else {
109*7ab6e6acSAndroid Build Coastguard Worker if (ct) {
110*7ab6e6acSAndroid Build Coastguard Worker fprintf(stderr, "%s", ct);
111*7ab6e6acSAndroid Build Coastguard Worker }
112*7ab6e6acSAndroid Build Coastguard Worker fprintf(stderr, "iperf3: %s\n", str);
113*7ab6e6acSAndroid Build Coastguard Worker }
114*7ab6e6acSAndroid Build Coastguard Worker va_end(argp);
115*7ab6e6acSAndroid Build Coastguard Worker if (test)
116*7ab6e6acSAndroid Build Coastguard Worker iperf_delete_pidfile(test);
117*7ab6e6acSAndroid Build Coastguard Worker exit(1);
118*7ab6e6acSAndroid Build Coastguard Worker }
119*7ab6e6acSAndroid Build Coastguard Worker
120*7ab6e6acSAndroid Build Coastguard Worker int i_errno;
121*7ab6e6acSAndroid Build Coastguard Worker
122*7ab6e6acSAndroid Build Coastguard Worker char *
iperf_strerror(int int_errno)123*7ab6e6acSAndroid Build Coastguard Worker iperf_strerror(int int_errno)
124*7ab6e6acSAndroid Build Coastguard Worker {
125*7ab6e6acSAndroid Build Coastguard Worker static char errstr[256];
126*7ab6e6acSAndroid Build Coastguard Worker int len, perr, herr;
127*7ab6e6acSAndroid Build Coastguard Worker perr = herr = 0;
128*7ab6e6acSAndroid Build Coastguard Worker
129*7ab6e6acSAndroid Build Coastguard Worker len = sizeof(errstr);
130*7ab6e6acSAndroid Build Coastguard Worker memset(errstr, 0, len);
131*7ab6e6acSAndroid Build Coastguard Worker
132*7ab6e6acSAndroid Build Coastguard Worker switch (int_errno) {
133*7ab6e6acSAndroid Build Coastguard Worker case IENONE:
134*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "no error");
135*7ab6e6acSAndroid Build Coastguard Worker break;
136*7ab6e6acSAndroid Build Coastguard Worker case IESERVCLIENT:
137*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "cannot be both server and client");
138*7ab6e6acSAndroid Build Coastguard Worker break;
139*7ab6e6acSAndroid Build Coastguard Worker case IENOROLE:
140*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "must either be a client (-c) or server (-s)");
141*7ab6e6acSAndroid Build Coastguard Worker break;
142*7ab6e6acSAndroid Build Coastguard Worker case IESERVERONLY:
143*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "some option you are trying to set is server only");
144*7ab6e6acSAndroid Build Coastguard Worker break;
145*7ab6e6acSAndroid Build Coastguard Worker case IECLIENTONLY:
146*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "some option you are trying to set is client only");
147*7ab6e6acSAndroid Build Coastguard Worker break;
148*7ab6e6acSAndroid Build Coastguard Worker case IEDURATION:
149*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
150*7ab6e6acSAndroid Build Coastguard Worker break;
151*7ab6e6acSAndroid Build Coastguard Worker case IENUMSTREAMS:
152*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
153*7ab6e6acSAndroid Build Coastguard Worker break;
154*7ab6e6acSAndroid Build Coastguard Worker case IEBLOCKSIZE:
155*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
156*7ab6e6acSAndroid Build Coastguard Worker break;
157*7ab6e6acSAndroid Build Coastguard Worker case IEBUFSIZE:
158*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
159*7ab6e6acSAndroid Build Coastguard Worker break;
160*7ab6e6acSAndroid Build Coastguard Worker case IEINTERVAL:
161*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
162*7ab6e6acSAndroid Build Coastguard Worker break;
163*7ab6e6acSAndroid Build Coastguard Worker case IEBIND: /* UNUSED */
164*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "--bind must be specified to use --cport");
165*7ab6e6acSAndroid Build Coastguard Worker break;
166*7ab6e6acSAndroid Build Coastguard Worker case IEUDPBLOCKSIZE:
167*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "block size invalid (minimum = %d bytes, maximum = %d bytes)", MIN_UDP_BLOCKSIZE, MAX_UDP_BLOCKSIZE);
168*7ab6e6acSAndroid Build Coastguard Worker break;
169*7ab6e6acSAndroid Build Coastguard Worker case IEBADTOS:
170*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "bad TOS value (must be between 0 and 255 inclusive)");
171*7ab6e6acSAndroid Build Coastguard Worker break;
172*7ab6e6acSAndroid Build Coastguard Worker case IESETCLIENTAUTH:
173*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "you must specify a username, password, and path to a valid RSA public key");
174*7ab6e6acSAndroid Build Coastguard Worker break;
175*7ab6e6acSAndroid Build Coastguard Worker case IESETSERVERAUTH:
176*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "you must specify a path to a valid RSA private key and a user credential file");
177*7ab6e6acSAndroid Build Coastguard Worker break;
178*7ab6e6acSAndroid Build Coastguard Worker case IEBADFORMAT:
179*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])");
180*7ab6e6acSAndroid Build Coastguard Worker break;
181*7ab6e6acSAndroid Build Coastguard Worker case IEBADPORT:
182*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "port number must be between 1 and 65535 inclusive");
183*7ab6e6acSAndroid Build Coastguard Worker break;
184*7ab6e6acSAndroid Build Coastguard Worker case IEMSS:
185*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
186*7ab6e6acSAndroid Build Coastguard Worker break;
187*7ab6e6acSAndroid Build Coastguard Worker case IENOSENDFILE:
188*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "this OS does not support sendfile");
189*7ab6e6acSAndroid Build Coastguard Worker break;
190*7ab6e6acSAndroid Build Coastguard Worker case IEOMIT:
191*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "bogus value for --omit");
192*7ab6e6acSAndroid Build Coastguard Worker break;
193*7ab6e6acSAndroid Build Coastguard Worker case IEUNIMP:
194*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "an option you are trying to set is not implemented yet");
195*7ab6e6acSAndroid Build Coastguard Worker break;
196*7ab6e6acSAndroid Build Coastguard Worker case IEFILE:
197*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to open -F file");
198*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
199*7ab6e6acSAndroid Build Coastguard Worker break;
200*7ab6e6acSAndroid Build Coastguard Worker case IEBURST:
201*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
202*7ab6e6acSAndroid Build Coastguard Worker break;
203*7ab6e6acSAndroid Build Coastguard Worker case IEENDCONDITIONS:
204*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
205*7ab6e6acSAndroid Build Coastguard Worker break;
206*7ab6e6acSAndroid Build Coastguard Worker case IELOGFILE:
207*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to open log file");
208*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
209*7ab6e6acSAndroid Build Coastguard Worker break;
210*7ab6e6acSAndroid Build Coastguard Worker case IENOSCTP:
211*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "no SCTP support available");
212*7ab6e6acSAndroid Build Coastguard Worker break;
213*7ab6e6acSAndroid Build Coastguard Worker case IENEWTEST:
214*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to create a new test");
215*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
216*7ab6e6acSAndroid Build Coastguard Worker break;
217*7ab6e6acSAndroid Build Coastguard Worker case IEINITTEST:
218*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "test initialization failed");
219*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
220*7ab6e6acSAndroid Build Coastguard Worker break;
221*7ab6e6acSAndroid Build Coastguard Worker case IEAUTHTEST:
222*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "test authorization failed");
223*7ab6e6acSAndroid Build Coastguard Worker break;
224*7ab6e6acSAndroid Build Coastguard Worker case IELISTEN:
225*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to start listener for connections");
226*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
227*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
228*7ab6e6acSAndroid Build Coastguard Worker break;
229*7ab6e6acSAndroid Build Coastguard Worker case IECONNECT:
230*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to connect to server");
231*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
232*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
233*7ab6e6acSAndroid Build Coastguard Worker break;
234*7ab6e6acSAndroid Build Coastguard Worker case IEACCEPT:
235*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to accept connection from client");
236*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
237*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
238*7ab6e6acSAndroid Build Coastguard Worker break;
239*7ab6e6acSAndroid Build Coastguard Worker case IESENDCOOKIE:
240*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to send cookie to server");
241*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
242*7ab6e6acSAndroid Build Coastguard Worker break;
243*7ab6e6acSAndroid Build Coastguard Worker case IERECVCOOKIE:
244*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to receive cookie at server");
245*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
246*7ab6e6acSAndroid Build Coastguard Worker break;
247*7ab6e6acSAndroid Build Coastguard Worker case IECTRLWRITE:
248*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to write to the control socket");
249*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
250*7ab6e6acSAndroid Build Coastguard Worker break;
251*7ab6e6acSAndroid Build Coastguard Worker case IECTRLREAD:
252*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to read from the control socket");
253*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
254*7ab6e6acSAndroid Build Coastguard Worker break;
255*7ab6e6acSAndroid Build Coastguard Worker case IECTRLCLOSE:
256*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "control socket has closed unexpectedly");
257*7ab6e6acSAndroid Build Coastguard Worker break;
258*7ab6e6acSAndroid Build Coastguard Worker case IEMESSAGE:
259*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "received an unknown control message");
260*7ab6e6acSAndroid Build Coastguard Worker break;
261*7ab6e6acSAndroid Build Coastguard Worker case IESENDMESSAGE:
262*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to send control message");
263*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
264*7ab6e6acSAndroid Build Coastguard Worker break;
265*7ab6e6acSAndroid Build Coastguard Worker case IERECVMESSAGE:
266*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to receive control message");
267*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
268*7ab6e6acSAndroid Build Coastguard Worker break;
269*7ab6e6acSAndroid Build Coastguard Worker case IESENDPARAMS:
270*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to send parameters to server");
271*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
272*7ab6e6acSAndroid Build Coastguard Worker break;
273*7ab6e6acSAndroid Build Coastguard Worker case IERECVPARAMS:
274*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to receive parameters from client");
275*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
276*7ab6e6acSAndroid Build Coastguard Worker break;
277*7ab6e6acSAndroid Build Coastguard Worker case IEPACKAGERESULTS:
278*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to package results");
279*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
280*7ab6e6acSAndroid Build Coastguard Worker break;
281*7ab6e6acSAndroid Build Coastguard Worker case IESENDRESULTS:
282*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to send results");
283*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
284*7ab6e6acSAndroid Build Coastguard Worker break;
285*7ab6e6acSAndroid Build Coastguard Worker case IERECVRESULTS:
286*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to receive results");
287*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
288*7ab6e6acSAndroid Build Coastguard Worker break;
289*7ab6e6acSAndroid Build Coastguard Worker case IESELECT:
290*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "select failed");
291*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
292*7ab6e6acSAndroid Build Coastguard Worker break;
293*7ab6e6acSAndroid Build Coastguard Worker case IECLIENTTERM:
294*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "the client has terminated");
295*7ab6e6acSAndroid Build Coastguard Worker break;
296*7ab6e6acSAndroid Build Coastguard Worker case IESERVERTERM:
297*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "the server has terminated");
298*7ab6e6acSAndroid Build Coastguard Worker break;
299*7ab6e6acSAndroid Build Coastguard Worker case IEACCESSDENIED:
300*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "the server is busy running a test. try again later");
301*7ab6e6acSAndroid Build Coastguard Worker break;
302*7ab6e6acSAndroid Build Coastguard Worker case IESETNODELAY:
303*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set TCP/SCTP NODELAY");
304*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
305*7ab6e6acSAndroid Build Coastguard Worker break;
306*7ab6e6acSAndroid Build Coastguard Worker case IESETMSS:
307*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set TCP/SCTP MSS");
308*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
309*7ab6e6acSAndroid Build Coastguard Worker break;
310*7ab6e6acSAndroid Build Coastguard Worker case IESETBUF:
311*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set socket buffer size");
312*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
313*7ab6e6acSAndroid Build Coastguard Worker break;
314*7ab6e6acSAndroid Build Coastguard Worker case IESETTOS:
315*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set IP TOS");
316*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
317*7ab6e6acSAndroid Build Coastguard Worker break;
318*7ab6e6acSAndroid Build Coastguard Worker case IESETCOS:
319*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set IPv6 traffic class");
320*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
321*7ab6e6acSAndroid Build Coastguard Worker break;
322*7ab6e6acSAndroid Build Coastguard Worker case IESETFLOW:
323*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set IPv6 flow label");
324*7ab6e6acSAndroid Build Coastguard Worker break;
325*7ab6e6acSAndroid Build Coastguard Worker case IEREUSEADDR:
326*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to reuse address on socket");
327*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
328*7ab6e6acSAndroid Build Coastguard Worker break;
329*7ab6e6acSAndroid Build Coastguard Worker case IENONBLOCKING:
330*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set socket to non-blocking");
331*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
332*7ab6e6acSAndroid Build Coastguard Worker break;
333*7ab6e6acSAndroid Build Coastguard Worker case IESETWINDOWSIZE:
334*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set socket window size");
335*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
336*7ab6e6acSAndroid Build Coastguard Worker break;
337*7ab6e6acSAndroid Build Coastguard Worker case IEPROTOCOL:
338*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "protocol does not exist");
339*7ab6e6acSAndroid Build Coastguard Worker break;
340*7ab6e6acSAndroid Build Coastguard Worker case IEAFFINITY:
341*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set CPU affinity");
342*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
343*7ab6e6acSAndroid Build Coastguard Worker break;
344*7ab6e6acSAndroid Build Coastguard Worker case IEDAEMON:
345*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to become a daemon");
346*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
347*7ab6e6acSAndroid Build Coastguard Worker break;
348*7ab6e6acSAndroid Build Coastguard Worker case IECREATESTREAM:
349*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to create a new stream");
350*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
351*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
352*7ab6e6acSAndroid Build Coastguard Worker break;
353*7ab6e6acSAndroid Build Coastguard Worker case IEINITSTREAM:
354*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to initialize stream");
355*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
356*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
357*7ab6e6acSAndroid Build Coastguard Worker break;
358*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMLISTEN:
359*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to start stream listener");
360*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
361*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
362*7ab6e6acSAndroid Build Coastguard Worker break;
363*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMCONNECT:
364*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to connect stream");
365*7ab6e6acSAndroid Build Coastguard Worker herr = 1;
366*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
367*7ab6e6acSAndroid Build Coastguard Worker break;
368*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMACCEPT:
369*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to accept stream connection");
370*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
371*7ab6e6acSAndroid Build Coastguard Worker break;
372*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMWRITE:
373*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to write to stream socket");
374*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
375*7ab6e6acSAndroid Build Coastguard Worker break;
376*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMREAD:
377*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to read from stream socket");
378*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
379*7ab6e6acSAndroid Build Coastguard Worker break;
380*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMCLOSE:
381*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "stream socket has closed unexpectedly");
382*7ab6e6acSAndroid Build Coastguard Worker break;
383*7ab6e6acSAndroid Build Coastguard Worker case IESTREAMID:
384*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "stream has an invalid id");
385*7ab6e6acSAndroid Build Coastguard Worker break;
386*7ab6e6acSAndroid Build Coastguard Worker case IENEWTIMER:
387*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to create new timer");
388*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
389*7ab6e6acSAndroid Build Coastguard Worker break;
390*7ab6e6acSAndroid Build Coastguard Worker case IEUPDATETIMER:
391*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to update timer");
392*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
393*7ab6e6acSAndroid Build Coastguard Worker break;
394*7ab6e6acSAndroid Build Coastguard Worker case IESETCONGESTION:
395*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set TCP_CONGESTION: "
396*7ab6e6acSAndroid Build Coastguard Worker "Supplied congestion control algorithm not supported on this host");
397*7ab6e6acSAndroid Build Coastguard Worker break;
398*7ab6e6acSAndroid Build Coastguard Worker case IEPIDFILE:
399*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to write PID file");
400*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
401*7ab6e6acSAndroid Build Coastguard Worker break;
402*7ab6e6acSAndroid Build Coastguard Worker case IEV6ONLY:
403*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
404*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
405*7ab6e6acSAndroid Build Coastguard Worker break;
406*7ab6e6acSAndroid Build Coastguard Worker case IESETSCTPDISABLEFRAG:
407*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS");
408*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
409*7ab6e6acSAndroid Build Coastguard Worker break;
410*7ab6e6acSAndroid Build Coastguard Worker case IESETSCTPNSTREAM:
411*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n");
412*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
413*7ab6e6acSAndroid Build Coastguard Worker break;
414*7ab6e6acSAndroid Build Coastguard Worker case IESETPACING:
415*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "unable to set socket pacing");
416*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
417*7ab6e6acSAndroid Build Coastguard Worker break;
418*7ab6e6acSAndroid Build Coastguard Worker case IESETBUF2:
419*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "socket buffer size not set correctly");
420*7ab6e6acSAndroid Build Coastguard Worker break;
421*7ab6e6acSAndroid Build Coastguard Worker case IEREVERSEBIDIR:
422*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "cannot be both reverse and bidirectional");
423*7ab6e6acSAndroid Build Coastguard Worker break;
424*7ab6e6acSAndroid Build Coastguard Worker case IETOTALRATE:
425*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "total required bandwidth is larger than server limit");
426*7ab6e6acSAndroid Build Coastguard Worker break;
427*7ab6e6acSAndroid Build Coastguard Worker default:
428*7ab6e6acSAndroid Build Coastguard Worker snprintf(errstr, len, "int_errno=%d", int_errno);
429*7ab6e6acSAndroid Build Coastguard Worker perr = 1;
430*7ab6e6acSAndroid Build Coastguard Worker break;
431*7ab6e6acSAndroid Build Coastguard Worker }
432*7ab6e6acSAndroid Build Coastguard Worker
433*7ab6e6acSAndroid Build Coastguard Worker /* Append the result of strerror() or gai_strerror() if appropriate */
434*7ab6e6acSAndroid Build Coastguard Worker if (herr || perr)
435*7ab6e6acSAndroid Build Coastguard Worker strncat(errstr, ": ", len - strlen(errstr) - 1);
436*7ab6e6acSAndroid Build Coastguard Worker if (errno && perr)
437*7ab6e6acSAndroid Build Coastguard Worker strncat(errstr, strerror(errno), len - strlen(errstr) - 1);
438*7ab6e6acSAndroid Build Coastguard Worker else if (herr && gerror) {
439*7ab6e6acSAndroid Build Coastguard Worker strncat(errstr, gai_strerror(gerror), len - strlen(errstr) - 1);
440*7ab6e6acSAndroid Build Coastguard Worker gerror = 0;
441*7ab6e6acSAndroid Build Coastguard Worker }
442*7ab6e6acSAndroid Build Coastguard Worker
443*7ab6e6acSAndroid Build Coastguard Worker return errstr;
444*7ab6e6acSAndroid Build Coastguard Worker }
445