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