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