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