17d375156SJon Dugan /*
2de006004SBruce A. Mah * iperf, Copyright (c) 2014-2022, The Regents of the University of
3da9f046fSBruce A. Mah * California, through Lawrence Berkeley National Laboratory (subject
4da9f046fSBruce A. Mah * to receipt of any required approvals from the U.S. Dept. of
5da9f046fSBruce A. Mah * Energy). All rights reserved.
67d375156SJon Dugan *
7da9f046fSBruce A. Mah * If you have questions about your rights to use or distribute this
8da9f046fSBruce A. Mah * software, please contact Berkeley Lab's Technology Transfer
9da9f046fSBruce A. Mah * Department at [email protected].
10da9f046fSBruce A. Mah *
11da9f046fSBruce A. Mah * NOTICE. This software is owned by the U.S. Department of Energy.
12da9f046fSBruce A. Mah * As such, the U.S. Government has been granted for itself and others
13da9f046fSBruce A. Mah * acting on its behalf a paid-up, nonexclusive, irrevocable,
14da9f046fSBruce A. Mah * worldwide license in the Software to reproduce, prepare derivative
15da9f046fSBruce A. Mah * works, and perform publicly and display publicly. Beginning five
16da9f046fSBruce A. Mah * (5) years after the date permission to assert copyright is obtained
17da9f046fSBruce A. Mah * from the U.S. Department of Energy, and subject to any subsequent
18da9f046fSBruce A. Mah * five (5) year renewals, the U.S. Government is granted for itself
19da9f046fSBruce A. Mah * and others acting on its behalf a paid-up, nonexclusive,
20da9f046fSBruce A. Mah * irrevocable, worldwide license in the Software to reproduce,
21da9f046fSBruce A. Mah * prepare derivative works, distribute copies to the public, perform
22da9f046fSBruce A. Mah * publicly and display publicly, and to permit others to do so.
23da9f046fSBruce A. Mah *
24da9f046fSBruce A. Mah * This code is distributed under a BSD style license, see the LICENSE
25da9f046fSBruce A. Mah * file for complete information.
267d375156SJon Dugan */
278430ad49Ssethdelliott #include <stdio.h>
2801ca972bSsethdelliott #include <errno.h>
2901ca972bSsethdelliott #include <netdb.h>
303118b420Ssethdelliott #include <string.h>
31b5e0751fSJef Poskanzer #include <stdlib.h>
32b5e0751fSJef Poskanzer #include <stdarg.h>
338430ad49Ssethdelliott #include "iperf.h"
3498ce496bSjef #include "iperf_api.h"
358430ad49Ssethdelliott
3638bac802SBruce A. Mah int gerror;
3738bac802SBruce A. Mah
381a908ce1SBruce A. Mah char iperf_timestrerr[100];
391a908ce1SBruce A. Mah
40b5e0751fSJef Poskanzer /* Do a printf to stderr. */
41b5e0751fSJef Poskanzer void
iperf_err(struct iperf_test * test,const char * format,...)42b5e0751fSJef Poskanzer iperf_err(struct iperf_test *test, const char *format, ...)
43b5e0751fSJef Poskanzer {
44b5e0751fSJef Poskanzer va_list argp;
45eb0206e6SJef Poskanzer char str[1000];
461a908ce1SBruce A. Mah time_t now;
471a908ce1SBruce A. Mah struct tm *ltm = NULL;
481a908ce1SBruce A. Mah char *ct = NULL;
491a908ce1SBruce A. Mah
501a908ce1SBruce A. Mah /* Timestamp if requested */
511a908ce1SBruce A. Mah if (test != NULL && test->timestamps) {
521a908ce1SBruce A. Mah time(&now);
531a908ce1SBruce A. Mah ltm = localtime(&now);
541a908ce1SBruce A. Mah strftime(iperf_timestrerr, sizeof(iperf_timestrerr), test->timestamp_format, ltm);
551a908ce1SBruce A. Mah ct = iperf_timestrerr;
561a908ce1SBruce A. Mah }
57b5e0751fSJef Poskanzer
58b5e0751fSJef Poskanzer va_start(argp, format);
59f19a68d5SJef Poskanzer vsnprintf(str, sizeof(str), format, argp);
60eb0206e6SJef Poskanzer if (test != NULL && test->json_output && test->json_top != NULL)
61eb0206e6SJef Poskanzer cJSON_AddStringToObject(test->json_top, "error", str);
6224753fd7Sswlars else {
63bd85edb8SBruce A. Mah if (test && test->outfile && test->outfile != stdout) {
641a908ce1SBruce A. Mah if (ct) {
651a908ce1SBruce A. Mah fprintf(test->outfile, "%s", ct);
661a908ce1SBruce A. Mah }
67aeb6938dSBruce A. Mah fprintf(test->outfile, "iperf3: %s\n", str);
68aeb6938dSBruce A. Mah }
69aeb6938dSBruce A. Mah else {
701a908ce1SBruce A. Mah if (ct) {
711a908ce1SBruce A. Mah fprintf(stderr, "%s", ct);
721a908ce1SBruce A. Mah }
73eb0206e6SJef Poskanzer fprintf(stderr, "iperf3: %s\n", str);
74aeb6938dSBruce A. Mah }
7524753fd7Sswlars }
76b5e0751fSJef Poskanzer va_end(argp);
77b5e0751fSJef Poskanzer }
78b5e0751fSJef Poskanzer
79aeb6938dSBruce A. Mah /* Do a printf to stderr or log file as appropriate, then exit. */
80b5e0751fSJef Poskanzer void
iperf_errexit(struct iperf_test * test,const char * format,...)81b5e0751fSJef Poskanzer iperf_errexit(struct iperf_test *test, const char *format, ...)
82b5e0751fSJef Poskanzer {
83b5e0751fSJef Poskanzer va_list argp;
84eb0206e6SJef Poskanzer char str[1000];
851a908ce1SBruce A. Mah time_t now;
861a908ce1SBruce A. Mah struct tm *ltm = NULL;
871a908ce1SBruce A. Mah char *ct = NULL;
881a908ce1SBruce A. Mah
891a908ce1SBruce A. Mah /* Timestamp if requested */
901a908ce1SBruce A. Mah if (test != NULL && test->timestamps) {
911a908ce1SBruce A. Mah time(&now);
921a908ce1SBruce A. Mah ltm = localtime(&now);
931a908ce1SBruce A. Mah strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%c ", ltm);
941a908ce1SBruce A. Mah ct = iperf_timestrerr;
951a908ce1SBruce A. Mah }
96b5e0751fSJef Poskanzer
97b5e0751fSJef Poskanzer va_start(argp, format);
98f19a68d5SJef Poskanzer vsnprintf(str, sizeof(str), format, argp);
99eb0206e6SJef Poskanzer if (test != NULL && test->json_output && test->json_top != NULL) {
100eb0206e6SJef Poskanzer cJSON_AddStringToObject(test->json_top, "error", str);
101eb0206e6SJef Poskanzer iperf_json_finish(test);
102eb0206e6SJef Poskanzer } else
103bd85edb8SBruce A. Mah if (test && test->outfile && test->outfile != stdout) {
1041a908ce1SBruce A. Mah if (ct) {
1051a908ce1SBruce A. Mah fprintf(test->outfile, "%s", ct);
1061a908ce1SBruce A. Mah }
107aeb6938dSBruce A. Mah fprintf(test->outfile, "iperf3: %s\n", str);
108aeb6938dSBruce A. Mah }
109aeb6938dSBruce A. Mah else {
1101a908ce1SBruce A. Mah if (ct) {
1111a908ce1SBruce A. Mah fprintf(stderr, "%s", ct);
1121a908ce1SBruce A. Mah }
113eb0206e6SJef Poskanzer fprintf(stderr, "iperf3: %s\n", str);
114aeb6938dSBruce A. Mah }
115b5e0751fSJef Poskanzer va_end(argp);
1168fcfc247Sg-coder if (test)
117441d8b75SBruce A. Mah iperf_delete_pidfile(test);
118b5e0751fSJef Poskanzer exit(1);
119b5e0751fSJef Poskanzer }
120b5e0751fSJef Poskanzer
12101ca972bSsethdelliott int i_errno;
1228430ad49Ssethdelliott
123b60a49ddSsethdelliott char *
iperf_strerror(int int_errno)1245ab2132cSGabriel Ganne iperf_strerror(int int_errno)
125b60a49ddSsethdelliott {
126b60a49ddSsethdelliott static char errstr[256];
127ffdcc7d4Ssethdelliott int len, perr, herr;
128ffdcc7d4Ssethdelliott perr = herr = 0;
129b60a49ddSsethdelliott
130b60a49ddSsethdelliott len = sizeof(errstr);
131b60a49ddSsethdelliott memset(errstr, 0, len);
132b60a49ddSsethdelliott
1335ab2132cSGabriel Ganne switch (int_errno) {
134b60a49ddSsethdelliott case IENONE:
135b5e0751fSJef Poskanzer snprintf(errstr, len, "no error");
136b60a49ddSsethdelliott break;
137b60a49ddSsethdelliott case IESERVCLIENT:
138b5e0751fSJef Poskanzer snprintf(errstr, len, "cannot be both server and client");
139b60a49ddSsethdelliott break;
140b60a49ddSsethdelliott case IENOROLE:
141b5e0751fSJef Poskanzer snprintf(errstr, len, "must either be a client (-c) or server (-s)");
142b60a49ddSsethdelliott break;
143987b4323SJef Poskanzer case IESERVERONLY:
144987b4323SJef Poskanzer snprintf(errstr, len, "some option you are trying to set is server only");
145987b4323SJef Poskanzer break;
146b60a49ddSsethdelliott case IECLIENTONLY:
147b5e0751fSJef Poskanzer snprintf(errstr, len, "some option you are trying to set is client only");
148b60a49ddSsethdelliott break;
149b60a49ddSsethdelliott case IEDURATION:
150b5e0751fSJef Poskanzer snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
151b60a49ddSsethdelliott break;
152b60a49ddSsethdelliott case IENUMSTREAMS:
153b5e0751fSJef Poskanzer snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
154b60a49ddSsethdelliott break;
155b60a49ddSsethdelliott case IEBLOCKSIZE:
156b5e0751fSJef Poskanzer snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
157b60a49ddSsethdelliott break;
158b60a49ddSsethdelliott case IEBUFSIZE:
159b5e0751fSJef Poskanzer snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
160b60a49ddSsethdelliott break;
161b60a49ddSsethdelliott case IEINTERVAL:
16256536642SJef Poskanzer snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
163b60a49ddSsethdelliott break;
164e7aa59b6SBruce A. Mah case IEBIND: /* UNUSED */
165b7b1b32aSKevin Constantine snprintf(errstr, len, "--bind must be specified to use --cport");
166b7b1b32aSKevin Constantine break;
16796d0c77cSBruce A. Mah case IEUDPBLOCKSIZE:
16803224c9fSBruce A. Mah snprintf(errstr, len, "block size invalid (minimum = %d bytes, maximum = %d bytes)", MIN_UDP_BLOCKSIZE, MAX_UDP_BLOCKSIZE);
16996d0c77cSBruce A. Mah break;
170956d1158SBruce A. Mah case IEBADTOS:
171956d1158SBruce A. Mah snprintf(errstr, len, "bad TOS value (must be between 0 and 255 inclusive)");
172956d1158SBruce A. Mah break;
173a51045deSralcini case IESETCLIENTAUTH:
17406e3f08dSBruce A. Mah snprintf(errstr, len, "you must specify a username, password, and path to a valid RSA public key");
175a51045deSralcini break;
176a51045deSralcini case IESETSERVERAUTH:
17706e3f08dSBruce A. Mah snprintf(errstr, len, "you must specify a path to a valid RSA private key and a user credential file");
178a51045deSralcini break;
17937d913dfSBruce A. Mah case IEBADFORMAT:
18037d913dfSBruce A. Mah snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])");
18137d913dfSBruce A. Mah break;
1826c783462SBruce A. Mah case IEBADPORT:
1836c783462SBruce A. Mah snprintf(errstr, len, "port number must be between 1 and 65535 inclusive");
1846c783462SBruce A. Mah break;
185b60a49ddSsethdelliott case IEMSS:
186b60a49ddSsethdelliott snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
187b60a49ddSsethdelliott break;
188987b4323SJef Poskanzer case IENOSENDFILE:
189987b4323SJef Poskanzer snprintf(errstr, len, "this OS does not support sendfile");
190987b4323SJef Poskanzer break;
19157892604SJef Poskanzer case IEOMIT:
19257892604SJef Poskanzer snprintf(errstr, len, "bogus value for --omit");
193c9693599SJef Poskanzer break;
194c687db9dSJef Poskanzer case IEUNIMP:
195c687db9dSJef Poskanzer snprintf(errstr, len, "an option you are trying to set is not implemented yet");
196c687db9dSJef Poskanzer break;
197e32a7bcdSJef Poskanzer case IEFILE:
198e32a7bcdSJef Poskanzer snprintf(errstr, len, "unable to open -F file");
199e32a7bcdSJef Poskanzer perr = 1;
200e32a7bcdSJef Poskanzer break;
201bdf5335cSJef Poskanzer case IEBURST:
202bdf5335cSJef Poskanzer snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
203bdf5335cSJef Poskanzer break;
204f11d3fa3SJef Poskanzer case IEENDCONDITIONS:
205f11d3fa3SJef Poskanzer snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
206f11d3fa3SJef Poskanzer break;
207aeb6938dSBruce A. Mah case IELOGFILE:
208aeb6938dSBruce A. Mah snprintf(errstr, len, "unable to open log file");
209aeb6938dSBruce A. Mah perr = 1;
210aeb6938dSBruce A. Mah break;
211cd81de3cSBruce A. Mah case IENOSCTP:
212cd81de3cSBruce A. Mah snprintf(errstr, len, "no SCTP support available");
213cd81de3cSBruce A. Mah break;
214b60a49ddSsethdelliott case IENEWTEST:
215b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to create a new test");
216ffdcc7d4Ssethdelliott perr = 1;
217b60a49ddSsethdelliott break;
218b60a49ddSsethdelliott case IEINITTEST:
219b5e0751fSJef Poskanzer snprintf(errstr, len, "test initialization failed");
220ffdcc7d4Ssethdelliott perr = 1;
221b60a49ddSsethdelliott break;
222a51045deSralcini case IEAUTHTEST:
223a51045deSralcini snprintf(errstr, len, "test authorization failed");
224a51045deSralcini break;
225b60a49ddSsethdelliott case IELISTEN:
226b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to start listener for connections");
22738bac802SBruce A. Mah herr = 1;
228ffdcc7d4Ssethdelliott perr = 1;
229b60a49ddSsethdelliott break;
230b60a49ddSsethdelliott case IECONNECT:
231b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to connect to server");
232ffdcc7d4Ssethdelliott perr = 1;
23338bac802SBruce A. Mah herr = 1;
234b60a49ddSsethdelliott break;
235b60a49ddSsethdelliott case IEACCEPT:
236b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to accept connection from client");
237ffdcc7d4Ssethdelliott herr = 1;
238ffdcc7d4Ssethdelliott perr = 1;
239b60a49ddSsethdelliott break;
240b60a49ddSsethdelliott case IESENDCOOKIE:
241b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to send cookie to server");
242ffdcc7d4Ssethdelliott perr = 1;
243b60a49ddSsethdelliott break;
244b60a49ddSsethdelliott case IERECVCOOKIE:
2458115b2a2SJef Poskanzer snprintf(errstr, len, "unable to receive cookie at server");
246ffdcc7d4Ssethdelliott perr = 1;
247b60a49ddSsethdelliott break;
248b60a49ddSsethdelliott case IECTRLWRITE:
249b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to write to the control socket");
250ffdcc7d4Ssethdelliott perr = 1;
251b60a49ddSsethdelliott break;
252b60a49ddSsethdelliott case IECTRLREAD:
253b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to read from the control socket");
254ffdcc7d4Ssethdelliott perr = 1;
255b60a49ddSsethdelliott break;
256b60a49ddSsethdelliott case IECTRLCLOSE:
257b5e0751fSJef Poskanzer snprintf(errstr, len, "control socket has closed unexpectedly");
258b60a49ddSsethdelliott break;
259b60a49ddSsethdelliott case IEMESSAGE:
260b5e0751fSJef Poskanzer snprintf(errstr, len, "received an unknown control message");
261b60a49ddSsethdelliott break;
262b60a49ddSsethdelliott case IESENDMESSAGE:
263b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to send control message");
264ffdcc7d4Ssethdelliott perr = 1;
265b60a49ddSsethdelliott break;
266b60a49ddSsethdelliott case IERECVMESSAGE:
267b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to receive control message");
268ffdcc7d4Ssethdelliott perr = 1;
269b60a49ddSsethdelliott break;
270b60a49ddSsethdelliott case IESENDPARAMS:
271b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to send parameters to server");
272ffdcc7d4Ssethdelliott perr = 1;
273b60a49ddSsethdelliott break;
274b60a49ddSsethdelliott case IERECVPARAMS:
275b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to receive parameters from client");
276ffdcc7d4Ssethdelliott perr = 1;
277b60a49ddSsethdelliott break;
278b60a49ddSsethdelliott case IEPACKAGERESULTS:
279b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to package results");
280ffdcc7d4Ssethdelliott perr = 1;
281b60a49ddSsethdelliott break;
282b60a49ddSsethdelliott case IESENDRESULTS:
283b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to send results");
284ffdcc7d4Ssethdelliott perr = 1;
285b60a49ddSsethdelliott break;
286b60a49ddSsethdelliott case IERECVRESULTS:
287b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to receive results");
288ffdcc7d4Ssethdelliott perr = 1;
289b60a49ddSsethdelliott break;
290b60a49ddSsethdelliott case IESELECT:
291b5e0751fSJef Poskanzer snprintf(errstr, len, "select failed");
292ffdcc7d4Ssethdelliott perr = 1;
293ffdcc7d4Ssethdelliott break;
294ffdcc7d4Ssethdelliott case IECLIENTTERM:
295b5e0751fSJef Poskanzer snprintf(errstr, len, "the client has terminated");
296b60a49ddSsethdelliott break;
297b60a49ddSsethdelliott case IESERVERTERM:
298b5e0751fSJef Poskanzer snprintf(errstr, len, "the server has terminated");
299b60a49ddSsethdelliott break;
300b60a49ddSsethdelliott case IEACCESSDENIED:
301b5e0751fSJef Poskanzer snprintf(errstr, len, "the server is busy running a test. try again later");
302b60a49ddSsethdelliott break;
303b60a49ddSsethdelliott case IESETNODELAY:
304e1420625SBruce A. Mah snprintf(errstr, len, "unable to set TCP/SCTP NODELAY");
305ffdcc7d4Ssethdelliott perr = 1;
306b60a49ddSsethdelliott break;
307b60a49ddSsethdelliott case IESETMSS:
308e1420625SBruce A. Mah snprintf(errstr, len, "unable to set TCP/SCTP MSS");
309ffdcc7d4Ssethdelliott perr = 1;
310b60a49ddSsethdelliott break;
3110bd8d9daSsethdelliott case IESETBUF:
312b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to set socket buffer size");
3130bd8d9daSsethdelliott perr = 1;
3140bd8d9daSsethdelliott break;
3159a599d5fSsethdelliott case IESETTOS:
316b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to set IP TOS");
3179a599d5fSsethdelliott perr = 1;
3189a599d5fSsethdelliott break;
3199a599d5fSsethdelliott case IESETCOS:
320b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to set IPv6 traffic class");
3219a599d5fSsethdelliott perr = 1;
3229a599d5fSsethdelliott break;
323c687db9dSJef Poskanzer case IESETFLOW:
324c687db9dSJef Poskanzer snprintf(errstr, len, "unable to set IPv6 flow label");
325c687db9dSJef Poskanzer break;
326b60a49ddSsethdelliott case IEREUSEADDR:
327b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to reuse address on socket");
328ffdcc7d4Ssethdelliott perr = 1;
329b60a49ddSsethdelliott break;
330b60a49ddSsethdelliott case IENONBLOCKING:
331b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to set socket to non-blocking");
332ffdcc7d4Ssethdelliott perr = 1;
333b60a49ddSsethdelliott break;
334b60a49ddSsethdelliott case IESETWINDOWSIZE:
335b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to set socket window size");
336ffdcc7d4Ssethdelliott perr = 1;
337b60a49ddSsethdelliott break;
33866ce7ad4Ssethdelliott case IEPROTOCOL:
339b5e0751fSJef Poskanzer snprintf(errstr, len, "protocol does not exist");
34066ce7ad4Ssethdelliott break;
3418a7e01ebSJef Poskanzer case IEAFFINITY:
3428a7e01ebSJef Poskanzer snprintf(errstr, len, "unable to set CPU affinity");
3438a7e01ebSJef Poskanzer perr = 1;
3448a7e01ebSJef Poskanzer break;
3458ffe72e2SDavid Bar-On case IERCVTIMEOUT:
3468ffe72e2SDavid Bar-On snprintf(errstr, len, "receive timeout value is incorrect or not in range");
3478ffe72e2SDavid Bar-On perr = 1;
3488ffe72e2SDavid Bar-On break;
349*7bdd5b0eSDavid Bar-On case IESNDTIMEOUT:
350*7bdd5b0eSDavid Bar-On snprintf(errstr, len, "send timeout value is incorrect or not in range");
351*7bdd5b0eSDavid Bar-On perr = 1;
352*7bdd5b0eSDavid Bar-On break;
3538ffe72e2SDavid Bar-On case IERVRSONLYRCVTIMEOUT:
3548ffe72e2SDavid Bar-On snprintf(errstr, len, "client receive timeout is valid only in receiving mode");
3558ffe72e2SDavid Bar-On perr = 1;
3568ffe72e2SDavid Bar-On break;
357fe4a13abSBruce A. Mah case IEDAEMON:
358fe4a13abSBruce A. Mah snprintf(errstr, len, "unable to become a daemon");
359fe4a13abSBruce A. Mah perr = 1;
360fe4a13abSBruce A. Mah break;
361b60a49ddSsethdelliott case IECREATESTREAM:
362b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to create a new stream");
363ffdcc7d4Ssethdelliott herr = 1;
364ffdcc7d4Ssethdelliott perr = 1;
365b60a49ddSsethdelliott break;
366b60a49ddSsethdelliott case IEINITSTREAM:
367b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to initialize stream");
368ffdcc7d4Ssethdelliott herr = 1;
369ffdcc7d4Ssethdelliott perr = 1;
370b60a49ddSsethdelliott break;
3718a0b5a5dSsethdelliott case IESTREAMLISTEN:
372b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to start stream listener");
37338bac802SBruce A. Mah herr = 1;
374ffdcc7d4Ssethdelliott perr = 1;
3758a0b5a5dSsethdelliott break;
376b60a49ddSsethdelliott case IESTREAMCONNECT:
377b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to connect stream");
378ffdcc7d4Ssethdelliott herr = 1;
379ffdcc7d4Ssethdelliott perr = 1;
380b60a49ddSsethdelliott break;
381b60a49ddSsethdelliott case IESTREAMACCEPT:
382b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to accept stream connection");
383ffdcc7d4Ssethdelliott perr = 1;
384b60a49ddSsethdelliott break;
385b60a49ddSsethdelliott case IESTREAMWRITE:
386b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to write to stream socket");
387ffdcc7d4Ssethdelliott perr = 1;
388b60a49ddSsethdelliott break;
389b60a49ddSsethdelliott case IESTREAMREAD:
390b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to read from stream socket");
391ffdcc7d4Ssethdelliott perr = 1;
392b60a49ddSsethdelliott break;
393b60a49ddSsethdelliott case IESTREAMCLOSE:
394b5e0751fSJef Poskanzer snprintf(errstr, len, "stream socket has closed unexpectedly");
395b60a49ddSsethdelliott break;
396b60a49ddSsethdelliott case IESTREAMID:
397b5e0751fSJef Poskanzer snprintf(errstr, len, "stream has an invalid id");
398b60a49ddSsethdelliott break;
399b60a49ddSsethdelliott case IENEWTIMER:
400b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to create new timer");
401ffdcc7d4Ssethdelliott perr = 1;
402b60a49ddSsethdelliott break;
403b60a49ddSsethdelliott case IEUPDATETIMER:
404b5e0751fSJef Poskanzer snprintf(errstr, len, "unable to update timer");
405ffdcc7d4Ssethdelliott perr = 1;
406b60a49ddSsethdelliott break;
40762bfa88cSJef Poskanzer case IESETCONGESTION:
40848e66b9bSBruce A. Mah snprintf(errstr, len, "unable to set TCP_CONGESTION: "
40948e66b9bSBruce A. Mah "Supplied congestion control algorithm not supported on this host");
41062bfa88cSJef Poskanzer break;
411441d8b75SBruce A. Mah case IEPIDFILE:
412441d8b75SBruce A. Mah snprintf(errstr, len, "unable to write PID file");
413441d8b75SBruce A. Mah perr = 1;
414441d8b75SBruce A. Mah break;
4154addea85SBruce A. Mah case IEV6ONLY:
4164addea85SBruce A. Mah snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
4174addea85SBruce A. Mah perr = 1;
4184addea85SBruce A. Mah break;
41960bd98a5SBruce A. Mah case IESETSCTPDISABLEFRAG:
4201d85c269SBruce A. Mah snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS");
42160bd98a5SBruce A. Mah perr = 1;
42260bd98a5SBruce A. Mah break;
423e1420625SBruce A. Mah case IESETSCTPNSTREAM:
424e1420625SBruce A. Mah snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n");
425e1420625SBruce A. Mah perr = 1;
426e1420625SBruce A. Mah break;
4279915746aSBruce A. Mah case IESETPACING:
4289915746aSBruce A. Mah snprintf(errstr, len, "unable to set socket pacing");
4299915746aSBruce A. Mah perr = 1;
4309915746aSBruce A. Mah break;
431d2202ee3SBruce A. Mah case IESETBUF2:
432d2202ee3SBruce A. Mah snprintf(errstr, len, "socket buffer size not set correctly");
433d2202ee3SBruce A. Mah break;
4340778f04cSBoris Okunev case IEREVERSEBIDIR:
4350778f04cSBoris Okunev snprintf(errstr, len, "cannot be both reverse and bidirectional");
4360778f04cSBoris Okunev break;
437a0c6f0ecSDavid Bar-On case IETOTALRATE:
438a0c6f0ecSDavid Bar-On snprintf(errstr, len, "total required bandwidth is larger than server limit");
439a0c6f0ecSDavid Bar-On break;
440bd143779Sralcini case IESKEWTHRESHOLD:
441bd143779Sralcini snprintf(errstr, len, "skew threshold must be a positive number");
442bd143779Sralcini break;
443be66b575SDavid Bar-On case IEIDLETIMEOUT:
44450d6cce6Sa1346054 snprintf(errstr, len, "idle timeout parameter is not positive or larger than allowed limit");
445be66b575SDavid Bar-On break;
446f54b6b4bSDavid Bar-On case IEBINDDEV:
447f54b6b4bSDavid Bar-On snprintf(errstr, len, "Unable to bind-to-device (check perror, maybe permissions?)");
448f54b6b4bSDavid Bar-On break;
449f54b6b4bSDavid Bar-On case IEBINDDEVNOSUPPORT:
450f54b6b4bSDavid Bar-On snprintf(errstr, len, "`<ip>%%<dev>` is not supported as system does not support bind to device");
451f54b6b4bSDavid Bar-On break;
452f54b6b4bSDavid Bar-On case IEHOSTDEV:
453f54b6b4bSDavid Bar-On snprintf(errstr, len, "host device name (ip%%<dev>) is supported (and required) only for IPv6 link-local address");
454f54b6b4bSDavid Bar-On break;
455be66b575SDavid Bar-On case IENOMSG:
456de006004SBruce A. Mah snprintf(errstr, len, "idle timeout for receiving data");
457be66b575SDavid Bar-On break;
45849a5771aSDavid Bar-On case IESETDONTFRAGMENT:
45949a5771aSDavid Bar-On snprintf(errstr, len, "unable to set IP Do-Not-Fragment flag");
46049a5771aSDavid Bar-On break;
461*7bdd5b0eSDavid Bar-On case IESETUSERTIMEOUT:
462*7bdd5b0eSDavid Bar-On snprintf(errstr, len, "unable to set TCP/SCTP MSS");
463*7bdd5b0eSDavid Bar-On perr = 1;
464*7bdd5b0eSDavid Bar-On break;
465a9c28038SBruce A. Mah default:
466a9c28038SBruce A. Mah snprintf(errstr, len, "int_errno=%d", int_errno);
467a9c28038SBruce A. Mah perr = 1;
468a9c28038SBruce A. Mah break;
469b60a49ddSsethdelliott }
470b60a49ddSsethdelliott
47138bac802SBruce A. Mah /* Append the result of strerror() or gai_strerror() if appropriate */
472ffdcc7d4Ssethdelliott if (herr || perr)
47373936538SBruce A. Mah strncat(errstr, ": ", len - strlen(errstr) - 1);
4749f28b247SShaunCurrier if (errno && perr)
47573936538SBruce A. Mah strncat(errstr, strerror(errno), len - strlen(errstr) - 1);
47638bac802SBruce A. Mah else if (herr && gerror) {
47738bac802SBruce A. Mah strncat(errstr, gai_strerror(gerror), len - strlen(errstr) - 1);
47838bac802SBruce A. Mah gerror = 0;
47938bac802SBruce A. Mah }
480ffdcc7d4Ssethdelliott
481ec2d0670SJef Poskanzer return errstr;
482b60a49ddSsethdelliott }
483