xref: /iperf/src/iperf_error.c (revision 4874c4a8)
1 /*
2  * iperf, Copyright (c) 2014, 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) {
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) {
71 	    fprintf(test->outfile, "iperf3: %s\n", str);
72 	}
73 	else {
74 	    fprintf(stderr, "iperf3: %s\n", str);
75 	}
76     va_end(argp);
77     iperf_delete_pidfile(test);
78     exit(1);
79 }
80 
81 int i_errno;
82 
83 char *
84 iperf_strerror(int i_errno)
85 {
86     static char errstr[256];
87     int len, perr, herr;
88     perr = herr = 0;
89 
90     len = sizeof(errstr);
91     memset(errstr, 0, len);
92 
93     switch (i_errno) {
94         case IENONE:
95             snprintf(errstr, len, "no error");
96             break;
97         case IESERVCLIENT:
98             snprintf(errstr, len, "cannot be both server and client");
99             break;
100         case IENOROLE:
101             snprintf(errstr, len, "must either be a client (-c) or server (-s)");
102             break;
103         case IESERVERONLY:
104             snprintf(errstr, len, "some option you are trying to set is server only");
105             break;
106         case IECLIENTONLY:
107             snprintf(errstr, len, "some option you are trying to set is client only");
108             break;
109         case IEDURATION:
110             snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
111             break;
112         case IENUMSTREAMS:
113             snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
114             break;
115         case IEBLOCKSIZE:
116             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
117             break;
118         case IEBUFSIZE:
119             snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
120             break;
121         case IEINTERVAL:
122             snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
123             break;
124         case IEBIND:
125             snprintf(errstr, len, "--bind must be specified to use --cport");
126             break;
127         case IEUDPBLOCKSIZE:
128             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_UDP_BLOCKSIZE);
129             break;
130         case IEMSS:
131             snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
132             break;
133         case IENOSENDFILE:
134             snprintf(errstr, len, "this OS does not support sendfile");
135             break;
136         case IEOMIT:
137             snprintf(errstr, len, "bogus value for --omit");
138             break;
139         case IEUNIMP:
140             snprintf(errstr, len, "an option you are trying to set is not implemented yet");
141             break;
142         case IEFILE:
143             snprintf(errstr, len, "unable to open -F file");
144             perr = 1;
145             break;
146         case IEBURST:
147             snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
148             break;
149         case IEENDCONDITIONS:
150             snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
151             break;
152 	case IELOGFILE:
153 	    snprintf(errstr, len, "unable to open log file");
154 	    perr = 1;
155 	    break;
156 	case IENOSCTP:
157 	    snprintf(errstr, len, "no SCTP support available");
158 	    break;
159         case IENEWTEST:
160             snprintf(errstr, len, "unable to create a new test");
161             perr = 1;
162             break;
163         case IEINITTEST:
164             snprintf(errstr, len, "test initialization failed");
165             perr = 1;
166             break;
167         case IELISTEN:
168             snprintf(errstr, len, "unable to start listener for connections");
169             perr = 1;
170             break;
171         case IECONNECT:
172             snprintf(errstr, len, "unable to connect to server");
173             perr = 1;
174             break;
175         case IEACCEPT:
176             snprintf(errstr, len, "unable to accept connection from client");
177             herr = 1;
178             perr = 1;
179             break;
180         case IESENDCOOKIE:
181             snprintf(errstr, len, "unable to send cookie to server");
182             perr = 1;
183             break;
184         case IERECVCOOKIE:
185             snprintf(errstr, len, "unable to receive cookie at server");
186             perr = 1;
187             break;
188         case IECTRLWRITE:
189             snprintf(errstr, len, "unable to write to the control socket");
190             perr = 1;
191             break;
192         case IECTRLREAD:
193             snprintf(errstr, len, "unable to read from the control socket");
194             perr = 1;
195             break;
196         case IECTRLCLOSE:
197             snprintf(errstr, len, "control socket has closed unexpectedly");
198             break;
199         case IEMESSAGE:
200             snprintf(errstr, len, "received an unknown control message");
201             break;
202         case IESENDMESSAGE:
203             snprintf(errstr, len, "unable to send control message");
204             perr = 1;
205             break;
206         case IERECVMESSAGE:
207             snprintf(errstr, len, "unable to receive control message");
208             perr = 1;
209             break;
210         case IESENDPARAMS:
211             snprintf(errstr, len, "unable to send parameters to server");
212             perr = 1;
213             break;
214         case IERECVPARAMS:
215             snprintf(errstr, len, "unable to receive parameters from client");
216             perr = 1;
217             break;
218         case IEPACKAGERESULTS:
219             snprintf(errstr, len, "unable to package results");
220             perr = 1;
221             break;
222         case IESENDRESULTS:
223             snprintf(errstr, len, "unable to send results");
224             perr = 1;
225             break;
226         case IERECVRESULTS:
227             snprintf(errstr, len, "unable to receive results");
228             perr = 1;
229             break;
230         case IESELECT:
231             snprintf(errstr, len, "select failed");
232             perr = 1;
233             break;
234         case IECLIENTTERM:
235             snprintf(errstr, len, "the client has terminated");
236             break;
237         case IESERVERTERM:
238             snprintf(errstr, len, "the server has terminated");
239             break;
240         case IEACCESSDENIED:
241             snprintf(errstr, len, "the server is busy running a test. try again later");
242             break;
243         case IESETNODELAY:
244             snprintf(errstr, len, "unable to set TCP/SCTP NODELAY");
245             perr = 1;
246             break;
247         case IESETMSS:
248             snprintf(errstr, len, "unable to set TCP/SCTP MSS");
249             perr = 1;
250             break;
251         case IESETBUF:
252             snprintf(errstr, len, "unable to set socket buffer size");
253             perr = 1;
254             break;
255         case IESETTOS:
256             snprintf(errstr, len, "unable to set IP TOS");
257             perr = 1;
258             break;
259         case IESETCOS:
260             snprintf(errstr, len, "unable to set IPv6 traffic class");
261             perr = 1;
262             break;
263         case IESETFLOW:
264             snprintf(errstr, len, "unable to set IPv6 flow label");
265             break;
266         case IEREUSEADDR:
267             snprintf(errstr, len, "unable to reuse address on socket");
268             perr = 1;
269             break;
270         case IENONBLOCKING:
271             snprintf(errstr, len, "unable to set socket to non-blocking");
272             perr = 1;
273             break;
274         case IESETWINDOWSIZE:
275             snprintf(errstr, len, "unable to set socket window size");
276             perr = 1;
277             break;
278         case IEPROTOCOL:
279             snprintf(errstr, len, "protocol does not exist");
280             break;
281         case IEAFFINITY:
282             snprintf(errstr, len, "unable to set CPU affinity");
283             perr = 1;
284             break;
285 	case IEDAEMON:
286 	    snprintf(errstr, len, "unable to become a daemon");
287 	    perr = 1;
288 	    break;
289         case IECREATESTREAM:
290             snprintf(errstr, len, "unable to create a new stream");
291             herr = 1;
292             perr = 1;
293             break;
294         case IEINITSTREAM:
295             snprintf(errstr, len, "unable to initialize stream");
296             herr = 1;
297             perr = 1;
298             break;
299         case IESTREAMLISTEN:
300             snprintf(errstr, len, "unable to start stream listener");
301             perr = 1;
302             break;
303         case IESTREAMCONNECT:
304             snprintf(errstr, len, "unable to connect stream");
305             herr = 1;
306             perr = 1;
307             break;
308         case IESTREAMACCEPT:
309             snprintf(errstr, len, "unable to accept stream connection");
310             perr = 1;
311             break;
312         case IESTREAMWRITE:
313             snprintf(errstr, len, "unable to write to stream socket");
314             perr = 1;
315             break;
316         case IESTREAMREAD:
317             snprintf(errstr, len, "unable to read from stream socket");
318             perr = 1;
319             break;
320         case IESTREAMCLOSE:
321             snprintf(errstr, len, "stream socket has closed unexpectedly");
322             break;
323         case IESTREAMID:
324             snprintf(errstr, len, "stream has an invalid id");
325             break;
326         case IENEWTIMER:
327             snprintf(errstr, len, "unable to create new timer");
328             perr = 1;
329             break;
330         case IEUPDATETIMER:
331             snprintf(errstr, len, "unable to update timer");
332             perr = 1;
333             break;
334         case IESETCONGESTION:
335             snprintf(errstr, len, "unable to set TCP_CONGESTION: "
336                                   "Supplied congestion control algorithm not supported on this host");
337             break;
338 	case IEPIDFILE:
339             snprintf(errstr, len, "unable to write PID file");
340             perr = 1;
341             break;
342 	case IEV6ONLY:
343 	    snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
344 	    perr = 1;
345 	    break;
346         case IESETSCTPDISABLEFRAG:
347             snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS");
348             perr = 1;
349             break;
350         case IESETSCTPNSTREAM:
351             snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n");
352             perr = 1;
353             break;
354     }
355 
356     if (herr || perr)
357         strncat(errstr, ": ", len - strlen(errstr) - 1);
358     if (h_errno && herr) {
359         strncat(errstr, hstrerror(h_errno), len - strlen(errstr) - 1);
360     } else if (errno && perr) {
361         strncat(errstr, strerror(errno), len - strlen(errstr) - 1);
362     }
363 
364     return errstr;
365 }
366