1 /* 2 * iperf, Copyright (c) 2014-2019, 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 && test->outfile != stdout) { 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 && test->outfile != stdout) { 71 fprintf(test->outfile, "iperf3: %s\n", str); 72 } 73 else { 74 fprintf(stderr, "iperf3: %s\n", str); 75 } 76 va_end(argp); 77 if (test) 78 iperf_delete_pidfile(test); 79 exit(1); 80 } 81 82 int i_errno; 83 84 char * 85 iperf_strerror(int int_errno) 86 { 87 static char errstr[256]; 88 int len, perr, herr; 89 perr = herr = 0; 90 91 len = sizeof(errstr); 92 memset(errstr, 0, len); 93 94 switch (int_errno) { 95 case IENONE: 96 snprintf(errstr, len, "no error"); 97 break; 98 case IESERVCLIENT: 99 snprintf(errstr, len, "cannot be both server and client"); 100 break; 101 case IENOROLE: 102 snprintf(errstr, len, "must either be a client (-c) or server (-s)"); 103 break; 104 case IESERVERONLY: 105 snprintf(errstr, len, "some option you are trying to set is server only"); 106 break; 107 case IECLIENTONLY: 108 snprintf(errstr, len, "some option you are trying to set is client only"); 109 break; 110 case IEDURATION: 111 snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME); 112 break; 113 case IENUMSTREAMS: 114 snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS); 115 break; 116 case IEBLOCKSIZE: 117 snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE); 118 break; 119 case IEBUFSIZE: 120 snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER); 121 break; 122 case IEINTERVAL: 123 snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL); 124 break; 125 case IEBIND: /* UNUSED */ 126 snprintf(errstr, len, "--bind must be specified to use --cport"); 127 break; 128 case IEUDPBLOCKSIZE: 129 snprintf(errstr, len, "block size invalid (minimum = %d bytes, maximum = %d bytes)", MIN_UDP_BLOCKSIZE, MAX_UDP_BLOCKSIZE); 130 break; 131 case IEBADTOS: 132 snprintf(errstr, len, "bad TOS value (must be between 0 and 255 inclusive)"); 133 break; 134 case IESETCLIENTAUTH: 135 snprintf(errstr, len, "you must specify username (max 20 chars), password (max 20 chars) and a path to a valid public rsa client to be used"); 136 break; 137 case IESETSERVERAUTH: 138 snprintf(errstr, len, "you must specify path to a valid private rsa server to be used and a user credential file"); 139 break; 140 case IEBADFORMAT: 141 snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])"); 142 break; 143 case IEBADPORT: 144 snprintf(errstr, len, "port number must be between 1 and 65535 inclusive"); 145 break; 146 case IEMSS: 147 snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS); 148 break; 149 case IENOSENDFILE: 150 snprintf(errstr, len, "this OS does not support sendfile"); 151 break; 152 case IEOMIT: 153 snprintf(errstr, len, "bogus value for --omit"); 154 break; 155 case IEUNIMP: 156 snprintf(errstr, len, "an option you are trying to set is not implemented yet"); 157 break; 158 case IEFILE: 159 snprintf(errstr, len, "unable to open -F file"); 160 perr = 1; 161 break; 162 case IEBURST: 163 snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST); 164 break; 165 case IEENDCONDITIONS: 166 snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified"); 167 break; 168 case IELOGFILE: 169 snprintf(errstr, len, "unable to open log file"); 170 perr = 1; 171 break; 172 case IENOSCTP: 173 snprintf(errstr, len, "no SCTP support available"); 174 break; 175 case IENEWTEST: 176 snprintf(errstr, len, "unable to create a new test"); 177 perr = 1; 178 break; 179 case IEINITTEST: 180 snprintf(errstr, len, "test initialization failed"); 181 perr = 1; 182 break; 183 case IEAUTHTEST: 184 snprintf(errstr, len, "test authorization failed"); 185 break; 186 case IELISTEN: 187 snprintf(errstr, len, "unable to start listener for connections"); 188 perr = 1; 189 break; 190 case IECONNECT: 191 snprintf(errstr, len, "unable to connect to server"); 192 perr = 1; 193 break; 194 case IEACCEPT: 195 snprintf(errstr, len, "unable to accept connection from client"); 196 herr = 1; 197 perr = 1; 198 break; 199 case IESENDCOOKIE: 200 snprintf(errstr, len, "unable to send cookie to server"); 201 perr = 1; 202 break; 203 case IERECVCOOKIE: 204 snprintf(errstr, len, "unable to receive cookie at server"); 205 perr = 1; 206 break; 207 case IECTRLWRITE: 208 snprintf(errstr, len, "unable to write to the control socket"); 209 perr = 1; 210 break; 211 case IECTRLREAD: 212 snprintf(errstr, len, "unable to read from the control socket"); 213 perr = 1; 214 break; 215 case IECTRLCLOSE: 216 snprintf(errstr, len, "control socket has closed unexpectedly"); 217 break; 218 case IEMESSAGE: 219 snprintf(errstr, len, "received an unknown control message"); 220 break; 221 case IESENDMESSAGE: 222 snprintf(errstr, len, "unable to send control message"); 223 perr = 1; 224 break; 225 case IERECVMESSAGE: 226 snprintf(errstr, len, "unable to receive control message"); 227 perr = 1; 228 break; 229 case IESENDPARAMS: 230 snprintf(errstr, len, "unable to send parameters to server"); 231 perr = 1; 232 break; 233 case IERECVPARAMS: 234 snprintf(errstr, len, "unable to receive parameters from client"); 235 perr = 1; 236 break; 237 case IEPACKAGERESULTS: 238 snprintf(errstr, len, "unable to package results"); 239 perr = 1; 240 break; 241 case IESENDRESULTS: 242 snprintf(errstr, len, "unable to send results"); 243 perr = 1; 244 break; 245 case IERECVRESULTS: 246 snprintf(errstr, len, "unable to receive results"); 247 perr = 1; 248 break; 249 case IESELECT: 250 snprintf(errstr, len, "select failed"); 251 perr = 1; 252 break; 253 case IECLIENTTERM: 254 snprintf(errstr, len, "the client has terminated"); 255 break; 256 case IESERVERTERM: 257 snprintf(errstr, len, "the server has terminated"); 258 break; 259 case IEACCESSDENIED: 260 snprintf(errstr, len, "the server is busy running a test. try again later"); 261 break; 262 case IESETNODELAY: 263 snprintf(errstr, len, "unable to set TCP/SCTP NODELAY"); 264 perr = 1; 265 break; 266 case IESETMSS: 267 snprintf(errstr, len, "unable to set TCP/SCTP MSS"); 268 perr = 1; 269 break; 270 case IESETBUF: 271 snprintf(errstr, len, "unable to set socket buffer size"); 272 perr = 1; 273 break; 274 case IESETTOS: 275 snprintf(errstr, len, "unable to set IP TOS"); 276 perr = 1; 277 break; 278 case IESETCOS: 279 snprintf(errstr, len, "unable to set IPv6 traffic class"); 280 perr = 1; 281 break; 282 case IESETFLOW: 283 snprintf(errstr, len, "unable to set IPv6 flow label"); 284 break; 285 case IEREUSEADDR: 286 snprintf(errstr, len, "unable to reuse address on socket"); 287 perr = 1; 288 break; 289 case IENONBLOCKING: 290 snprintf(errstr, len, "unable to set socket to non-blocking"); 291 perr = 1; 292 break; 293 case IESETWINDOWSIZE: 294 snprintf(errstr, len, "unable to set socket window size"); 295 perr = 1; 296 break; 297 case IEPROTOCOL: 298 snprintf(errstr, len, "protocol does not exist"); 299 break; 300 case IEAFFINITY: 301 snprintf(errstr, len, "unable to set CPU affinity"); 302 perr = 1; 303 break; 304 case IEDAEMON: 305 snprintf(errstr, len, "unable to become a daemon"); 306 perr = 1; 307 break; 308 case IECREATESTREAM: 309 snprintf(errstr, len, "unable to create a new stream"); 310 herr = 1; 311 perr = 1; 312 break; 313 case IEINITSTREAM: 314 snprintf(errstr, len, "unable to initialize stream"); 315 herr = 1; 316 perr = 1; 317 break; 318 case IESTREAMLISTEN: 319 snprintf(errstr, len, "unable to start stream listener"); 320 perr = 1; 321 break; 322 case IESTREAMCONNECT: 323 snprintf(errstr, len, "unable to connect stream"); 324 herr = 1; 325 perr = 1; 326 break; 327 case IESTREAMACCEPT: 328 snprintf(errstr, len, "unable to accept stream connection"); 329 perr = 1; 330 break; 331 case IESTREAMWRITE: 332 snprintf(errstr, len, "unable to write to stream socket"); 333 perr = 1; 334 break; 335 case IESTREAMREAD: 336 snprintf(errstr, len, "unable to read from stream socket"); 337 perr = 1; 338 break; 339 case IESTREAMCLOSE: 340 snprintf(errstr, len, "stream socket has closed unexpectedly"); 341 break; 342 case IESTREAMID: 343 snprintf(errstr, len, "stream has an invalid id"); 344 break; 345 case IENEWTIMER: 346 snprintf(errstr, len, "unable to create new timer"); 347 perr = 1; 348 break; 349 case IEUPDATETIMER: 350 snprintf(errstr, len, "unable to update timer"); 351 perr = 1; 352 break; 353 case IESETCONGESTION: 354 snprintf(errstr, len, "unable to set TCP_CONGESTION: " 355 "Supplied congestion control algorithm not supported on this host"); 356 break; 357 case IEPIDFILE: 358 snprintf(errstr, len, "unable to write PID file"); 359 perr = 1; 360 break; 361 case IEV6ONLY: 362 snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY"); 363 perr = 1; 364 break; 365 case IESETSCTPDISABLEFRAG: 366 snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS"); 367 perr = 1; 368 break; 369 case IESETSCTPNSTREAM: 370 snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n"); 371 perr = 1; 372 break; 373 case IESETPACING: 374 snprintf(errstr, len, "unable to set socket pacing"); 375 perr = 1; 376 break; 377 case IESETBUF2: 378 snprintf(errstr, len, "socket buffer size not set correctly"); 379 break; 380 case IEREVERSEBIDIR: 381 snprintf(errstr, len, "cannot be both reverse and bidirectional"); 382 break; 383 384 } 385 386 if (herr || perr) 387 strncat(errstr, ": ", len - strlen(errstr) - 1); 388 if (errno && perr) 389 strncat(errstr, strerror(errno), len - strlen(errstr) - 1); 390 391 return errstr; 392 } 393