- Timestamp:
- 12/05/17 16:36:17 (3 years ago)
- Branches:
- cachetimestamps, develop, dpdk-ndag, etsilive, master, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance
- Children:
- 7ff881a
- Parents:
- c7e547e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/format_dpdkndag.c
rc7e547e rd83ba86a 14 14 #include <unistd.h> 15 15 #include <stdlib.h> 16 #include <sys/types.h> 17 #include <sys/socket.h> 18 #include <netdb.h> 16 19 17 20 #include "format_dpdk.h" … … 50 53 libtrace_t *dpdkrecv; 51 54 52 char *multicastgroup; 53 uint16_t beaconport; 55 struct addrinfo *multicastgroup; 54 56 char *localiface; 55 57 … … 79 81 char *next = NULL; 80 82 char dpdkuri[1280]; 83 struct addrinfo hints, *result; 81 84 82 85 libtrace->format_data = (dpdkndag_format_data_t *)malloc( 83 86 sizeof(dpdkndag_format_data_t)); 84 87 85 FORMAT_DATA->multicastgroup = NULL;86 FORMAT_DATA->beaconport = 9001;87 88 FORMAT_DATA->localiface = NULL; 88 89 FORMAT_DATA->threaddatas = NULL; … … 92 93 if (scan == NULL) { 93 94 trace_set_err(libtrace, TRACE_ERR_BAD_FORMAT, 94 "Bad ndag URI. Should be ndag:<interface>,<multicast group>,<port number>");95 "Bad dpdkndag URI. Should be dpdkndag:<interface>,<multicast group>"); 95 96 return -1; 96 97 } … … 99 100 next = scan + 1; 100 101 101 scan = strchr(next, ','); 102 if (scan == NULL) { 103 FORMAT_DATA->multicastgroup = strdup(next); 104 } else { 105 FORMAT_DATA->multicastgroup = strndup(next, (size_t)(scan - next)); 106 107 FORMAT_DATA->beaconport = strtoul(scan + 1, NULL, 0); 108 } 102 memset(&hints, 0, sizeof(struct addrinfo)); 103 hints.ai_family = AF_UNSPEC; 104 hints.ai_socktype = SOCK_DGRAM; 105 hints.ai_flags = AI_PASSIVE; 106 hints.ai_protocol = 0; 107 108 if (getaddrinfo(next, NULL, &hints, &result) != 0) { 109 perror("getaddrinfo"); 110 trace_set_err(libtrace, TRACE_ERR_BAD_FORMAT, 111 "Invalid multicast address: %s", next); 112 return -1; 113 } 114 115 FORMAT_DATA->multicastgroup = result; 109 116 110 117 snprintf(dpdkuri, 1279, "dpdk:%s", FORMAT_DATA->localiface); … … 227 234 228 235 if (FORMAT_DATA->multicastgroup) { 229 free (FORMAT_DATA->multicastgroup);236 freeaddrinfo(FORMAT_DATA->multicastgroup); 230 237 } 231 238 … … 338 345 } 339 346 340 static int process_fresh_packet(perthread_t *pt, char *expectedaddr) { 347 static int sockaddr_same(struct sockaddr *a, struct sockaddr *b) { 348 349 if (a->sa_family != b->sa_family) { 350 return 0; 351 } 352 353 if (a->sa_family == AF_INET) { 354 struct sockaddr_in *ain = (struct sockaddr_in *)a; 355 struct sockaddr_in *bin = (struct sockaddr_in *)b; 356 357 if (ain->sin_addr.s_addr != bin->sin_addr.s_addr) { 358 return 0; 359 } 360 return 1; 361 } else if (a->sa_family == AF_INET6) { 362 struct sockaddr_in6 *ain6 = (struct sockaddr_in6 *)a; 363 struct sockaddr_in6 *bin6 = (struct sockaddr_in6 *)b; 364 365 if (memcmp(ain6->sin6_addr.s6_addr, bin6->sin6_addr.s6_addr, 366 sizeof(ain6->sin6_addr.s6_addr)) != 0) { 367 return 0; 368 } 369 return 1; 370 } 371 return 0; 372 } 373 374 static int process_fresh_packet(perthread_t *pt, struct addrinfo *expectedaddr) { 341 375 342 376 ndag_common_t *header = (ndag_common_t *)pt->ndagheader; … … 344 378 sizeof(ndag_common_t)); 345 379 uint16_t targetport; 346 char targetaddr[INET6_ADDRSTRLEN]; 380 struct sockaddr_storage targetaddr; 381 struct sockaddr *p; 347 382 capstream_t *cap = NULL; 348 383 int i; 349 384 385 memset((&targetaddr), 0, sizeof(targetaddr)); 350 386 if (header->type != NDAG_PKT_ENCAPERF) { 351 387 pt->nextrec = NULL; … … 355 391 } 356 392 357 /* TODO check for missing records */ 358 targetport = trace_get_destination_port(pt->dpdkpkt); 359 if (trace_get_destination_address_string(pt->dpdkpkt, targetaddr, 360 INET6_ADDRSTRLEN) == NULL) { 393 if ((p = trace_get_destination_address(pt->dpdkpkt, 394 (struct sockaddr *)(&targetaddr))) == NULL) { 361 395 pt->nextrec = NULL; 362 396 pt->ndagsize = 0; … … 365 399 } 366 400 367 if ( strcmp(targetaddr, expectedaddr) != 0) {401 if (!(sockaddr_same(p, expectedaddr->ai_addr))) { 368 402 pt->nextrec = NULL; 369 403 pt->ndagsize = 0; … … 372 406 } 373 407 408 targetport = trace_get_destination_port(pt->dpdkpkt); 374 409 if (pt->streamcount == 0) { 375 410 pt->capstreams = (capstream_t *)malloc(sizeof(capstream_t));
Note: See TracChangeset
for help on using the changeset viewer.