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