xref: /iperf/src/iperf_error.c (revision 5d2f2cf9)
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 IENEWTEST:
134             snprintf(errstr, len, "unable to create a new test");
135             perr = 1;
136             break;
137         case IEINITTEST:
138             snprintf(errstr, len, "test initialization failed");
139             perr = 1;
140             break;
141         case IELISTEN:
142             snprintf(errstr, len, "unable to start listener for connections");
143             perr = 1;
144             break;
145         case IECONNECT:
146             snprintf(errstr, len, "unable to connect to server");
147             perr = 1;
148             break;
149         case IEACCEPT:
150             snprintf(errstr, len, "unable to accept connection from client");
151             herr = 1;
152             perr = 1;
153             break;
154         case IESENDCOOKIE:
155             snprintf(errstr, len, "unable to send cookie to server");
156             perr = 1;
157             break;
158         case IERECVCOOKIE:
159             snprintf(errstr, len, "unable to receive cookie at server");
160             perr = 1;
161             break;
162         case IECTRLWRITE:
163             snprintf(errstr, len, "unable to write to the control socket");
164             perr = 1;
165             break;
166         case IECTRLREAD:
167             snprintf(errstr, len, "unable to read from the control socket");
168             perr = 1;
169             break;
170         case IECTRLCLOSE:
171             snprintf(errstr, len, "control socket has closed unexpectedly");
172             break;
173         case IEMESSAGE:
174             snprintf(errstr, len, "received an unknown control message");
175             break;
176         case IESENDMESSAGE:
177             snprintf(errstr, len, "unable to send control message");
178             perr = 1;
179             break;
180         case IERECVMESSAGE:
181             snprintf(errstr, len, "unable to receive control message");
182             perr = 1;
183             break;
184         case IESENDPARAMS:
185             snprintf(errstr, len, "unable to send parameters to server");
186             perr = 1;
187             break;
188         case IERECVPARAMS:
189             snprintf(errstr, len, "unable to receive parameters from client");
190             perr = 1;
191             break;
192         case IEPACKAGERESULTS:
193             snprintf(errstr, len, "unable to package results");
194             perr = 1;
195             break;
196         case IESENDRESULTS:
197             snprintf(errstr, len, "unable to send results");
198             perr = 1;
199             break;
200         case IERECVRESULTS:
201             snprintf(errstr, len, "unable to receive results");
202             perr = 1;
203             break;
204         case IESELECT:
205             snprintf(errstr, len, "select failed");
206             perr = 1;
207             break;
208         case IECLIENTTERM:
209             snprintf(errstr, len, "the client has terminated");
210             break;
211         case IESERVERTERM:
212             snprintf(errstr, len, "the server has terminated");
213             break;
214         case IEACCESSDENIED:
215             snprintf(errstr, len, "the server is busy running a test. try again later");
216             break;
217         case IESETNODELAY:
218             snprintf(errstr, len, "unable to set TCP NODELAY");
219             perr = 1;
220             break;
221         case IESETMSS:
222             snprintf(errstr, len, "unable to set TCP MSS");
223             perr = 1;
224             break;
225         case IESETBUF:
226             snprintf(errstr, len, "unable to set socket buffer size");
227             perr = 1;
228             break;
229         case IESETTOS:
230             snprintf(errstr, len, "unable to set IP TOS");
231             perr = 1;
232             break;
233         case IESETCOS:
234             snprintf(errstr, len, "unable to set IPv6 traffic class");
235             perr = 1;
236             break;
237         case IESETFLOW:
238             snprintf(errstr, len, "unable to set IPv6 flow label");
239             break;
240         case IEREUSEADDR:
241             snprintf(errstr, len, "unable to reuse address on socket");
242             perr = 1;
243             break;
244         case IENONBLOCKING:
245             snprintf(errstr, len, "unable to set socket to non-blocking");
246             perr = 1;
247             break;
248         case IESETWINDOWSIZE:
249             snprintf(errstr, len, "unable to set socket window size");
250             perr = 1;
251             break;
252         case IEPROTOCOL:
253             snprintf(errstr, len, "protocol does not exist");
254             break;
255         case IEAFFINITY:
256             snprintf(errstr, len, "unable to set CPU affinity");
257             perr = 1;
258             break;
259 	case IEDAEMON:
260 	    snprintf(errstr, len, "unable to become a daemon");
261 	    perr = 1;
262 	    break;
263         case IECREATESTREAM:
264             snprintf(errstr, len, "unable to create a new stream");
265             herr = 1;
266             perr = 1;
267             break;
268         case IEINITSTREAM:
269             snprintf(errstr, len, "unable to initialize stream");
270             herr = 1;
271             perr = 1;
272             break;
273         case IESTREAMLISTEN:
274             snprintf(errstr, len, "unable to start stream listener");
275             perr = 1;
276             break;
277         case IESTREAMCONNECT:
278             snprintf(errstr, len, "unable to connect stream");
279             herr = 1;
280             perr = 1;
281             break;
282         case IESTREAMACCEPT:
283             snprintf(errstr, len, "unable to accept stream connection");
284             perr = 1;
285             break;
286         case IESTREAMWRITE:
287             snprintf(errstr, len, "unable to write to stream socket");
288             perr = 1;
289             break;
290         case IESTREAMREAD:
291             snprintf(errstr, len, "unable to read from stream socket");
292             perr = 1;
293             break;
294         case IESTREAMCLOSE:
295             snprintf(errstr, len, "stream socket has closed unexpectedly");
296             break;
297         case IESTREAMID:
298             snprintf(errstr, len, "stream has an invalid id");
299             break;
300         case IENEWTIMER:
301             snprintf(errstr, len, "unable to create new timer");
302             perr = 1;
303             break;
304         case IEUPDATETIMER:
305             snprintf(errstr, len, "unable to update timer");
306             perr = 1;
307             break;
308         case IESETCONGESTION:
309             snprintf(errstr, len, "unable to set TCP_CONGESTION: "
310                                   "Supplied congestion control algorithm not supported on this host");
311             break;
312 	case IEPIDFILE:
313             snprintf(errstr, len, "unable to write PID file");
314             perr = 1;
315             break;
316 	case IEV6ONLY:
317 	    snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
318 	    perr = 1;
319 	    break;
320         case IESETSCTPDISABLEFRAG:
321             snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAG");
322             perr = 1;
323             break;
324     }
325 
326     if (herr || perr)
327         strncat(errstr, ": ", len);
328     if (h_errno && herr) {
329         strncat(errstr, hstrerror(h_errno), len);
330     } else if (errno && perr) {
331         strncat(errstr, strerror(errno), len);
332     }
333 
334     return errstr;
335 }
336