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