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