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