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