xref: /iperf/src/iperf_error.c (revision 60bd98a5)
1 /*
2  * Copyright (c) 2009-2014, The Regents of the University of California,
3  * through Lawrence Berkeley National Laboratory (subject to receipt of any
4  * required approvals from the U.S. Dept. of Energy).  All rights reserved.
5  *
6  * This code is distributed under a BSD style license, see the LICENSE file
7  * for complete information.
8  */
9 
10 #include <stdio.h>
11 #include <errno.h>
12 #include <netdb.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <stdarg.h>
16 #include "iperf.h"
17 #include "iperf_api.h"
18 
19 /* Do a printf to stderr. */
20 void
21 iperf_err(struct iperf_test *test, const char *format, ...)
22 {
23     va_list argp;
24     char str[1000];
25 
26     va_start(argp, format);
27     vsnprintf(str, sizeof(str), format, argp);
28     if (test != NULL && test->json_output && test->json_top != NULL)
29 	cJSON_AddStringToObject(test->json_top, "error", str);
30     else
31 	fprintf(stderr, "iperf3: %s\n", str);
32     va_end(argp);
33 }
34 
35 /* Do a printf to stderr, then exit. */
36 void
37 iperf_errexit(struct iperf_test *test, const char *format, ...)
38 {
39     va_list argp;
40     char str[1000];
41 
42     va_start(argp, format);
43     vsnprintf(str, sizeof(str), format, argp);
44     if (test != NULL && test->json_output && test->json_top != NULL) {
45 	cJSON_AddStringToObject(test->json_top, "error", str);
46 	iperf_json_finish(test);
47     } else
48 	fprintf(stderr, "iperf3: %s\n", str);
49     va_end(argp);
50     iperf_delete_pidfile(test);
51     exit(1);
52 }
53 
54 int i_errno;
55 
56 char *
57 iperf_strerror(int i_errno)
58 {
59     static char errstr[256];
60     int len, perr, herr;
61     perr = herr = 0;
62 
63     len = sizeof(errstr);
64     memset(errstr, 0, len);
65 
66     switch (i_errno) {
67         case IENONE:
68             snprintf(errstr, len, "no error");
69             break;
70         case IESERVCLIENT:
71             snprintf(errstr, len, "cannot be both server and client");
72             break;
73         case IENOROLE:
74             snprintf(errstr, len, "must either be a client (-c) or server (-s)");
75             break;
76         case IESERVERONLY:
77             snprintf(errstr, len, "some option you are trying to set is server only");
78             break;
79         case IECLIENTONLY:
80             snprintf(errstr, len, "some option you are trying to set is client only");
81             break;
82         case IEDURATION:
83             snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
84             break;
85         case IENUMSTREAMS:
86             snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
87             break;
88         case IEBLOCKSIZE:
89             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
90             break;
91         case IEBUFSIZE:
92             snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
93             break;
94         case IEINTERVAL:
95             snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
96             break;
97         case IEMSS:
98             snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
99             break;
100         case IENOSENDFILE:
101             snprintf(errstr, len, "this OS does not support sendfile");
102             break;
103         case IEOMIT:
104             snprintf(errstr, len, "bogus value for --omit");
105             break;
106         case IEUNIMP:
107             snprintf(errstr, len, "an option you are trying to set is not implemented yet");
108             break;
109         case IEFILE:
110             snprintf(errstr, len, "unable to open -F file");
111             perr = 1;
112             break;
113         case IEBURST:
114             snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
115             break;
116         case IEENDCONDITIONS:
117             snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
118             break;
119         case IENEWTEST:
120             snprintf(errstr, len, "unable to create a new test");
121             perr = 1;
122             break;
123         case IEINITTEST:
124             snprintf(errstr, len, "test initialization failed");
125             perr = 1;
126             break;
127         case IELISTEN:
128             snprintf(errstr, len, "unable to start listener for connections");
129             perr = 1;
130             break;
131         case IECONNECT:
132             snprintf(errstr, len, "unable to connect to server");
133             perr = 1;
134             break;
135         case IEACCEPT:
136             snprintf(errstr, len, "unable to accept connection from client");
137             herr = 1;
138             perr = 1;
139             break;
140         case IESENDCOOKIE:
141             snprintf(errstr, len, "unable to send cookie to server");
142             perr = 1;
143             break;
144         case IERECVCOOKIE:
145             snprintf(errstr, len, "unable to receive cookie at server");
146             perr = 1;
147             break;
148         case IECTRLWRITE:
149             snprintf(errstr, len, "unable to write to the control socket");
150             perr = 1;
151             break;
152         case IECTRLREAD:
153             snprintf(errstr, len, "unable to read from the control socket");
154             perr = 1;
155             break;
156         case IECTRLCLOSE:
157             snprintf(errstr, len, "control socket has closed unexpectedly");
158             break;
159         case IEMESSAGE:
160             snprintf(errstr, len, "received an unknown control message");
161             break;
162         case IESENDMESSAGE:
163             snprintf(errstr, len, "unable to send control message");
164             perr = 1;
165             break;
166         case IERECVMESSAGE:
167             snprintf(errstr, len, "unable to receive control message");
168             perr = 1;
169             break;
170         case IESENDPARAMS:
171             snprintf(errstr, len, "unable to send parameters to server");
172             perr = 1;
173             break;
174         case IERECVPARAMS:
175             snprintf(errstr, len, "unable to receive parameters from client");
176             perr = 1;
177             break;
178         case IEPACKAGERESULTS:
179             snprintf(errstr, len, "unable to package results");
180             perr = 1;
181             break;
182         case IESENDRESULTS:
183             snprintf(errstr, len, "unable to send results");
184             perr = 1;
185             break;
186         case IERECVRESULTS:
187             snprintf(errstr, len, "unable to receive results");
188             perr = 1;
189             break;
190         case IESELECT:
191             snprintf(errstr, len, "select failed");
192             perr = 1;
193             break;
194         case IECLIENTTERM:
195             snprintf(errstr, len, "the client has terminated");
196             break;
197         case IESERVERTERM:
198             snprintf(errstr, len, "the server has terminated");
199             break;
200         case IEACCESSDENIED:
201             snprintf(errstr, len, "the server is busy running a test. try again later");
202             break;
203         case IESETNODELAY:
204             snprintf(errstr, len, "unable to set TCP NODELAY");
205             perr = 1;
206             break;
207         case IESETMSS:
208             snprintf(errstr, len, "unable to set TCP MSS");
209             perr = 1;
210             break;
211         case IESETBUF:
212             snprintf(errstr, len, "unable to set socket buffer size");
213             perr = 1;
214             break;
215         case IESETTOS:
216             snprintf(errstr, len, "unable to set IP TOS");
217             perr = 1;
218             break;
219         case IESETCOS:
220             snprintf(errstr, len, "unable to set IPv6 traffic class");
221             perr = 1;
222             break;
223         case IESETFLOW:
224             snprintf(errstr, len, "unable to set IPv6 flow label");
225             break;
226         case IEREUSEADDR:
227             snprintf(errstr, len, "unable to reuse address on socket");
228             perr = 1;
229             break;
230         case IENONBLOCKING:
231             snprintf(errstr, len, "unable to set socket to non-blocking");
232             perr = 1;
233             break;
234         case IESETWINDOWSIZE:
235             snprintf(errstr, len, "unable to set socket window size");
236             perr = 1;
237             break;
238         case IEPROTOCOL:
239             snprintf(errstr, len, "protocol does not exist");
240             break;
241         case IEAFFINITY:
242             snprintf(errstr, len, "unable to set CPU affinity");
243             perr = 1;
244             break;
245 	case IEDAEMON:
246 	    snprintf(errstr, len, "unable to become a daemon");
247 	    perr = 1;
248 	    break;
249         case IECREATESTREAM:
250             snprintf(errstr, len, "unable to create a new stream");
251             herr = 1;
252             perr = 1;
253             break;
254         case IEINITSTREAM:
255             snprintf(errstr, len, "unable to initialize stream");
256             herr = 1;
257             perr = 1;
258             break;
259         case IESTREAMLISTEN:
260             snprintf(errstr, len, "unable to start stream listener");
261             perr = 1;
262             break;
263         case IESTREAMCONNECT:
264             snprintf(errstr, len, "unable to connect stream");
265             herr = 1;
266             perr = 1;
267             break;
268         case IESTREAMACCEPT:
269             snprintf(errstr, len, "unable to accept stream connection");
270             perr = 1;
271             break;
272         case IESTREAMWRITE:
273             snprintf(errstr, len, "unable to write to stream socket");
274             perr = 1;
275             break;
276         case IESTREAMREAD:
277             snprintf(errstr, len, "unable to read from stream socket");
278             perr = 1;
279             break;
280         case IESTREAMCLOSE:
281             snprintf(errstr, len, "stream socket has closed unexpectedly");
282             break;
283         case IESTREAMID:
284             snprintf(errstr, len, "stream has an invalid id");
285             break;
286         case IENEWTIMER:
287             snprintf(errstr, len, "unable to create new timer");
288             perr = 1;
289             break;
290         case IEUPDATETIMER:
291             snprintf(errstr, len, "unable to update timer");
292             perr = 1;
293             break;
294         case IESETCONGESTION:
295             snprintf(errstr, len, "unable to set TCP_CONGESTION: "
296                                   "Supplied congestion control algorithm not supported on this host");
297             break;
298 	case IEPIDFILE:
299             snprintf(errstr, len, "unable to write PID file");
300             perr = 1;
301             break;
302 	case IEV6ONLY:
303 	    snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
304 	    perr = 1;
305 	    break;
306         case IESETSCTPDISABLEFRAG:
307             snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAG");
308             perr = 1;
309             break;
310     }
311 
312     if (herr || perr)
313         strncat(errstr, ": ", len);
314     if (h_errno && herr) {
315         strncat(errstr, hstrerror(h_errno), len);
316     } else if (errno && perr) {
317         strncat(errstr, strerror(errno), len);
318     }
319 
320     return errstr;
321 }
322