2011-04-20 20:33:09 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2009-2011, The Regents of the University of California,
|
|
|
|
* through Lawrence Berkeley National Laboratory (subject to receipt of any
|
|
|
|
* required approvals from the U.S. Dept. of Energy). All rights reserved.
|
|
|
|
*
|
|
|
|
* This code is distributed under a BSD style license, see the LICENSE file
|
|
|
|
* for complete information.
|
|
|
|
*/
|
|
|
|
|
2010-07-19 19:45:08 +00:00
|
|
|
#include <stdio.h>
|
2010-07-19 20:38:40 +00:00
|
|
|
#include <errno.h>
|
|
|
|
#include <netdb.h>
|
2010-07-20 00:03:03 +00:00
|
|
|
#include <string.h>
|
2013-02-07 20:35:17 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdarg.h>
|
2010-07-19 19:45:08 +00:00
|
|
|
#include "iperf.h"
|
2012-09-28 23:00:14 +00:00
|
|
|
#include "iperf_api.h"
|
2010-07-19 19:45:08 +00:00
|
|
|
|
2013-02-07 20:35:17 +00:00
|
|
|
static void
|
|
|
|
iperf_verr(struct iperf_test *test, const char *format, va_list argp)
|
|
|
|
{
|
|
|
|
char str[1000];
|
|
|
|
|
|
|
|
vsnprintf(str, sizeof(str), format, argp);
|
|
|
|
if (test != NULL && test->json_output && test->json_top != NULL) {
|
|
|
|
cJSON_AddStringToObject(test->json_top, "error", str);
|
|
|
|
iperf_json_finish(test);
|
|
|
|
} else
|
|
|
|
fprintf(stderr, "iperf3: %s\n", str);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Do a printf to stderr. */
|
|
|
|
void
|
|
|
|
iperf_err(struct iperf_test *test, const char *format, ...)
|
|
|
|
{
|
|
|
|
va_list argp;
|
|
|
|
|
|
|
|
va_start(argp, format);
|
|
|
|
iperf_verr(test, format, argp);
|
|
|
|
va_end(argp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Do a printf to stderr, then exit. */
|
|
|
|
void
|
|
|
|
iperf_errexit(struct iperf_test *test, const char *format, ...)
|
|
|
|
{
|
|
|
|
va_list argp;
|
|
|
|
|
|
|
|
va_start(argp, format);
|
|
|
|
iperf_verr(test, format, argp);
|
|
|
|
va_end(argp);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2010-07-19 20:38:40 +00:00
|
|
|
int i_errno;
|
2010-07-19 19:45:08 +00:00
|
|
|
|
2010-07-20 22:27:50 +00:00
|
|
|
char *
|
|
|
|
iperf_strerror(int i_errno)
|
|
|
|
{
|
|
|
|
static char errstr[256];
|
2010-07-27 22:11:09 +00:00
|
|
|
int len, perr, herr;
|
|
|
|
perr = herr = 0;
|
2010-07-20 22:27:50 +00:00
|
|
|
|
|
|
|
len = sizeof(errstr);
|
|
|
|
memset(errstr, 0, len);
|
|
|
|
|
|
|
|
switch (i_errno) {
|
|
|
|
case IENONE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "no error");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESERVCLIENT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "cannot be both server and client");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IENOROLE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "must either be a client (-c) or server (-s)");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IECLIENTONLY:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "some option you are trying to set is client only");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEDURATION:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IENUMSTREAMS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEBLOCKSIZE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEBUFSIZE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEINTERVAL:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "report interval too large (maximum = %d seconds)", MAX_INTERVAL);
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEMSS:
|
|
|
|
snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
|
|
|
|
break;
|
|
|
|
case IENEWTEST:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to create a new test");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEINITTEST:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "test initialization failed");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IELISTEN:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to start listener for connections");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IECONNECT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to connect to server");
|
2010-07-27 22:11:09 +00:00
|
|
|
herr = 1;
|
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEACCEPT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to accept connection from client");
|
2010-07-27 22:11:09 +00:00
|
|
|
herr = 1;
|
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESENDCOOKIE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to send cookie to server");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IERECVCOOKIE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to receive cookie to server");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IECTRLWRITE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to write to the control socket");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IECTRLREAD:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to read from the control socket");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IECTRLCLOSE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "control socket has closed unexpectedly");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEMESSAGE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "received an unknown control message");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESENDMESSAGE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to send control message");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IERECVMESSAGE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to receive control message");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESENDPARAMS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to send parameters to server");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IERECVPARAMS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to receive parameters from client");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEPACKAGERESULTS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to package results");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESENDRESULTS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to send results");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IERECVRESULTS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to receive results");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESELECT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "select failed");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
|
|
|
break;
|
|
|
|
case IECLIENTTERM:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "the client has terminated");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESERVERTERM:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "the server has terminated");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEACCESSDENIED:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "the server is busy running a test. try again later");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESETNODELAY:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set TCP NODELAY");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESETMSS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set TCP MSS");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
2010-08-02 22:45:53 +00:00
|
|
|
case IESETBUF:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set socket buffer size");
|
2010-08-02 22:45:53 +00:00
|
|
|
perr = 1;
|
|
|
|
break;
|
2010-08-03 21:38:48 +00:00
|
|
|
case IESETTOS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set IP TOS");
|
2010-08-03 21:38:48 +00:00
|
|
|
perr = 1;
|
|
|
|
break;
|
|
|
|
case IESETCOS:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set IPv6 traffic class");
|
2010-08-03 21:38:48 +00:00
|
|
|
perr = 1;
|
|
|
|
break;
|
2010-07-20 22:27:50 +00:00
|
|
|
case IEREUSEADDR:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to reuse address on socket");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IENONBLOCKING:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set socket to non-blocking");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESETWINDOWSIZE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to set socket window size");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
2010-07-22 23:26:38 +00:00
|
|
|
case IEPROTOCOL:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "protocol does not exist");
|
2010-07-22 23:26:38 +00:00
|
|
|
break;
|
2010-07-20 22:27:50 +00:00
|
|
|
case IECREATESTREAM:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to create a new stream");
|
2010-07-27 22:11:09 +00:00
|
|
|
herr = 1;
|
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEINITSTREAM:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to initialize stream");
|
2010-07-27 22:11:09 +00:00
|
|
|
herr = 1;
|
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
2010-07-22 18:57:08 +00:00
|
|
|
case IESTREAMLISTEN:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to start stream listener");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-22 18:57:08 +00:00
|
|
|
break;
|
2010-07-20 22:27:50 +00:00
|
|
|
case IESTREAMCONNECT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to connect stream");
|
2010-07-27 22:11:09 +00:00
|
|
|
herr = 1;
|
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESTREAMACCEPT:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to accept stream connection");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESTREAMWRITE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to write to stream socket");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESTREAMREAD:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to read from stream socket");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESTREAMCLOSE:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "stream socket has closed unexpectedly");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IESTREAMID:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "stream has an invalid id");
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IENEWTIMER:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to create new timer");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
case IEUPDATETIMER:
|
2013-02-07 20:35:17 +00:00
|
|
|
snprintf(errstr, len, "unable to update timer");
|
2010-07-27 22:11:09 +00:00
|
|
|
perr = 1;
|
2010-07-20 22:27:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2010-07-27 22:11:09 +00:00
|
|
|
if (herr || perr)
|
|
|
|
strncat(errstr, ": ", len);
|
|
|
|
if (h_errno && herr) {
|
|
|
|
strncat(errstr, hstrerror(h_errno), len);
|
|
|
|
} else if (errno && perr) {
|
|
|
|
strncat(errstr, strerror(errno), len);
|
|
|
|
}
|
|
|
|
|
2012-12-12 06:29:26 +00:00
|
|
|
return errstr;
|
2010-07-20 22:27:50 +00:00
|
|
|
}
|