Changes in uspace/app/nettest2/nettest2.c [1ab8539:d4d74dc] in mainline
- File:
-
- 1 edited
-
uspace/app/nettest2/nettest2.c (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/nettest2/nettest2.c
r1ab8539 rd4d74dc 38 38 #include "print_error.h" 39 39 40 #include <assert.h>41 40 #include <malloc.h> 42 41 #include <stdio.h> … … 46 45 #include <time.h> 47 46 #include <arg_parse.h> 48 #include <stdbool.h> 49 50 #include <inet/dnsr.h> 47 #include <bool.h> 48 51 49 #include <net/in.h> 52 50 #include <net/in6.h> … … 56 54 57 55 /** Echo module name. */ 58 #define NAME "nettest2"56 #define NAME "Nettest2" 59 57 60 58 /** Packet data pattern. */ 61 #define NETTEST2_TEXT "Networking test 2 - transfer"62 63 static uint16_t family = AF_NONE;64 static size_t size = 28;65 static bool verbose = false;66 static sock_type_t type = SOCK_DGRAM;67 static int sockets = 10;68 static int messages = 10;69 static uint16_t port = 7;59 #define NETTEST2_TEXT "Networking test 2 - transfer" 60 61 static size_t size; 62 static bool verbose; 63 static sock_type_t type; 64 static int sockets; 65 static int messages; 66 static int family; 67 static uint16_t port; 70 68 71 69 static void nettest2_print_help(void) … … 73 71 printf( 74 72 "Network Networking test 2 aplication - UDP transfer\n" 75 "Usage: nettest2 [options] host\n"73 "Usage: echo [options] address\n" 76 74 "Where options are:\n" 77 75 "-f protocol_family | --family=protocol_family\n" … … 108 106 static void nettest2_fill_buffer(char *buffer, size_t size) 109 107 { 110 size_t length = 0; 108 size_t length; 109 110 length = 0; 111 111 while (size > length + sizeof(NETTEST2_TEXT) - 1) { 112 112 memcpy(buffer + length, NETTEST2_TEXT, … … 114 114 length += sizeof(NETTEST2_TEXT) - 1; 115 115 } 116 116 117 117 memcpy(buffer + length, NETTEST2_TEXT, size - length); 118 118 buffer[size] = '\0'; … … 129 129 int value; 130 130 int rc; 131 131 132 132 switch (argv[*index][1]) { 133 133 /* … … 135 135 */ 136 136 case 'f': 137 rc = arg_parse_name_int(argc, argv, index, & value, 0,137 rc = arg_parse_name_int(argc, argv, index, &family, 0, 138 138 socket_parse_protocol_family); 139 139 if (rc != EOK) 140 140 return rc; 141 142 family = (uint16_t) value;143 141 break; 144 142 case 'h': 145 143 nettest2_print_help(); 146 144 return EOK; 145 break; 147 146 case 'm': 148 147 rc = arg_parse_int(argc, argv, index, &messages, 0); 149 148 if (rc != EOK) 150 149 return rc; 151 152 150 break; 153 151 case 'n': … … 155 153 if (rc != EOK) 156 154 return rc; 157 158 155 break; 159 156 case 'p': … … 161 158 if (rc != EOK) 162 159 return rc; 163 164 160 port = (uint16_t) value; 165 161 break; … … 168 164 if (rc != EOK) 169 165 return rc; 170 171 166 size = (value >= 0) ? (size_t) value : 0; 172 167 break; … … 176 171 if (rc != EOK) 177 172 return rc; 178 179 173 type = (sock_type_t) value; 180 174 break; … … 182 176 verbose = true; 183 177 break; 184 185 178 /* 186 179 * Long options with double dash ('-') … … 188 181 case '-': 189 182 if (str_lcmp(argv[*index] + 2, "family=", 7) == 0) { 190 rc = arg_parse_name_int(argc, argv, index, & value, 9,183 rc = arg_parse_name_int(argc, argv, index, &family, 9, 191 184 socket_parse_protocol_family); 192 185 if (rc != EOK) 193 186 return rc; 194 195 family = (uint16_t) value;196 187 } else if (str_lcmp(argv[*index] + 2, "help", 5) == 0) { 197 188 nettest2_print_help(); … … 209 200 if (rc != EOK) 210 201 return rc; 211 212 202 port = (uint16_t) value; 213 203 } else if (str_lcmp(argv[*index] + 2, "type=", 5) == 0) { … … 216 206 if (rc != EOK) 217 207 return rc; 218 219 208 type = (sock_type_t) value; 220 209 } else if (str_lcmp(argv[*index] + 2, "verbose", 8) == 0) { … … 229 218 return EINVAL; 230 219 } 231 220 232 221 return EOK; 233 222 } … … 235 224 int main(int argc, char *argv[]) 236 225 { 226 struct sockaddr *address; 227 struct sockaddr_in address_in; 228 struct sockaddr_in6 address_in6; 229 socklen_t addrlen; 230 uint8_t *address_start; 231 232 int *socket_ids; 233 char *data; 237 234 int index; 235 struct timeval time_before; 236 struct timeval time_after; 237 238 238 int rc; 239 239 240 size = 28; 241 verbose = false; 242 type = SOCK_DGRAM; 243 sockets = 10; 244 messages = 10; 245 family = PF_INET; 246 port = 7; 247 240 248 /* 241 249 * Parse the command line arguments. … … 245 253 for (index = 1; (index < argc - 1) || ((index == argc - 1) && 246 254 (argv[index][0] == '-')); ++index) { 255 247 256 /* Options should start with dash ('-') */ 248 257 if (argv[index][0] == '-') { … … 255 264 } 256 265 } 257 258 /* The last argument containing the host*/266 267 /* If not before the last argument containing the address */ 259 268 if (index >= argc) { 260 printf(" Host name missing.\n");269 printf("Command line error: missing address\n"); 261 270 nettest2_print_help(); 262 271 return EINVAL; 263 272 } 264 265 char *addr_s = argv[argc - 1]; 266 267 /* Interpret as address */ 268 inet_addr_t addr_addr; 269 rc = inet_addr_parse(addr_s, &addr_addr); 270 273 274 /* Prepare the address buffer */ 275 276 switch (family) { 277 case PF_INET: 278 address_in.sin_family = AF_INET; 279 address_in.sin_port = htons(port); 280 address = (struct sockaddr *) &address_in; 281 addrlen = sizeof(address_in); 282 address_start = (uint8_t *) &address_in.sin_addr.s_addr; 283 break; 284 case PF_INET6: 285 address_in6.sin6_family = AF_INET6; 286 address_in6.sin6_port = htons(port); 287 address = (struct sockaddr *) &address_in6; 288 addrlen = sizeof(address_in6); 289 address_start = (uint8_t *) &address_in6.sin6_addr.s6_addr; 290 break; 291 default: 292 fprintf(stderr, "Address family is not supported\n"); 293 return EAFNOSUPPORT; 294 } 295 296 /* Parse the last argument which should contain the address. */ 297 rc = inet_pton(family, argv[argc - 1], address_start); 271 298 if (rc != EOK) { 272 /* Interpret as a host name */ 273 dnsr_hostinfo_t *hinfo = NULL; 274 rc = dnsr_name2host(addr_s, &hinfo, ipver_from_af(family)); 275 276 if (rc != EOK) { 277 printf("Error resolving host '%s'.\n", addr_s); 278 return EINVAL; 279 } 280 281 addr_addr = hinfo->addr; 282 } 283 284 struct sockaddr *address; 285 socklen_t addrlen; 286 rc = inet_addr_sockaddr(&addr_addr, port, &address, &addrlen); 287 if (rc != EOK) { 288 assert(rc == ENOMEM); 289 printf("Out of memory.\n"); 290 return ENOMEM; 291 } 292 293 if (family == AF_NONE) 294 family = address->sa_family; 295 296 if (address->sa_family != family) { 297 printf("Address family does not match explicitly set family.\n"); 298 return EINVAL; 299 } 300 299 fprintf(stderr, "Address parse error %d\n", rc); 300 return rc; 301 } 302 301 303 /* Check data buffer size. */ 302 304 if (size <= 0) { … … 305 307 size = 1024; 306 308 } 307 309 308 310 /* 309 311 * Prepare the buffer. Allocate size bytes plus one for terminating 310 312 * null character. 311 313 */ 312 char *data = (char *) malloc(size + 1);314 data = (char *) malloc(size + 1); 313 315 if (!data) { 314 316 fprintf(stderr, "Failed to allocate data buffer.\n"); 315 317 return ENOMEM; 316 318 } 317 319 318 320 /* Fill buffer with a pattern. */ 319 321 nettest2_fill_buffer(data, size); 320 322 321 323 /* Check socket count. */ 322 324 if (sockets <= 0) { … … 325 327 sockets = 2; 326 328 } 327 329 328 330 /* 329 331 * Prepare the socket buffer. 330 332 * Allocate count entries plus the terminating null (\0) 331 333 */ 332 int *socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));334 socket_ids = (int *) malloc(sizeof(int) * (sockets + 1)); 333 335 if (!socket_ids) { 334 336 fprintf(stderr, "Failed to allocate receive buffer.\n"); 335 337 return ENOMEM; 336 338 } 337 338 339 socket_ids[sockets] = 0; 339 340 340 341 if (verbose) 341 342 printf("Starting tests\n"); 342 343 343 344 rc = sockets_create(verbose, socket_ids, sockets, family, type); 344 345 if (rc != EOK) 345 346 return rc; 346 347 347 348 if (type == SOCK_STREAM) { 348 349 rc = sockets_connect(verbose, socket_ids, sockets, … … 351 352 return rc; 352 353 } 353 354 354 355 if (verbose) 355 356 printf("\n"); 356 357 struct timeval time_before; 358 gettimeofday(&time_before, NULL); 359 357 358 rc = gettimeofday(&time_before, NULL); 359 if (rc != EOK) { 360 fprintf(stderr, "Get time of day error %d\n", rc); 361 return rc; 362 } 363 360 364 rc = sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, 361 &addrlen, data, size, messages , type);365 &addrlen, data, size, messages); 362 366 if (rc != EOK) 363 367 return rc; 364 365 struct timeval time_after; 366 gettimeofday(&time_after, NULL); 367 368 369 rc = gettimeofday(&time_after, NULL); 370 if (rc != EOK) { 371 fprintf(stderr, "Get time of day error %d\n", rc); 372 return rc; 373 } 374 368 375 if (verbose) 369 376 printf("\tOK\n"); 370 377 371 378 printf("sendto + recvfrom tested in %ld microseconds\n", 372 379 tv_sub(&time_after, &time_before)); 373 374 gettimeofday(&time_before, NULL); 375 380 381 rc = gettimeofday(&time_before, NULL); 382 if (rc != EOK) { 383 fprintf(stderr, "Get time of day error %d\n", rc); 384 return rc; 385 } 386 376 387 rc = sockets_sendto(verbose, socket_ids, sockets, address, addrlen, 377 data, size, messages , type);388 data, size, messages); 378 389 if (rc != EOK) 379 390 return rc; 380 391 381 392 rc = sockets_recvfrom(verbose, socket_ids, sockets, address, &addrlen, 382 393 data, size, messages); 383 394 if (rc != EOK) 384 395 return rc; 385 386 gettimeofday(&time_after, NULL); 387 396 397 rc = gettimeofday(&time_after, NULL); 398 if (rc != EOK) { 399 fprintf(stderr, "Get time of day error %d\n", rc); 400 return rc; 401 } 402 388 403 if (verbose) 389 404 printf("\tOK\n"); 390 405 391 406 printf("sendto, recvfrom tested in %ld microseconds\n", 392 407 tv_sub(&time_after, &time_before)); 393 408 394 409 rc = sockets_close(verbose, socket_ids, sockets); 395 410 if (rc != EOK) 396 411 return rc; 397 398 free(address); 399 412 400 413 if (verbose) 401 414 printf("\nExiting\n"); 402 415 403 416 return EOK; 404 417 }
Note:
See TracChangeset
for help on using the changeset viewer.
