Changeset 977e0db


Ignore:
Timestamp:
01/11/19 16:58:26 (21 months ago)
Author:
Jacob Van Walraven <jcv9@…>
Branches:
develop
Children:
e7132d6
Parents:
3c828b8
Message:

Add meta api for erf and pcapng meta packets

Location:
lib
Files:
1 added
24 edited

Legend:

Unmodified
Added
Removed
  • lib/Makefile.am

    r1668208 r977e0db  
    6363
    6464libtrace_la_SOURCES = trace.c trace_parallel.c common.h \
    65                 format_erf.c format_pcap.c format_legacy.c \
     65                format_pktmeta.c format_erf.c format_pcap.c format_legacy.c \
    6666                format_rt.c format_helper.c format_helper.h format_pcapfile.c \
    6767                format_duck.c format_tsh.c $(NATIVEFORMATS) $(BPFFORMATS) \
  • lib/dagformat.h

    ree6e802 r977e0db  
    104104} PACKED dag_record_t;
    105105
     106typedef struct dag_section_header {
     107        uint16_t type;
     108        uint16_t len;
     109} dag_sec_t;
     110
    106111#ifdef WIN32
    107112#pragma pack(pop)
  • lib/format_atmhdr.c

    r2193905 r977e0db  
    209209        NULL,                           /* get_timespec */
    210210        NULL,                           /* get_seconds */
     211        NULL,                           /* get_meta_data */
    211212        NULL,                           /* seek_erf */
    212213        NULL,                           /* seek_timeval */
  • lib/format_bpf.c

    r418c78d r977e0db  
    632632        NULL,                   /* get_timespec */
    633633        NULL,                   /* get_seconds */
     634        NULL,                   /* get_meta_data */
    634635        NULL,                   /* seek_erf */
    635636        NULL,                   /* seek_timeval */
     
    683684        NULL,                   /* get_timespec */
    684685        NULL,                   /* get_seconds */
     686        NULL,                   /* get_meta_data */
    685687        NULL,                   /* seek_erf */
    686688        NULL,                   /* seek_timeval */
  • lib/format_dag24.c

    r418c78d r977e0db  
    542542        NULL,                           /* seek_timeval */
    543543        NULL,                           /* seek_seconds */
     544        NULL,                           /* get_meta_data */
    544545        erf_get_capture_length,         /* get_capture_length */
    545546        erf_get_wire_length,            /* get_wire_length */
  • lib/format_dag25.c

    r9a6bdbc r977e0db  
    16251625        NULL,                           /* get_seconds */
    16261626        NULL,                           /* get_timespec */
     1627        NULL,                           /* get_meta_data */
    16271628        NULL,                           /* seek_erf */
    16281629        NULL,                           /* seek_timeval */
  • lib/format_dpdk.c

    r9a6bdbc r977e0db  
    22532253        NULL,                               /* seek_timeval */
    22542254        NULL,                               /* seek_seconds */
     2255        NULL,                               /* get_meta_data */
    22552256        dpdk_get_capture_length,            /* get_capture_length */
    22562257        dpdk_get_wire_length,               /* get_wire_length */
  • lib/format_dpdkndag.c

    rfdf23b8 r977e0db  
    749749        NULL,                   /* seek_timeval */
    750750        NULL,                   /* seek_seconds */
     751        NULL,                   /* get_meta_data */
    751752        erf_get_capture_length, /* get_capture_length */
    752753        erf_get_wire_length,    /* get_wire_length */
  • lib/format_duck.c

    r2193905 r977e0db  
    363363        NULL,                           /* get_timespec */
    364364        NULL,                           /* get_seconds */
     365        NULL,                           /* get_meta_data */
    365366        NULL,                           /* seek_erf */
    366367        NULL,                           /* seek_timeval */
  • lib/format_erf.c

    r3c828b8 r977e0db  
    914914}
    915915
     916/* Returns a pointer to the beginning of the section or NULL if not found */
     917void *erf_get_meta_data(libtrace_packet_t *packet, uint32_t section_type, uint16_t section) {
     918
     919        uint32_t remaining;
     920        void *bodyptr;
     921        dag_sec_t *sec;
     922        dag_record_t *hdr;
     923        uint16_t curr_sec;
     924
     925        hdr = (dag_record_t *)packet->header;
     926        bodyptr = (char *)packet->payload;
     927        remaining = ntohs(hdr->rlen) - 24;
     928
     929        /* ensure this is a meta packet */
     930        /* the type only uses bits 0-6 */
     931        if ((hdr->type & 127) != 27) { return NULL; }
     932
     933        sec = (dag_sec_t *)bodyptr;
     934        /* loop till we find the correct section within the correct section type
     935         * and enough payload is remaining */
     936        while (((ntohs(sec->type) != section) || (section_type != curr_sec))
     937                && (remaining > sizeof(dag_sec_t))) {
     938
     939                if (ntohs(sec->type) == ERF_PROV_SECTION_CAPTURE
     940                        || ntohs(sec->type) == ERF_PROV_SECTION_HOST
     941                        || ntohs(sec->type) == ERF_PROV_SECTION_MODULE
     942                        || ntohs(sec->type) == ERF_PROV_SECTION_INTERFACE) {
     943
     944                        curr_sec = ntohs(sec->type);
     945                }
     946
     947                /* jump over any padding (padded to 32bits/4bytes) */
     948                if ((ntohs(sec->len) % 4) != 0) {
     949                        remaining -= ntohs(sec->len) + (4 - (ntohs(sec->len) % 4));
     950                        bodyptr += ntohs(sec->len) + (4 - (ntohs(sec->len) % 4));
     951                } else {
     952                        remaining -= ntohs(sec->len);
     953                        bodyptr += ntohs(sec->len);
     954                }
     955                remaining -= sizeof(dag_sec_t);
     956                bodyptr += sizeof(dag_sec_t);
     957
     958                sec = (dag_sec_t *)bodyptr;
     959        }
     960        /* if found return pointer to the beginning of the section */
     961        if (ntohs(sec->type) == section && curr_sec == section_type) {
     962                return (void *)bodyptr;
     963        } else {
     964                return NULL;
     965        }
     966}
     967
    916968static void erf_help(void) {
    917969        printf("erf format module: $Revision: 1752 $\n");
     
    932984        printf("\n");
    933985
    934        
     986
    935987}
    936988
     
    9621014        NULL,                           /* get_timespec */
    9631015        NULL,                           /* get_seconds */
     1016        erf_get_meta_data,              /* get_meta_data */
    9641017        erf_seek_erf,                   /* seek_erf */
    9651018        NULL,                           /* seek_timeval */
     
    10071060        NULL,                           /* get_timespec */
    10081061        NULL,                           /* get_seconds */
     1062        erf_get_meta_data,              /* get_meta_data */
    10091063        erf_seek_erf,                   /* seek_erf */
    10101064        NULL,                           /* seek_timeval */
  • lib/format_erf.h

    ra857389 r977e0db  
    2929#include "libtrace.h"
    3030
     31/* ERF Section codes */
     32#define ERF_PROV_SECTION_CAPTURE 0xFF00
     33#define ERF_PROV_SECTION_HOST 0xFF01
     34#define ERF_PROV_SECTION_MODULE 0xFF02
     35#define ERF_PROV_SECTION_INTERFACE 0xFF03
     36
     37/* ERF Provenance record tag type codes */
     38#define ERF_PROV_COMMENT 1
     39#define ERF_PROV_FCS_LEN 8
     40#define ERF_PROV_MASK_CIDR 10
     41#define ERF_PROV_NAME 12
     42#define ERF_PROV_DESCR 13
     43#define ERF_PROV_HOSTNAME 18
     44#define ERF_PROV_OS 17
     45#define ERF_PROV_MODEL 20
     46#define ERF_PROV_FW_VERSION 21
     47#define ERF_PROV_SERIAL_NO 22
     48#define ERF_PROV_ORG_NAME 11
     49#define ERF_PROV_CARD_NUM 30
     50#define ERF_PROV_MODULE_NUM 31
     51#define ERF_PROV_LOC_NAME 34
     52#define ERF_PROV_FLOW_HASH_MODE 37
     53#define ERF_PROV_TUNNELING_MODE 38
     54#define ERF_PROV_LOC_DESCR 46
     55#define ERF_PROV_MEM 40
     56#define ERF_PROV_DEV_NAME 44
     57#define ERF_PROV_DEV_PATH 45
     58#define ERF_PROV_CPU 49
     59#define ERF_PROV_CPU_PHYS_CORES 50
     60#define ERF_PROV_CPU_NUMA_NODES 51
     61#define ERF_PROV_DAG_VERSION 53
     62#define ERF_PROV_IF_NUM 64
     63#define ERF_PROV_IF_SPEED 66
     64#define ERF_PROV_IF_IPV4 67
     65#define ERF_PROV_IF_IPV6 68
     66#define ERF_PROV_IF_MAC 69
     67#define ERF_PROV_IF_SFP_TYPE 78
     68#define ERF_PROV_IF_LINK_STATUS 81
     69#define ERF_PROV_IF_PHY_MODE 82
     70#define ERF_PROV_IF_PORT_TYPE 83
     71#define ERF_PROV_IF_RX_LATENCY 84
     72#define ERF_PROV_IF_RX_POWER 79
     73#define ERF_PROV_IF_TX_POWER 80
     74#define ERF_PROV_CLK_SOURCE 384
     75#define ERF_PROV_CLK_STATE 385
     76#define ERF_PROV_CLK_THRESHOLD 386
     77#define ERF_PROV_CLK_CORRECTION 387
     78#define ERF_PROV_CLK_FAILURES 388
     79#define ERF_PROV_CLK_RESYNCS 389
     80#define ERF_PROV_CLK_PHASE_ERROR 390
     81#define ERF_PROV_CLK_INPUT_PULSES 391
     82#define ERF_PROV_CLK_REJECTED_PULSES 392
     83#define ERF_PROV_CLK_PHC_INDEX 393
     84#define ERF_PROV_CLK_PHC_OFFSET 394
     85#define ERF_PROV_CLK_TIMEBASE 395
     86#define ERF_PROV_CLK_DESCR 396
     87#define ERF_PROV_CLK_OUT_SOURCE 397
     88#define ERF_PROV_CLK_LINK_MODE 398
     89#define ERF_PROV_PTP_DOMAIN_NUM 399
     90#define ERF_PROV_PTP_STEPS_REMOVED 400
     91#define ERF_PROV_CLK_PORT_PROTO 414
     92
    3193/** @file
    3294 *
     
    55117int erf_is_color_type(uint8_t erf_type);
    56118
     119void *erf_get_meta_data(libtrace_packet_t *packet, uint32_t section_type,
     120        uint16_t section);
     121
    57122#endif
  • lib/format_etsilive.c

    rccabd47 r977e0db  
    686686        NULL,                           /* get_timespec */
    687687        NULL,                           /* get_seconds */
     688        NULL,                           /* get_meta_data */
    688689        NULL,                           /* seek_erf */
    689690        NULL,                           /* seek_timeval */
  • lib/format_legacy.c

    r2193905 r977e0db  
    536536        NULL,                           /* get_timespec */
    537537        NULL,                           /* get_seconds */
     538        NULL,                           /* get_meta_data */
    538539        NULL,                           /* seek_erf */
    539540        NULL,                           /* seek_timeval */
     
    581582        NULL,                           /* get_timespec */
    582583        NULL,                           /* get_seconds */
     584        NULL,                           /* get_meta_data */
    583585        NULL,                           /* seek_erf */
    584586        NULL,                           /* seek_timeval */
     
    626628        NULL,                           /* get_timespec */
    627629        NULL,                           /* get_seconds */
     630        NULL,                           /* get_meta_data */
    628631        NULL,                           /* seek_erf */
    629632        NULL,                           /* seek_timeval */
     
    671674        NULL,                           /* get_timespec */
    672675        NULL,                           /* get_seconds */
     676        NULL,                           /* get_meta_data */
    673677        NULL,                           /* seek_erf */
    674678        NULL,                           /* seek_timeval */
  • lib/format_linux_int.c

    r9a6bdbc r977e0db  
    519519        linuxnative_get_timespec,       /* get_timespec */
    520520        NULL,                           /* get_seconds */
     521        NULL,                           /* get_meta_data */
    521522        NULL,                           /* seek_erf */
    522523        NULL,                           /* seek_timeval */
     
    580581        linuxnative_get_timespec,       /* get_timespec */
    581582        NULL,                           /* get_seconds */
     583        NULL,                           /* get_meta_data */
    582584        NULL,                           /* seek_erf */
    583585        NULL,                           /* seek_timeval */
  • lib/format_linux_ring.c

    r9a6bdbc r977e0db  
    840840        linuxring_get_timespec,         /* get_timespec */
    841841        NULL,                           /* get_seconds */
     842        NULL,                           /* get_meta_data */
    842843        NULL,                           /* seek_erf */
    843844        NULL,                           /* seek_timeval */
     
    903904        linuxring_get_timespec,         /* get_timespec */
    904905        NULL,                           /* get_seconds */
     906        NULL,                           /* get_meta_data */
    905907        NULL,                           /* seek_erf */
    906908        NULL,                           /* seek_timeval */
  • lib/format_ndag.c

    r509ee47 r977e0db  
    15231523        NULL,                   /* get_seconds */
    15241524        NULL,                   /* get_timespec */
     1525        NULL,                   /* get_meta_data */
    15251526        NULL,                   /* seek_erf */
    15261527        NULL,                   /* seek_timeval */
  • lib/format_pcap.c

    r9a6bdbc r977e0db  
    869869        NULL,                           /* get_seconds */
    870870        NULL,                           /* get_timespec */
     871        NULL,                           /* get_meta_data */
    871872        NULL,                           /* seek_erf */
    872873        NULL,                           /* seek_timeval */
     
    914915        NULL,                           /* get_seconds */
    915916        NULL,                           /* get_timespec */
     917        NULL,                           /* get_meta_data */
    916918        NULL,                           /* seek_erf */
    917919        NULL,                           /* seek_timeval */
  • lib/format_pcapfile.c

    r9a6bdbc r977e0db  
    791791        pcapfile_get_timespec,          /* get_timespec */
    792792        NULL,                           /* get_seconds */
     793        NULL,                           /* get_meta_data */
    793794        NULL,                           /* seek_erf */
    794795        NULL,                           /* seek_timeval */
  • lib/format_pcapng.c

    rf47025d r977e0db  
    2929#include "libtrace_int.h"
    3030#include "format_helper.h"
     31#include "format_pcapng.h"
    3132
    3233#include <sys/stat.h>
     
    3839#include <stdbool.h>
    3940#include <math.h>
    40 
    41 #define PCAPNG_SECTION_TYPE 0x0A0D0D0A
    42 #define PCAPNG_INTERFACE_TYPE 0x00000001
    43 #define PCAPNG_OLD_PACKET_TYPE 0x00000002
    44 #define PCAPNG_SIMPLE_PACKET_TYPE 0x00000003
    45 #define PCAPNG_NAME_RESOLUTION_TYPE 0x00000004
    46 #define PCAPNG_INTERFACE_STATS_TYPE 0x00000005
    47 #define PCAPNG_ENHANCED_PACKET_TYPE 0x00000006
    48 #define PCAPNG_CUSTOM_TYPE 0x00000BAD
    49 #define PCAPNG_CUSTOM_NONCOPY_TYPE 0x40000BAD
    50 #define PCAPNG_DECRYPTION_SECRETS_TYPE 0x0000000A
    51 
    52 #define PCAPNG_NRB_RECORD_END 0x0000
    53 #define PCAPNG_NRB_RECORD_IP4 0x0001
    54 #define PCAPNG_NRB_RECORD_IP6 0x0002
    55 
    56 #define PCAPNG_CUSTOM_OPTION_UTF8 0xBAC
    57 #define PCAPNG_CUSTOM_OPTION_BIN 0xBAD
    58 #define PCAPNG_CUSTOM_OPTION_UTF8_NONCOPY 0x4BAC
    59 #define PCAPNG_CUSTOM_OPTION_BIN_NONCOPY 0x4BAD
    60 
    61 #define PCAPNG_OPTION_END 0x0000
    62 
    63 #define PACKET_IS_ENHANCED (pcapng_get_record_type(packet) == PCAPNG_ENHANCED_PACKET_TYPE)
    64 
    65 #define PACKET_IS_SIMPLE (pcapng_get_record_type(packet) == PCAPNG_SIMPLE_PACKET_TYPE)
    66 
    67 #define PACKET_IS_OLD (pcapng_get_record_type(packet) == PCAPNG_OLD_PACKET_TYPE)
    68 
    69 #define PCAPNG_IFOPT_TSRESOL 9
    70 
    71 #define PCAPNG_PKTOPT_DROPCOUNT 4
    72 
    73 #define PCAPNG_STATOPT_START 2
    74 #define PCAPNG_STATOPT_END 3
    75 #define PCAPNG_STATOPT_IFRECV 4
    76 #define PCAPNG_STATOPT_IFDROP 5
    77 #define PCAPNG_STATOPT_FILTERACCEPT 6
    78 #define PCAPNG_STATOPT_OSDROP 7
    79 #define PCAPNG_STATOPT_USRDELIV 8
    8041
    8142typedef struct pcagng_section_header_t {
     
    21302091
    21312092
     2093}
     2094
     2095void *pcapng_get_meta_data(libtrace_packet_t *packet, uint32_t section_type,
     2096        uint16_t section) {
     2097
     2098        struct pcapng_peeker *hdr;
     2099        void *ptr;
     2100        uint32_t blocktype;
     2101        uint16_t optcode;
     2102
     2103        hdr = (struct pcapng_peeker *)packet->header;
     2104        ptr = packet->header;
     2105
     2106        if (DATA(packet->trace)->byteswapped) {
     2107                blocktype = byteswap32(hdr->blocktype);
     2108        } else {
     2109                blocktype = hdr->blocktype;
     2110        }
     2111
     2112        /* Just return if data we want is not in this block */
     2113        if (blocktype != section_type) {
     2114                return NULL;
     2115        }
     2116
     2117        /* Skip x bytes to the options depending on what kind of packet this is */
     2118        if (section_type == PCAPNG_SECTION_TYPE) { ptr += sizeof(pcapng_sec_t); }
     2119        if (section_type == PCAPNG_INTERFACE_TYPE) { ptr += sizeof(pcapng_int_t); }
     2120        if (section_type == PCAPNG_OLD_PACKET_TYPE) { ptr += sizeof(pcapng_opkt_t); }
     2121        if (section_type == PCAPNG_SIMPLE_PACKET_TYPE) { ptr += sizeof(pcapng_spkt_t); }
     2122        if (section_type == PCAPNG_NAME_RESOLUTION_TYPE) {
     2123                /* look into this more */
     2124                return NULL;
     2125        }
     2126        if (section_type == PCAPNG_INTERFACE_STATS_TYPE) { ptr += sizeof(pcapng_stats_t); }
     2127        if (section_type == PCAPNG_ENHANCED_PACKET_TYPE) { ptr += sizeof(pcapng_epkt_t); }
     2128
     2129        /* Skip over the options till a match is found or they run out */
     2130        struct pcapng_optheader *opthdr = ptr;
     2131        if (DATA(packet->trace)->byteswapped) {
     2132                optcode = byteswap16(opthdr->optcode);
     2133        } else {
     2134                optcode = opthdr->optcode;
     2135        }
     2136        while ((optcode != section) && (optcode != PCAPNG_OPTION_END)) {
     2137                uint16_t len;
     2138
     2139                if (DATA(packet->trace)->byteswapped) {
     2140                        len = byteswap16(opthdr->optlen);
     2141                } else {
     2142                        len = opthdr->optlen;
     2143                }
     2144
     2145                /* work out any padding */
     2146                if ((len % 4) != 0) {
     2147                        ptr += len + (4 - (len % 4)) + sizeof(struct pcapng_optheader);
     2148                } else {
     2149                        ptr += len + sizeof(struct pcapng_optheader);
     2150                }
     2151
     2152                /* get the next option */
     2153                opthdr = (struct pcapng_optheader *)ptr;
     2154                if (DATA(packet->trace)->byteswapped) {
     2155                        optcode = byteswap16(opthdr->optcode);
     2156                } else {
     2157                        optcode = opthdr->optcode;
     2158                }
     2159        }
     2160
     2161        /* either a option was found or they ran out */
     2162        if (opthdr->optcode == section) {
     2163                return ptr;
     2164        } else {
     2165                return NULL;
     2166        }
    21322167}
    21332168
     
    21692204        pcapng_get_timespec,            /* get_timespec */
    21702205        NULL,                           /* get_seconds */
     2206        pcapng_get_meta_data,           /* get_meta_data */
    21712207        NULL,                           /* seek_erf */
    21722208        NULL,                           /* seek_timeval */
  • lib/format_rt.c

    r2193905 r977e0db  
    863863        NULL,                           /* get_timespec */
    864864        NULL,                           /* get_seconds */
     865        NULL,                           /* get_meta_data */
    865866        NULL,                           /* seek_erf */
    866867        NULL,                           /* seek_timeval */
  • lib/format_tsh.c

    r2193905 r977e0db  
    252252        NULL,                           /* get_timespec */
    253253        NULL,                           /* get_seconds */
     254        NULL,                           /* get_meta_data */
    254255        NULL,                           /* seek_erf */
    255256        NULL,                           /* seek_timeval */
     
    302303        NULL,                           /* get_timespec */
    303304        NULL,                           /* get_seconds */
     305        NULL,                           /* get_meta_data */
    304306        NULL,                           /* seek_erf */
    305307        NULL,                           /* seek_timeval */
  • lib/libtrace.h.in

    r3c828b8 r977e0db  
    581581} libtrace_ethertype_t;
    582582
     583typedef struct libtrace_meta_result {
     584        uint16_t type;
     585        uint16_t len;
     586} libtrace_meta_result_t;
     587
     588typedef struct libtrace_meta {
     589        char *interface_name;           /**< Interface name packet was captured on */
     590        char *interface_mac;            /**< Interface MAC address packet was captured on */
     591        uint64_t interface_speed;       /**< Interface speed packet was captured on */
     592        uint32_t interface_ipv4;        /**< Interface IP4 address packet was captured on */
     593        char *interface_ipv6;           /**< Interface IP6 address packet was captured on */
     594        char *interface_description;    /**< Interface description */
     595} libtrace_meta_t;
     596
    583597typedef struct libtrace_packet_cache {
    584598        int capture_length;             /**< Cached capture length */
     
    618632        int which_trace_start;          /**< Used to match packet to a started instance of the parent trace */
    619633
     634        libtrace_meta_t meta;           /**< Meta data for the packet */
    620635} libtrace_packet_t;
    621636
     
    36983713} /* extern "C" */
    36993714#endif /* #ifdef __cplusplus */
     3715
     3716char *trace_get_interface_name(libtrace_packet_t *packet);
     3717char *trace_get_interface_mac(libtrace_packet_t *packet);
     3718uint64_t trace_get_interface_speed(libtrace_packet_t *packet);
     3719uint32_t trace_get_interface_ip4(libtrace_packet_t *packet);
     3720uint32_t trace_get_interface_ipv4(libtrace_packet_t *packet);
     3721char *trace_get_interface_ip6(libtrace_packet_t *packet);
     3722char *trace_get_interface_ipv6(libtrace_packet_t *packet);
     3723char *trace_get_interface_description(libtrace_packet_t *packet);
     3724libtrace_meta_result_t *trace_get_interface_num(libtrace_packet_t *packet);
     3725libtrace_meta_result_t *trace_get_host_os(libtrace_packet_t *packet);
     3726libtrace_meta_result_t *trace_get_tzone(libtrace_packet_t *packet);
     3727libtrace_meta_result_t *trace_get_app_name(libtrace_packet_t *packet);
     3728
    37003729#endif /* LIBTRACE_H_ */
  • lib/libtrace_int.h

    r62b2d97 r977e0db  
    723723        double (*get_seconds)(const libtrace_packet_t *packet);
    724724       
     725        /**
     726         */
     727        void *(*get_meta_data)(libtrace_packet_t *packet, uint32_t section_type,
     728                uint16_t section);
     729
    725730        /** Moves the read pointer to a certain ERF timestamp within an input
    726731         * trace file.
     
    12011206DLLEXPORT void *trace_get_payload_from_atm(void *link, uint8_t *type,
    12021207                uint32_t *remaining);
    1203 
    12041208
    12051209#ifdef HAVE_BPF
  • lib/trace.c

    r9a6bdbc r977e0db  
    947947                                 * if this packet is ever reused
    948948                                 */
     949        /* free meta fields */
     950        if (packet->meta.interface_name != NULL)
     951                free(packet->meta.interface_name);
     952        if (packet->meta.interface_mac != NULL)
     953                free(packet->meta.interface_mac);
     954        if (packet->meta.interface_ipv6 != NULL)
     955                free(packet->meta.interface_ipv6);
     956        if (packet->meta.interface_description != NULL)
     957                free(packet->meta.interface_description);
     958
    949959        free(packet);
    950960}
Note: See TracChangeset for help on using the changeset viewer.