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