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