Changeset d83ba86a


Ignore:
Timestamp:
12/05/17 16:36:17 (3 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
cachetimestamps, develop, dpdk-ndag, etsilive, master, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance
Children:
7ff881a
Parents:
c7e547e
Message:

Don't do string conversions and comparisons for every packet

Since the expected address is never going to change, it is a lot
more efficient to just convert that string to a sockaddr and
compare sockaddrs instead.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_dpdkndag.c

    rc7e547e rd83ba86a  
    1414#include <unistd.h>
    1515#include <stdlib.h>
     16#include <sys/types.h>
     17#include <sys/socket.h>
     18#include <netdb.h>
    1619
    1720#include "format_dpdk.h"
     
    5053        libtrace_t *dpdkrecv;
    5154
    52         char *multicastgroup;
    53         uint16_t beaconport;
     55        struct addrinfo *multicastgroup;
    5456        char *localiface;
    5557
     
    7981        char *next = NULL;
    8082        char dpdkuri[1280];
     83        struct addrinfo hints, *result;
    8184
    8285        libtrace->format_data = (dpdkndag_format_data_t *)malloc(
    8386                        sizeof(dpdkndag_format_data_t));
    8487
    85         FORMAT_DATA->multicastgroup = NULL;
    86         FORMAT_DATA->beaconport = 9001;
    8788        FORMAT_DATA->localiface = NULL;
    8889        FORMAT_DATA->threaddatas = NULL;
     
    9293        if (scan == NULL) {
    9394                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>");
    9596                return -1;
    9697        }
     
    99100        next = scan + 1;
    100101
    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;
    109116
    110117        snprintf(dpdkuri, 1279, "dpdk:%s", FORMAT_DATA->localiface);
     
    227234
    228235        if (FORMAT_DATA->multicastgroup) {
    229                 free(FORMAT_DATA->multicastgroup);
     236                freeaddrinfo(FORMAT_DATA->multicastgroup);
    230237        }
    231238
     
    338345}
    339346
    340 static int process_fresh_packet(perthread_t *pt, char *expectedaddr) {
     347static 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
     374static int process_fresh_packet(perthread_t *pt, struct addrinfo *expectedaddr) {
    341375
    342376        ndag_common_t *header = (ndag_common_t *)pt->ndagheader;
     
    344378                        sizeof(ndag_common_t));
    345379        uint16_t targetport;
    346         char targetaddr[INET6_ADDRSTRLEN];
     380        struct sockaddr_storage targetaddr;
     381        struct sockaddr *p;
    347382        capstream_t *cap = NULL;
    348383        int i;
    349384
     385        memset((&targetaddr), 0, sizeof(targetaddr));
    350386        if (header->type != NDAG_PKT_ENCAPERF) {
    351387                pt->nextrec = NULL;
     
    355391        }
    356392
    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) {
    361395                pt->nextrec = NULL;
    362396                pt->ndagsize = 0;
     
    365399        }
    366400
    367         if (strcmp(targetaddr, expectedaddr) != 0) {
     401        if (!(sockaddr_same(p, expectedaddr->ai_addr))) {
    368402                pt->nextrec = NULL;
    369403                pt->ndagsize = 0;
     
    372406        }
    373407
     408        targetport = trace_get_destination_port(pt->dpdkpkt);
    374409        if (pt->streamcount == 0) {
    375410                pt->capstreams = (capstream_t *)malloc(sizeof(capstream_t));
Note: See TracChangeset for help on using the changeset viewer.