1 /* 2 * iperf, Copyright (c) 2014, The Regents of the University of 3 * California, through Lawrence Berkeley National Laboratory (subject 4 * to receipt of any required approvals from the U.S. Dept. of 5 * Energy). All rights reserved. 6 * 7 * If you have questions about your rights to use or distribute this 8 * software, please contact Berkeley Lab's Technology Transfer 9 * Department at [email protected]. 10 * 11 * NOTICE. This software is owned by the U.S. Department of Energy. 12 * As such, the U.S. Government has been granted for itself and others 13 * acting on its behalf a paid-up, nonexclusive, irrevocable, 14 * worldwide license in the Software to reproduce, prepare derivative 15 * works, and perform publicly and display publicly. Beginning five 16 * (5) years after the date permission to assert copyright is obtained 17 * from the U.S. Department of Energy, and subject to any subsequent 18 * five (5) year renewals, the U.S. Government is granted for itself 19 * and others acting on its behalf a paid-up, nonexclusive, 20 * irrevocable, worldwide license in the Software to reproduce, 21 * prepare derivative works, distribute copies to the public, perform 22 * publicly and display publicly, and to permit others to do so. 23 * 24 * This code is distributed under a BSD style license, see the LICENSE 25 * file for complete information. 26 */ 27 #include <stdio.h> 28 #include <errno.h> 29 #include <netdb.h> 30 #include <string.h> 31 #include <stdlib.h> 32 #include <stdarg.h> 33 #include "iperf.h" 34 #include "iperf_api.h" 35 36 /* Do a printf to stderr. */ 37 void 38 iperf_err(struct iperf_test *test, const char *format, ...) 39 { 40 va_list argp; 41 char str[1000]; 42 43 va_start(argp, format); 44 vsnprintf(str, sizeof(str), format, argp); 45 if (test != NULL && test->json_output && test->json_top != NULL) 46 cJSON_AddStringToObject(test->json_top, "error", str); 47 else 48 if (test && test->outfile) { 49 fprintf(test->outfile, "iperf3: %s\n", str); 50 } 51 else { 52 fprintf(stderr, "iperf3: %s\n", str); 53 } 54 va_end(argp); 55 } 56 57 /* Do a printf to stderr or log file as appropriate, then exit. */ 58 void 59 iperf_errexit(struct iperf_test *test, const char *format, ...) 60 { 61 va_list argp; 62 char str[1000]; 63 64 va_start(argp, format); 65 vsnprintf(str, sizeof(str), format, argp); 66 if (test != NULL && test->json_output && test->json_top != NULL) { 67 cJSON_AddStringToObject(test->json_top, "error", str); 68 iperf_json_finish(test); 69 } else 70 if (test && test->outfile) { 71 fprintf(test->outfile, "iperf3: %s\n", str); 72 } 73 else { 74 fprintf(stderr, "iperf3: %s\n", str); 75 } 76 va_end(argp); 77 iperf_delete_pidfile(test); 78 exit(1); 79 } 80 81 int i_errno; 82 83 char * 84 iperf_strerror(int i_errno) 85 { 86 static char errstr[256]; 87 int len, perr, herr; 88 perr = herr = 0; 89 90 len = sizeof(errstr); 91 memset(errstr, 0, len); 92 93 switch (i_errno) { 94 case IENONE: 95 snprintf(errstr, len, "no error"); 96 break; 97 case IESERVCLIENT: 98 snprintf(errstr, len, "cannot be both server and client"); 99 break; 100 case IENOROLE: 101 snprintf(errstr, len, "must either be a client (-c) or server (-s)"); 102 break; 103 case IESERVERONLY: 104 snprintf(errstr, len, "some option you are trying to set is server only"); 105 break; 106 case IECLIENTONLY: 107 snprintf(errstr, len, "some option you are trying to set is client only"); 108 break; 109 case IEDURATION: 110 snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME); 111 break; 112 case IENUMSTREAMS: 113 snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS); 114 break; 115 case IEBLOCKSIZE: 116 snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE); 117 break; 118 case IEBUFSIZE: 119 snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER); 120 break; 121 case IEINTERVAL: 122 snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL); 123 break; 124 case IEBIND: 125 snprintf(errstr, len, "--bind must be specified to use --cport"); 126 break; 127 case IEUDPBLOCKSIZE: 128 snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_UDP_BLOCKSIZE); 129 break; 130 case IEMSS: 131 snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS); 132 break; 133 case IENOSENDFILE: 134 snprintf(errstr, len, "this OS does not support sendfile"); 135 break; 136 case IEOMIT: 137 snprintf(errstr, len, "bogus value for --omit"); 138 break; 139 case IEUNIMP: 140 snprintf(errstr, len, "an option you are trying to set is not implemented yet"); 141 break; 142 case IEFILE: 143 snprintf(errstr, len, "unable to open -F file"); 144 perr = 1; 145 break; 146 case IEBURST: 147 snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST); 148 break; 149 case IEENDCONDITIONS: 150 snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified"); 151 break; 152 case IELOGFILE: 153 snprintf(errstr, len, "unable to open log file"); 154 perr = 1; 155 break; 156 case IENOSCTP: 157 snprintf(errstr, len, "no SCTP support available"); 158 break; 159 case IENEWTEST: 160 snprintf(errstr, len, "unable to create a new test"); 161 perr = 1; 162 break; 163 case IEINITTEST: 164 snprintf(errstr, len, "test initialization failed"); 165 perr = 1; 166 break; 167 case IELISTEN: 168 snprintf(errstr, len, "unable to start listener for connections"); 169 perr = 1; 170 break; 171 case IECONNECT: 172 snprintf(errstr, len, "unable to connect to server"); 173 perr = 1; 174 break; 175 case IEACCEPT: 176 snprintf(errstr, len, "unable to accept connection from client"); 177 herr = 1; 178 perr = 1; 179 break; 180 case IESENDCOOKIE: 181 snprintf(errstr, len, "unable to send cookie to server"); 182 perr = 1; 183 break; 184 case IERECVCOOKIE: 185 snprintf(errstr, len, "unable to receive cookie at server"); 186 perr = 1; 187 break; 188 case IECTRLWRITE: 189 snprintf(errstr, len, "unable to write to the control socket"); 190 perr = 1; 191 break; 192 case IECTRLREAD: 193 snprintf(errstr, len, "unable to read from the control socket"); 194 perr = 1; 195 break; 196 case IECTRLCLOSE: 197 snprintf(errstr, len, "control socket has closed unexpectedly"); 198 break; 199 case IEMESSAGE: 200 snprintf(errstr, len, "received an unknown control message"); 201 break; 202 case IESENDMESSAGE: 203 snprintf(errstr, len, "unable to send control message"); 204 perr = 1; 205 break; 206 case IERECVMESSAGE: 207 snprintf(errstr, len, "unable to receive control message"); 208 perr = 1; 209 break; 210 case IESENDPARAMS: 211 snprintf(errstr, len, "unable to send parameters to server"); 212 perr = 1; 213 break; 214 case IERECVPARAMS: 215 snprintf(errstr, len, "unable to receive parameters from client"); 216 perr = 1; 217 break; 218 case IEPACKAGERESULTS: 219 snprintf(errstr, len, "unable to package results"); 220 perr = 1; 221 break; 222 case IESENDRESULTS: 223 snprintf(errstr, len, "unable to send results"); 224 perr = 1; 225 break; 226 case IERECVRESULTS: 227 snprintf(errstr, len, "unable to receive results"); 228 perr = 1; 229 break; 230 case IESELECT: 231 snprintf(errstr, len, "select failed"); 232 perr = 1; 233 break; 234 case IECLIENTTERM: 235 snprintf(errstr, len, "the client has terminated"); 236 break; 237 case IESERVERTERM: 238 snprintf(errstr, len, "the server has terminated"); 239 break; 240 case IEACCESSDENIED: 241 snprintf(errstr, len, "the server is busy running a test. try again later"); 242 break; 243 case IESETNODELAY: 244 snprintf(errstr, len, "unable to set TCP/SCTP NODELAY"); 245 perr = 1; 246 break; 247 case IESETMSS: 248 snprintf(errstr, len, "unable to set TCP/SCTP MSS"); 249 perr = 1; 250 break; 251 case IESETBUF: 252 snprintf(errstr, len, "unable to set socket buffer size"); 253 perr = 1; 254 break; 255 case IESETTOS: 256 snprintf(errstr, len, "unable to set IP TOS"); 257 perr = 1; 258 break; 259 case IESETCOS: 260 snprintf(errstr, len, "unable to set IPv6 traffic class"); 261 perr = 1; 262 break; 263 case IESETFLOW: 264 snprintf(errstr, len, "unable to set IPv6 flow label"); 265 break; 266 case IEREUSEADDR: 267 snprintf(errstr, len, "unable to reuse address on socket"); 268 perr = 1; 269 break; 270 case IENONBLOCKING: 271 snprintf(errstr, len, "unable to set socket to non-blocking"); 272 perr = 1; 273 break; 274 case IESETWINDOWSIZE: 275 snprintf(errstr, len, "unable to set socket window size"); 276 perr = 1; 277 break; 278 case IEPROTOCOL: 279 snprintf(errstr, len, "protocol does not exist"); 280 break; 281 case IEAFFINITY: 282 snprintf(errstr, len, "unable to set CPU affinity"); 283 perr = 1; 284 break; 285 case IEDAEMON: 286 snprintf(errstr, len, "unable to become a daemon"); 287 perr = 1; 288 break; 289 case IECREATESTREAM: 290 snprintf(errstr, len, "unable to create a new stream"); 291 herr = 1; 292 perr = 1; 293 break; 294 case IEINITSTREAM: 295 snprintf(errstr, len, "unable to initialize stream"); 296 herr = 1; 297 perr = 1; 298 break; 299 case IESTREAMLISTEN: 300 snprintf(errstr, len, "unable to start stream listener"); 301 perr = 1; 302 break; 303 case IESTREAMCONNECT: 304 snprintf(errstr, len, "unable to connect stream"); 305 herr = 1; 306 perr = 1; 307 break; 308 case IESTREAMACCEPT: 309 snprintf(errstr, len, "unable to accept stream connection"); 310 perr = 1; 311 break; 312 case IESTREAMWRITE: 313 snprintf(errstr, len, "unable to write to stream socket"); 314 perr = 1; 315 break; 316 case IESTREAMREAD: 317 snprintf(errstr, len, "unable to read from stream socket"); 318 perr = 1; 319 break; 320 case IESTREAMCLOSE: 321 snprintf(errstr, len, "stream socket has closed unexpectedly"); 322 break; 323 case IESTREAMID: 324 snprintf(errstr, len, "stream has an invalid id"); 325 break; 326 case IENEWTIMER: 327 snprintf(errstr, len, "unable to create new timer"); 328 perr = 1; 329 break; 330 case IEUPDATETIMER: 331 snprintf(errstr, len, "unable to update timer"); 332 perr = 1; 333 break; 334 case IESETCONGESTION: 335 snprintf(errstr, len, "unable to set TCP_CONGESTION: " 336 "Supplied congestion control algorithm not supported on this host"); 337 break; 338 case IEPIDFILE: 339 snprintf(errstr, len, "unable to write PID file"); 340 perr = 1; 341 break; 342 case IEV6ONLY: 343 snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY"); 344 perr = 1; 345 break; 346 case IESETSCTPDISABLEFRAG: 347 snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS"); 348 perr = 1; 349 break; 350 case IESETSCTPNSTREAM: 351 snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n"); 352 perr = 1; 353 break; 354 } 355 356 if (herr || perr) 357 strncat(errstr, ": ", len - strlen(errstr) - 1); 358 if (h_errno && herr) { 359 strncat(errstr, hstrerror(h_errno), len - strlen(errstr) - 1); 360 } else if (errno && perr) { 361 strncat(errstr, strerror(errno), len - strlen(errstr) - 1); 362 } 363 364 return errstr; 365 } 366