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