Changes in uspace/app/nettest1/nettest1.c [fff7ef4:26de91a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/nettest1/nettest1.c
rfff7ef4 r26de91a 38 38 #include "print_error.h" 39 39 40 #include <assert.h> 40 41 #include <malloc.h> 41 42 #include <stdio.h> … … 54 55 55 56 /** Echo module name. */ 56 #define NAME "Nettest1"57 #define NAME "nettest1" 57 58 58 59 /** Packet data pattern. */ 59 #define NETTEST1_TEXT 60 61 static int family = PF_INET;60 #define NETTEST1_TEXT "Networking test 1 - sockets" 61 62 static uint16_t family = AF_NONE; 62 63 static sock_type_t type = SOCK_DGRAM; 63 static char *data;64 64 static size_t size = 27; 65 static int verbose = 0; 65 static bool verbose = false; 66 static int sockets = 10; 67 static int messages = 10; 68 static uint16_t port = 7; 66 69 67 70 static struct sockaddr *address; 68 71 static socklen_t addrlen; 69 72 70 static int sockets; 71 static int messages; 72 static uint16_t port; 73 static char *data; 73 74 74 75 static void nettest1_print_help(void) … … 114 115 int value; 115 116 int rc; 116 117 117 118 switch (argv[*index][1]) { 118 119 /* … … 120 121 */ 121 122 case 'f': 122 rc = arg_parse_name_int(argc, argv, index, &family, 0, socket_parse_protocol_family); 123 if (rc != EOK) 124 return rc; 123 rc = arg_parse_name_int(argc, argv, index, &value, 0, 124 socket_parse_protocol_family); 125 if (rc != EOK) 126 return rc; 127 128 family = (uint16_t) value; 125 129 break; 126 130 case 'h': … … 131 135 if (rc != EOK) 132 136 return rc; 137 133 138 break; 134 139 case 'n': … … 136 141 if (rc != EOK) 137 142 return rc; 143 138 144 break; 139 145 case 'p': … … 141 147 if (rc != EOK) 142 148 return rc; 149 143 150 port = (uint16_t) value; 144 151 break; … … 147 154 if (rc != EOK) 148 155 return rc; 156 149 157 size = (value >= 0) ? (size_t) value : 0; 150 158 break; 151 159 case 't': 152 rc = arg_parse_name_int(argc, argv, index, &value, 0, socket_parse_socket_type); 153 if (rc != EOK) 154 return rc; 160 rc = arg_parse_name_int(argc, argv, index, &value, 0, 161 socket_parse_socket_type); 162 if (rc != EOK) 163 return rc; 164 155 165 type = (sock_type_t) value; 156 166 break; … … 158 168 verbose = 1; 159 169 break; 170 160 171 /* 161 172 * Long options with double dash ('-') … … 163 174 case '-': 164 175 if (str_lcmp(argv[*index] + 2, "family=", 7) == 0) { 165 rc = arg_parse_name_int(argc, argv, index, & family, 9,176 rc = arg_parse_name_int(argc, argv, index, &value, 9, 166 177 socket_parse_protocol_family); 167 178 if (rc != EOK) 168 179 return rc; 180 181 family = (uint16_t) value; 169 182 } else if (str_lcmp(argv[*index] + 2, "help", 5) == 0) { 170 183 nettest1_print_help(); … … 182 195 if (rc != EOK) 183 196 return rc; 197 184 198 port = (uint16_t) value; 185 199 } else if (str_lcmp(argv[*index] + 2, "type=", 5) == 0) { … … 188 202 if (rc != EOK) 189 203 return rc; 204 190 205 type = (sock_type_t) value; 191 206 } else if (str_lcmp(argv[*index] + 2, "verbose", 8) == 0) { … … 200 215 return EINVAL; 201 216 } 202 217 203 218 return EOK; 204 219 } … … 211 226 static void nettest1_fill_buffer(char *buffer, size_t size) 212 227 { 213 size_t length; 214 215 length = 0; 228 size_t length = 0; 216 229 while (size > length + sizeof(NETTEST1_TEXT) - 1) { 217 230 memcpy(buffer + length, NETTEST1_TEXT, … … 219 232 length += sizeof(NETTEST1_TEXT) - 1; 220 233 } 221 234 222 235 memcpy(buffer + length, NETTEST1_TEXT, size - length); 223 236 buffer[size] = '\0'; … … 226 239 static int nettest1_test(int *socket_ids, int nsockets, int nmessages) 227 240 { 228 int rc;229 230 241 if (verbose) 231 242 printf("%d sockets, %d messages\n", nsockets, nmessages); 232 233 rc = sockets_create(verbose, socket_ids, nsockets, family, type);234 if (rc != EOK) 235 return rc; 236 243 244 int rc = sockets_create(verbose, socket_ids, nsockets, family, type); 245 if (rc != EOK) 246 return rc; 247 237 248 if (type == SOCK_STREAM) { 238 249 rc = sockets_connect(verbose, socket_ids, nsockets, address, … … 241 252 return rc; 242 253 } 243 254 244 255 rc = sockets_sendto_recvfrom(verbose, socket_ids, nsockets, address, 245 &addrlen, data, size, nmessages );246 if (rc != EOK) 247 return rc; 248 256 &addrlen, data, size, nmessages, type); 257 if (rc != EOK) 258 return rc; 259 249 260 rc = sockets_close(verbose, socket_ids, nsockets); 250 261 if (rc != EOK) 251 262 return rc; 252 263 253 264 if (verbose) 254 265 printf("\tOK\n"); 255 266 256 267 /****/ 257 268 258 269 rc = sockets_create(verbose, socket_ids, nsockets, family, type); 259 270 if (rc != EOK) 260 271 return rc; 261 272 262 273 if (type == SOCK_STREAM) { 263 274 rc = sockets_connect(verbose, socket_ids, nsockets, address, … … 266 277 return rc; 267 278 } 268 279 269 280 rc = sockets_sendto(verbose, socket_ids, nsockets, address, addrlen, 270 data, size, nmessages );271 if (rc != EOK) 272 return rc; 273 281 data, size, nmessages, type); 282 if (rc != EOK) 283 return rc; 284 274 285 rc = sockets_recvfrom(verbose, socket_ids, nsockets, address, &addrlen, 275 286 data, size, nmessages); 276 287 if (rc != EOK) 277 288 return rc; 278 289 279 290 rc = sockets_close(verbose, socket_ids, nsockets); 280 291 if (rc != EOK) 281 292 return rc; 282 293 283 294 if (verbose) 284 295 printf("\tOK\n"); 285 296 286 297 return EOK; 287 298 } … … 289 300 int main(int argc, char *argv[]) 290 301 { 291 struct sockaddr_in address_in;292 struct sockaddr_in6 address_in6;293 dnsr_hostinfo_t *hinfo;294 uint8_t *address_start;295 296 int *socket_ids;297 int index;298 struct timeval time_before;299 struct timeval time_after;300 301 int rc;302 303 sockets = 10;304 messages = 10;305 port = 7;306 307 302 /* 308 303 * Parse the command line arguments. Stop before the last argument 309 304 * if it does not start with dash ('-') 310 305 */ 311 for (index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); index++) { 306 int index; 307 int rc; 308 309 for (index = 1; (index < argc - 1) || ((index == argc - 1) && 310 (argv[index][0] == '-')); index++) { 312 311 /* Options should start with dash ('-') */ 313 312 if (argv[index][0] == '-') { … … 320 319 } 321 320 } 322 323 /* If not before the last argument containing the host */321 322 /* The last argument containing the host */ 324 323 if (index >= argc) { 325 printf(" Command line error: missing host name\n");324 printf("Host name missing.\n"); 326 325 nettest1_print_help(); 327 326 return EINVAL; 328 327 } 329 330 /* Prepare the address buffer */ 331 332 switch (family) { 333 case PF_INET: 334 address_in.sin_family = AF_INET; 335 address_in.sin_port = htons(port); 336 address = (struct sockaddr *) &address_in; 337 addrlen = sizeof(address_in); 338 address_start = (uint8_t *) &address_in.sin_addr.s_addr; 339 break; 340 case PF_INET6: 341 address_in6.sin6_family = AF_INET6; 342 address_in6.sin6_port = htons(port); 343 address = (struct sockaddr *) &address_in6; 344 addrlen = sizeof(address_in6); 345 address_start = (uint8_t *) &address_in6.sin6_addr.s6_addr; 346 break; 347 default: 348 fprintf(stderr, "Address family is not supported\n"); 349 return EAFNOSUPPORT; 350 } 351 352 /* Parse the last argument which should contain the host/address */ 353 rc = inet_pton(family, argv[argc - 1], address_start); 328 329 char *host = argv[argc - 1]; 330 331 /* Interpret as address */ 332 inet_addr_t iaddr; 333 rc = inet_addr_parse(host, &iaddr); 334 354 335 if (rc != EOK) { 355 /* Try interpreting as a host name */ 356 rc = dnsr_name2host(argv[argc - 1], &hinfo); 336 /* Interpret as a host name */ 337 dnsr_hostinfo_t *hinfo = NULL; 338 rc = dnsr_name2host(host, &hinfo, ipver_from_af(family)); 339 357 340 if (rc != EOK) { 358 printf("Error resolving host '%s'.\n", argv[argc - 1]);359 return rc;341 printf("Error resolving host '%s'.\n", host); 342 return EINVAL; 360 343 } 361 362 address_in.sin_addr.s_addr = host2uint32_t_be(hinfo->addr.ipv4); 363 } 364 344 345 iaddr = hinfo->addr; 346 } 347 348 rc = inet_addr_sockaddr(&iaddr, port, &address, &addrlen); 349 if (rc != EOK) { 350 assert(rc == ENOMEM); 351 printf("Out of memory.\n"); 352 return ENOMEM; 353 } 354 355 if (family == AF_NONE) 356 family = address->sa_family; 357 358 if (address->sa_family != family) { 359 printf("Address family does not match explicitly set family.\n"); 360 return EINVAL; 361 } 362 365 363 /* Check data buffer size */ 366 364 if (size <= 0) { … … 369 367 size = 1024; 370 368 } 371 369 372 370 /* 373 371 * Prepare data buffer. Allocate size bytes plus one for the … … 380 378 } 381 379 nettest1_fill_buffer(data, size); 382 380 383 381 /* Check socket count */ 384 382 if (sockets <= 0) { … … 387 385 sockets = 2; 388 386 } 389 387 390 388 /* 391 389 * Prepare socket buffer. Allocate count fields plus the terminating 392 390 * null (\0). 393 391 */ 394 socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));392 int *socket_ids = (int *) malloc(sizeof(int) * (sockets + 1)); 395 393 if (!socket_ids) { 396 394 fprintf(stderr, "Failed to allocate receive buffer.\n"); 397 395 return ENOMEM; 398 396 } 397 399 398 socket_ids[sockets] = 0; 400 399 401 400 if (verbose) 402 401 printf("Starting tests\n"); 403 402 403 struct timeval time_before; 404 404 rc = gettimeofday(&time_before, NULL); 405 405 if (rc != EOK) { … … 407 407 return rc; 408 408 } 409 409 410 410 nettest1_test(socket_ids, 1, 1); 411 411 nettest1_test(socket_ids, 1, messages); 412 412 nettest1_test(socket_ids, sockets, 1); 413 413 nettest1_test(socket_ids, sockets, messages); 414 414 415 struct timeval time_after; 415 416 rc = gettimeofday(&time_after, NULL); 416 417 if (rc != EOK) { … … 418 419 return rc; 419 420 } 420 421 421 422 printf("Tested in %ld microseconds\n", tv_sub(&time_after, 422 423 &time_before)); 423 424 425 free(address); 426 424 427 if (verbose) 425 428 printf("Exiting\n"); 426 429 427 430 return EOK; 428 431 } 429 432 430 431 433 /** @} 432 434 */
Note:
See TracChangeset
for help on using the changeset viewer.