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