Changeset 1aa4bf7 for lib


Ignore:
Timestamp:
04/03/09 14:22:52 (12 years ago)
Author:
Perry Lorier <perry@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
327b1df
Parents:
af0918a
Message:

Support using timespec's for dealing with traces

Location:
lib
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • lib/format_atmhdr.c

    r91b72d3 r1aa4bf7  
    143143        atmhdr_get_erf_timestamp,       /* get_erf_timestamp */
    144144        NULL,                           /* get_timeval */
     145        NULL,                           /* get_timespec */
    145146        NULL,                           /* get_seconds */
    146147        NULL,                           /* seek_erf */
  • lib/format_bpf.c

    red3820e r1aa4bf7  
    459459        NULL,                   /* get_erf_timestamp */
    460460        bpf_get_timeval,        /* get_timeval */
     461        NULL,                   /* get_timespec */
    461462        NULL,                   /* get_seconds */
    462463        NULL,                   /* seek_erf */
  • lib/format_dag24.c

    r91b72d3 r1aa4bf7  
    442442        erf_get_erf_timestamp,          /* get_erf_timestamp */
    443443        NULL,                           /* get_timeval */
     444        NULL,                           /* get_timespec */
    444445        NULL,                           /* get_seconds */
    445446        NULL,                           /* seek_erf */
  • lib/format_dag25.c

    r5865c72 r1aa4bf7  
    973973        NULL,                           /* get_timeval */
    974974        NULL,                           /* get_seconds */
     975        NULL,                           /* get_timespec */
    975976        NULL,                           /* seek_erf */
    976977        NULL,                           /* seek_timeval */
  • lib/format_duck.c

    r91b72d3 r1aa4bf7  
    321321        NULL,                           /* get_erf_timestamp */
    322322        NULL,                           /* get_timeval */
     323        NULL,                           /* get_timespec */
    323324        NULL,                           /* get_seconds */
    324325        NULL,                           /* seek_erf */
  • lib/format_erf.c

    r91b72d3 r1aa4bf7  
    760760        erf_get_erf_timestamp,          /* get_erf_timestamp */
    761761        NULL,                           /* get_timeval */
     762        NULL,                           /* get_timespec */
    762763        NULL,                           /* get_seconds */
    763764        erf_seek_erf,                   /* seek_erf */
  • lib/format_legacy.c

    r91b72d3 r1aa4bf7  
    110110        char *tz;
    111111        time_t ret;
    112         static char envbuf[256];
    113112
    114113        if(sscanf(s, "%4u%2u%2u-%2u%2u%2u", &tm.tm_year, &tm.tm_mon,
     
    480479        legacy_get_erf_timestamp,       /* get_erf_timestamp */
    481480        NULL,                           /* get_timeval */
     481        NULL,                           /* get_timespec */
    482482        NULL,                           /* get_seconds */
    483483        NULL,                           /* seek_erf */
     
    522522        legacy_get_erf_timestamp,       /* get_erf_timestamp */
    523523        NULL,                           /* get_timeval */
     524        NULL,                           /* get_timespec */
    524525        NULL,                           /* get_seconds */
    525526        NULL,                           /* seek_erf */
     
    564565        legacy_get_erf_timestamp,       /* get_erf_timestamp */
    565566        NULL,                           /* get_timeval */
     567        NULL,                           /* get_timespec */
    566568        NULL,                           /* get_seconds */
    567569        NULL,                           /* seek_erf */
     
    606608        NULL,                           /* get_erf_timestamp */
    607609        legacynzix_get_timeval,         /* get_timeval */
     610        NULL,                           /* get_timespec */
    608611        NULL,                           /* get_seconds */
    609612        NULL,                           /* seek_erf */
  • lib/format_linux.c

    r013de36e r1aa4bf7  
    6464};
    6565
     66typedef enum { TS_NONE, TS_TIMEVAL, TS_TIMESPEC } timestamptype_t;
     67
    6668struct libtrace_format_data_t {
    6769        int fd;
    6870        int snaplen;
    6971        int promisc;
     72        timestamptype_t timestamptype;
    7073        libtrace_filter_t *filter;
    7174        struct tpacket_stats stats;
     
    7376};
    7477
     78
    7579struct libtrace_linuxnative_header {
    76         struct timeval ts;
     80        struct timeval tv;
     81        struct timespec ts;
     82        timestamptype_t timestamptype;
    7783        int wirelen;
    7884        int caplen;
     
    8995static int linuxnative_probe_filename(const char *filename)
    9096{
    91         int sock;
    92 
    9397        /* Is this an interface? */
    9498        return (if_nametoindex(filename) != 0);
     
    177181                }
    178182        }
    179 
     183#ifdef SO_TIMESTAMPNS
     184        if (setsockopt(FORMAT(libtrace->format_data)->fd,
     185                        SOL_SOCKET,
     186                        SO_TIMESTAMPNS,
     187                        &one,
     188                        (socklen_t)sizeof(one))!=-1) {
     189                FORMAT(libtrace->format_data)->timestamptype = TS_TIMESPEC;
     190        }
     191        else
     192        /* DANGER: This is a dangling else to only do the next setsockopt() if we fail the first! */
     193#endif
    180194        if (setsockopt(FORMAT(libtrace->format_data)->fd,
    181195                        SOL_SOCKET,
    182196                        SO_TIMESTAMP,
    183197                        &one,
    184                         (socklen_t)sizeof(one))==-1) {
    185                 perror("setsockopt(SO_TIMESTAMP)");
    186         }
     198                        (socklen_t)sizeof(one))!=-1) {
     199                FORMAT(libtrace->format_data)->timestamptype = TS_TIMEVAL;
     200        }
     201        else
     202                FORMAT(libtrace->format_data)->timestamptype = TS_NONE;
    187203
    188204        /* Push BPF filter into the kernel. At this stage we can safely assume
     
    436452                        && cmsg->cmsg_type == SO_TIMESTAMP
    437453                        && cmsg->cmsg_len <= CMSG_LEN(sizeof(struct timeval))) {
     454                        memcpy(&hdr->tv, CMSG_DATA(cmsg),
     455                                        sizeof(struct timeval));
     456                        hdr->timestamptype = TS_TIMEVAL;
     457                        break;
     458                }
     459#ifdef SO_TIMESTAMPNS
     460                else if (cmsg->cmsg_level == SOL_SOCKET
     461                        && cmsg->cmsg_type == SO_TIMESTAMPNS
     462                        && cmsg->cmsg_len <= CMSG_LEN(sizeof(struct timespec))) {
    438463                        memcpy(&hdr->ts, CMSG_DATA(cmsg),
    439464                                        sizeof(struct timeval));
     465                        hdr->timestamptype = TS_TIMESPEC;
    440466                        break;
    441467                }
    442         }
    443 
    444         if (cmsg == NULL && ioctl(FORMAT(libtrace->format_data)->fd,
    445                                 SIOCGSTAMP,&hdr->ts)==-1)
    446                 perror("ioctl(SIOCGSTAMP)");
     468#endif
     469        }
     470
     471        /* Did we not get given a timestamp? */
     472        if (cmsg == NULL) {
     473                if (ioctl(FORMAT(libtrace->format_data)->fd,
     474                                  SIOCGSTAMP,&hdr->tv)==0) {
     475                        hdr->timestamptype = TS_TIMEVAL;
     476                }
     477                else {
     478                        hdr->timestamptype = TS_NONE;
     479                }
     480        }
    447481
    448482        if (linuxnative_prepare_packet(libtrace, packet, packet->buffer,
     
    521555}
    522556
     557static struct timespec linuxnative_get_timespec(const libtrace_packet_t *packet)
     558{
     559        struct libtrace_linuxnative_header *hdr =
     560                (struct libtrace_linuxnative_header*) packet->buffer;
     561        /* We have to upconvert from timeval to timespec */
     562        if (hdr->timestamptype == TS_TIMEVAL) {
     563                struct timespec ts;
     564                ts.tv_sec = hdr->tv.tv_sec;
     565                ts.tv_nsec = hdr->tv.tv_usec*1000;
     566                return ts;
     567        }
     568        else
     569                return hdr->ts;
     570}
     571
    523572static struct timeval linuxnative_get_timeval(const libtrace_packet_t *packet)
    524573{
    525         return ((struct libtrace_linuxnative_header*)(packet->buffer))->ts;
     574        struct libtrace_linuxnative_header *hdr =
     575                (struct libtrace_linuxnative_header*) packet->buffer;
     576        /* We have to downconvert from timespec to timeval */
     577        if (hdr->timestamptype == TS_TIMESPEC) {
     578                struct timeval tv;
     579                tv.tv_sec = hdr->ts.tv_sec;
     580                tv.tv_usec = hdr->ts.tv_nsec/1000;
     581                return tv;
     582        }
     583        else
     584                return hdr->tv;
    526585}
    527586
     
    643702        NULL,                           /* get_erf_timestamp */
    644703        linuxnative_get_timeval,        /* get_timeval */
     704        linuxnative_get_timespec,       /* get_timespec */
    645705        NULL,                           /* get_seconds */
    646706        NULL,                           /* seek_erf */
  • lib/format_pcap.c

    r91b72d3 r1aa4bf7  
    678678        pcap_get_timeval,               /* get_timeval */
    679679        NULL,                           /* get_seconds */
     680        NULL,                           /* get_timespec */
    680681        NULL,                           /* seek_erf */
    681682        NULL,                           /* seek_timeval */
     
    720721        pcap_get_timeval,               /* get_timeval */
    721722        NULL,                           /* get_seconds */
     723        NULL,                           /* get_timespec */
    722724        NULL,                           /* seek_erf */
    723725        NULL,                           /* seek_timeval */
  • lib/format_pcapfile.c

    r91b72d3 r1aa4bf7  
    612612        NULL,                           /* get_erf_timestamp */
    613613        pcapfile_get_timeval,           /* get_timeval */
     614        NULL,                           /* get_timespec */
    614615        NULL,                           /* get_seconds */
    615616        NULL,                           /* seek_erf */
  • lib/format_rt.c

    r91b72d3 r1aa4bf7  
    732732        NULL,                           /* get_erf_timestamp */
    733733        NULL,                           /* get_timeval */
     734        NULL,                           /* get_timespec */
    734735        NULL,                           /* get_seconds */
    735736        NULL,                           /* seek_erf */
  • lib/format_tsh.c

    r91b72d3 r1aa4bf7  
    236236        NULL,                           /* get_erf_timestamp */
    237237        tsh_get_timeval,                /* get_timeval */
     238        NULL,                           /* get_timespec */
    238239        NULL,                           /* get_seconds */
    239240        NULL,                           /* seek_erf */
     
    283284        NULL,                           /* get_erf_timestamp */
    284285        tsh_get_timeval,                /* get_timeval */
     286        NULL,                           /* get_timespec */
    285287        NULL,                           /* get_seconds */
    286288        NULL,                           /* seek_erf */
  • lib/libtrace.h.in

    raf0918a r1aa4bf7  
    15571557struct timeval trace_get_timeval(const libtrace_packet_t *packet);
    15581558
     1559/** Get the current time in struct timespec
     1560 * @param packet        the packet opaque pointer
     1561 *
     1562 * @return time that this packet was seen in a struct timespec
     1563 */
     1564DLLEXPORT SIMPLE_FUNCTION
     1565struct timespec trace_get_timespec(const libtrace_packet_t *packet);
     1566
    15591567/** Get the current time in floating point seconds
    15601568 * @param packet        the packet opaque pointer
  • lib/libtrace_int.h

    r91b72d3 r1aa4bf7  
    341341         */
    342342        struct timeval (*get_timeval)(const libtrace_packet_t *packet);
     343        /** return the timespec of this packet.
     344         * @return the timespec
     345         * This field may be NULL in the structure, and libtrace will
     346         * synthesise the result from get_erf_timestamp or get_seconds if they
     347         * exist.  AT least one of get_erf_timestamp, get_timeval or
     348         * get_seconds must be implemented.
     349         */
     350        struct timespec (*get_timespec)(const libtrace_packet_t *packet);
    343351        /** return the timestamp of this packet.
    344352         * @return the floating point seconds since 1970-01-01 00:00:00
  • lib/trace.c

    r91b72d3 r1aa4bf7  
    902902 */
    903903DLLEXPORT uint64_t trace_get_erf_timestamp(const libtrace_packet_t *packet) {
    904         uint64_t timestamp = 0;
    905         double seconds = 0.0;
    906         struct timeval ts;
    907 
    908904        if (packet->trace->format->get_erf_timestamp) {
    909905                /* timestamp -> timestamp */
    910                 timestamp = packet->trace->format->get_erf_timestamp(packet);
     906                return packet->trace->format->get_erf_timestamp(packet);
     907        } else if (packet->trace->format->get_timespec) {
     908                /* timespec -> timestamp */
     909                struct timespec ts;
     910                ts = packet->trace->format->get_timespec(packet);
     911                return ((((uint64_t)ts.tv_sec) << 32) +
     912                                (((uint64_t)ts.tv_nsec << 32)/1000000000));
    911913        } else if (packet->trace->format->get_timeval) {
    912914                /* timeval -> timestamp */
    913                 ts = packet->trace->format->get_timeval(packet);
    914                 timestamp = ((((uint64_t)ts.tv_sec) << 32) +
    915                                 (((uint64_t)ts.tv_usec << 32)/1000000));
     915                struct timeval tv;
     916                tv = packet->trace->format->get_timeval(packet);
     917                return ((((uint64_t)tv.tv_sec) << 32) +
     918                                (((uint64_t)tv.tv_usec << 32)/1000000));
    916919        } else if (packet->trace->format->get_seconds) {
    917920                /* seconds -> timestamp */
    918                 seconds = packet->trace->format->get_seconds(packet);
    919                 timestamp = (((uint64_t)seconds)<<32)
     921                double seconds = packet->trace->format->get_seconds(packet);
     922                return (((uint64_t)seconds)<<32)
    920923                          + (uint64_t)((seconds-(uint64_t)seconds)*UINT_MAX);
     924        }
     925        else {
     926                return (uint64_t)0;
     927        }
    921928                     
    922         }
    923         return timestamp;
    924929}
    925930
     
    934939        struct timeval tv;
    935940        uint64_t ts = 0;
    936         double seconds = 0.0;
    937941        if (packet->trace->format->get_timeval) {
    938942                /* timeval -> timeval */
     
    953957                        tv.tv_sec += 1;
    954958                }
     959        } else if (packet->trace->format->get_timespec) {
     960                struct timespec ts = packet->trace->format->get_timespec(packet);
     961                tv.tv_sec = ts.tv_sec;
     962                tv.tv_usec = ts.tv_nsec/1000;
    955963        } else if (packet->trace->format->get_seconds) {
    956964                /* seconds -> timeval */
    957                 seconds = packet->trace->format->get_seconds(packet);
     965                double seconds = packet->trace->format->get_seconds(packet);
    958966                tv.tv_sec = (uint32_t)seconds;
    959967                tv.tv_usec = (uint32_t)(((seconds - tv.tv_sec) * 1000000)/UINT_MAX);
     
    966974        return tv;
    967975}
     976
     977DLLEXPORT struct timespec trace_get_timespec(const libtrace_packet_t *packet) {
     978        struct timespec ts;
     979
     980        if (packet->trace->format->get_timespec) {
     981                return packet->trace->format->get_timespec(packet);
     982        } else if (packet->trace->format->get_erf_timestamp) {
     983                /* timestamp -> timeval */
     984                uint64_t erfts = packet->trace->format->get_erf_timestamp(packet);
     985#if __BYTE_ORDER == __BIG_ENDIAN
     986                ts.tv_sec = erfts & 0xFFFFFFFF;
     987#elif __BYTE_ORDER == __LITTLE_ENDIAN
     988                ts.tv_sec = erfts >> 32;
     989#else
     990#error "What on earth are you running this on?"
     991#endif
     992                ts.tv_nsec = ((erfts&0xFFFFFFFF)*1000000000)>>32;
     993                if (ts.tv_nsec >= 1000000000) {
     994                        ts.tv_nsec -= 1000000000;
     995                        ts.tv_sec += 1;
     996                }
     997                return ts;
     998        } else if (packet->trace->format->get_timeval) {
     999                /* timeval -> timespec */
     1000                struct timeval tv = packet->trace->format->get_timeval(packet);
     1001                ts.tv_sec = tv.tv_sec;
     1002                ts.tv_nsec = tv.tv_usec*1000;
     1003                return ts;
     1004        } else if (packet->trace->format->get_seconds) {
     1005                /* seconds -> timespec */
     1006                double seconds = packet->trace->format->get_seconds(packet);
     1007                ts.tv_sec = (uint32_t)seconds;
     1008                ts.tv_nsec = (long)(((seconds - ts.tv_sec) * 1000000000)/UINT_MAX);
     1009                return ts;
     1010        }
     1011        else {
     1012                ts.tv_sec=-1;
     1013                ts.tv_nsec=-1;
     1014                return ts;
     1015        }
     1016}
     1017
    9681018
    9691019/* Get the current time in floating point seconds
     
    9741024DLLEXPORT double trace_get_seconds(const libtrace_packet_t *packet) {
    9751025        double seconds = 0.0;
    976         uint64_t ts = 0;
    977         struct timeval tv;
    9781026
    9791027        if (packet->trace->format->get_seconds) {
     
    9821030        } else if (packet->trace->format->get_erf_timestamp) {
    9831031                /* timestamp -> seconds */
     1032                uint64_t ts = 0;
    9841033                ts = packet->trace->format->get_erf_timestamp(packet);
    9851034                seconds =  (ts>>32) + ((ts & UINT_MAX)*1.0 / UINT_MAX);
     1035        } else if (packet->trace->format->get_timespec) {
     1036                /* timespec -> seconds */
     1037                struct timespec ts;
     1038                ts = packet->trace->format->get_timespec(packet);
     1039                seconds = ts.tv_sec + ((ts.tv_nsec * 1.0) / 1000000000);
    9861040        } else if (packet->trace->format->get_timeval) {
    9871041                /* timeval -> seconds */
     1042                struct timeval tv;
    9881043                tv = packet->trace->format->get_timeval(packet);
    9891044                seconds = tv.tv_sec + ((tv.tv_usec * 1.0) / 1000000);
Note: See TracChangeset for help on using the changeset viewer.