xref: /iperf/src/iperf_error.c (revision ba7b91d2)
1 /*
2  * Copyright (c) 2009-2011, 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     exit(1);
51 }
52 
53 int i_errno;
54 
55 char *
56 iperf_strerror(int i_errno)
57 {
58     static char errstr[256];
59     int len, perr, herr;
60     perr = herr = 0;
61 
62     len = sizeof(errstr);
63     memset(errstr, 0, len);
64 
65     switch (i_errno) {
66         case IENONE:
67             snprintf(errstr, len, "no error");
68             break;
69         case IESERVCLIENT:
70             snprintf(errstr, len, "cannot be both server and client");
71             break;
72         case IENOROLE:
73             snprintf(errstr, len, "must either be a client (-c) or server (-s)");
74             break;
75         case IESERVERONLY:
76             snprintf(errstr, len, "some option you are trying to set is server only");
77             break;
78         case IECLIENTONLY:
79             snprintf(errstr, len, "some option you are trying to set is client only");
80             break;
81         case IEDURATION:
82             snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
83             break;
84         case IENUMSTREAMS:
85             snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
86             break;
87         case IEBLOCKSIZE:
88             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
89             break;
90         case IEBUFSIZE:
91             snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
92             break;
93         case IEINTERVAL:
94             snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
95             break;
96         case IEMSS:
97             snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
98             break;
99         case IENOSENDFILE:
100             snprintf(errstr, len, "this OS does not support sendfile");
101             break;
102         case IEOMIT:
103             snprintf(errstr, len, "bogus value for --omit");
104             break;
105         case IEUNIMP:
106             snprintf(errstr, len, "an option you are trying to set is not implemented yet");
107             break;
108         case IEFILE:
109             snprintf(errstr, len, "unable to open -F file");
110             perr = 1;
111             break;
112         case IENEWTEST:
113             snprintf(errstr, len, "unable to create a new test");
114             perr = 1;
115             break;
116         case IEINITTEST:
117             snprintf(errstr, len, "test initialization failed");
118             perr = 1;
119             break;
120         case IELISTEN:
121             snprintf(errstr, len, "unable to start listener for connections");
122             perr = 1;
123             break;
124         case IECONNECT:
125             snprintf(errstr, len, "unable to connect to server");
126             perr = 1;
127             break;
128         case IEACCEPT:
129             snprintf(errstr, len, "unable to accept connection from client");
130             herr = 1;
131             perr = 1;
132             break;
133         case IESENDCOOKIE:
134             snprintf(errstr, len, "unable to send cookie to server");
135             perr = 1;
136             break;
137         case IERECVCOOKIE:
138             snprintf(errstr, len, "unable to receive cookie at server");
139             perr = 1;
140             break;
141         case IECTRLWRITE:
142             snprintf(errstr, len, "unable to write to the control socket");
143             perr = 1;
144             break;
145         case IECTRLREAD:
146             snprintf(errstr, len, "unable to read from the control socket");
147             perr = 1;
148             break;
149         case IECTRLCLOSE:
150             snprintf(errstr, len, "control socket has closed unexpectedly");
151             break;
152         case IEMESSAGE:
153             snprintf(errstr, len, "received an unknown control message");
154             break;
155         case IESENDMESSAGE:
156             snprintf(errstr, len, "unable to send control message");
157             perr = 1;
158             break;
159         case IERECVMESSAGE:
160             snprintf(errstr, len, "unable to receive control message");
161             perr = 1;
162             break;
163         case IESENDPARAMS:
164             snprintf(errstr, len, "unable to send parameters to server");
165             perr = 1;
166             break;
167         case IERECVPARAMS:
168             snprintf(errstr, len, "unable to receive parameters from client");
169             perr = 1;
170             break;
171         case IEPACKAGERESULTS:
172             snprintf(errstr, len, "unable to package results");
173             perr = 1;
174             break;
175         case IESENDRESULTS:
176             snprintf(errstr, len, "unable to send results");
177             perr = 1;
178             break;
179         case IERECVRESULTS:
180             snprintf(errstr, len, "unable to receive results");
181             perr = 1;
182             break;
183         case IESELECT:
184             snprintf(errstr, len, "select failed");
185             perr = 1;
186             break;
187         case IECLIENTTERM:
188             snprintf(errstr, len, "the client has terminated");
189             break;
190         case IESERVERTERM:
191             snprintf(errstr, len, "the server has terminated");
192             break;
193         case IEACCESSDENIED:
194             snprintf(errstr, len, "the server is busy running a test. try again later");
195             break;
196         case IESETNODELAY:
197             snprintf(errstr, len, "unable to set TCP NODELAY");
198             perr = 1;
199             break;
200         case IESETMSS:
201             snprintf(errstr, len, "unable to set TCP MSS");
202             perr = 1;
203             break;
204         case IESETBUF:
205             snprintf(errstr, len, "unable to set socket buffer size");
206             perr = 1;
207             break;
208         case IESETTOS:
209             snprintf(errstr, len, "unable to set IP TOS");
210             perr = 1;
211             break;
212         case IESETCOS:
213             snprintf(errstr, len, "unable to set IPv6 traffic class");
214             perr = 1;
215             break;
216         case IESETFLOW:
217             snprintf(errstr, len, "unable to set IPv6 flow label");
218             break;
219         case IEREUSEADDR:
220             snprintf(errstr, len, "unable to reuse address on socket");
221             perr = 1;
222             break;
223         case IENONBLOCKING:
224             snprintf(errstr, len, "unable to set socket to non-blocking");
225             perr = 1;
226             break;
227         case IESETWINDOWSIZE:
228             snprintf(errstr, len, "unable to set socket window size");
229             perr = 1;
230             break;
231         case IEPROTOCOL:
232             snprintf(errstr, len, "protocol does not exist");
233             break;
234         case IEAFFINITY:
235             snprintf(errstr, len, "unable to set CPU affinity");
236             perr = 1;
237             break;
238         case IECREATESTREAM:
239             snprintf(errstr, len, "unable to create a new stream");
240             herr = 1;
241             perr = 1;
242             break;
243         case IEINITSTREAM:
244             snprintf(errstr, len, "unable to initialize stream");
245             herr = 1;
246             perr = 1;
247             break;
248         case IESTREAMLISTEN:
249             snprintf(errstr, len, "unable to start stream listener");
250             perr = 1;
251             break;
252         case IESTREAMCONNECT:
253             snprintf(errstr, len, "unable to connect stream");
254             herr = 1;
255             perr = 1;
256             break;
257         case IESTREAMACCEPT:
258             snprintf(errstr, len, "unable to accept stream connection");
259             perr = 1;
260             break;
261         case IESTREAMWRITE:
262             snprintf(errstr, len, "unable to write to stream socket");
263             perr = 1;
264             break;
265         case IESTREAMREAD:
266             snprintf(errstr, len, "unable to read from stream socket");
267             perr = 1;
268             break;
269         case IESTREAMCLOSE:
270             snprintf(errstr, len, "stream socket has closed unexpectedly");
271             break;
272         case IESTREAMID:
273             snprintf(errstr, len, "stream has an invalid id");
274             break;
275         case IENEWTIMER:
276             snprintf(errstr, len, "unable to create new timer");
277             perr = 1;
278             break;
279         case IEUPDATETIMER:
280             snprintf(errstr, len, "unable to update timer");
281             perr = 1;
282             break;
283     }
284 
285     if (herr || perr)
286         strncat(errstr, ": ", len);
287     if (h_errno && herr) {
288         strncat(errstr, hstrerror(h_errno), len);
289     } else if (errno && perr) {
290         strncat(errstr, strerror(errno), len);
291     }
292 
293     return errstr;
294 }
295