Changeset 91b72d3 for lib/format_erf.c


Ignore:
Timestamp:
01/05/09 11:29:11 (13 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:
ad36006
Parents:
9d0049cf
Message:

Try to autoguess the tracetype if the format uri specify is not present

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_erf.c

    rc66068d r91b72d3  
    6565#define DATAOUT(x) ((struct erf_format_data_out_t *)x->format_data)
    6666
    67 #define INPUT DATA(libtrace)->input
    6867#define IN_OPTIONS DATA(libtrace)->options
    6968#define OUTPUT DATAOUT(libtrace)->output
     
    7170struct erf_format_data_t {
    7271       
    73         union {
    74                 int fd;
    75                 io_t *file;
    76         } input;
    77 
    78        
    7972        struct {
    8073                enum { INDEX_UNKNOWN=0, INDEX_NONE, INDEX_EXISTS } exists;
     
    145138}
    146139
     140static int erf_probe_magic(io_t *io)
     141{
     142        char buffer[4096];
     143        int len;
     144        dag_record_t *erf;
     145        len = wandio_peek(io, buffer, sizeof(buffer));
     146        if (len < dag_record_size) {
     147                return 0; /* False */
     148        }
     149        erf = (dag_record_t *) buffer;
     150        /* If the record is too short */
     151        if (ntohs(erf->rlen) < dag_record_size) {
     152                return 0;
     153        }
     154        /* There aren't any erf traces before 1995-01-01 */
     155        if (bswap_le_to_host64(erf->ts) < 0x2f0539b000000000ULL) {
     156                return 0;
     157        }
     158        /* And not pcap! */
     159        if (bswap_le_to_host64(erf->ts) >>32 == 0xa1b2c3d4) {
     160                return 0;
     161        }
     162        /* And not the other pcap! */
     163        if (bswap_le_to_host64(erf->ts) >>32 == 0xd4c3b2a1) {
     164                return 0;
     165        }
     166        /* Is this a proper typed packet */
     167        if (erf->type > TYPE_AAL2) {
     168                return 0;
     169        }
     170        /* We should put some more tests in here. */
     171        /* Yeah, this is probably ERF */
     172        return 1;
     173}
    147174
    148175static int erf_init_input(libtrace_t *libtrace)
     
    150177        libtrace->format_data = malloc(sizeof(struct erf_format_data_t));
    151178       
    152         INPUT.file = 0;
    153179        IN_OPTIONS.real_time = 0;
    154180        DATA(libtrace)->drops = 0;
     
    181207static int erf_start_input(libtrace_t *libtrace)
    182208{
    183         if (INPUT.file)
    184                 return 0; /* success */
    185 
    186         INPUT.file = trace_open_file(libtrace);
    187 
    188         if (!INPUT.file)
     209        if (libtrace->io)
     210                return 0; /* Success -- already done. */
     211
     212        libtrace->io = trace_open_file(libtrace);
     213
     214        if (!libtrace->io)
    189215                return -1;
    190216
     
    233259
    234260        /* We've found our location in the trace, now use it. */
    235         wandio_seek(INPUT.file,(int64_t) record.offset,SEEK_SET);
     261        wandio_seek(libtrace->io,(int64_t) record.offset,SEEK_SET);
    236262
    237263        return 0; /* success */
     
    243269static int erf_slow_seek_start(libtrace_t *libtrace,uint64_t erfts UNUSED)
    244270{
    245         if (INPUT.file) {
    246                 wandio_destroy(INPUT.file);
    247         }
    248         INPUT.file = trace_open_file(libtrace);
    249         if (!INPUT.file)
     271        if (libtrace->io) {
     272                wandio_destroy(libtrace->io);
     273        }
     274        libtrace->io = trace_open_file(libtrace);
     275        if (!libtrace->io)
    250276                return -1;
    251277        return 0;
     
    291317                if (trace_get_erf_timestamp(packet)==erfts)
    292318                        break;
    293                 off=wandio_tell(INPUT.file);
     319                off=wandio_tell(libtrace->io);
    294320        } while(trace_get_erf_timestamp(packet)<erfts);
    295321
    296         wandio_seek(INPUT.file,off,SEEK_SET);
     322        wandio_seek(libtrace->io,off,SEEK_SET);
    297323
    298324        return 0;
     
    330356
    331357static int erf_fin_input(libtrace_t *libtrace) {
    332         if (INPUT.file)
    333                 wandio_destroy(INPUT.file);
     358        if (libtrace->io)
     359                wandio_destroy(libtrace->io);
    334360        free(libtrace->format_data);
    335361        return 0;
     
    409435        flags |= TRACE_PREP_OWN_BUFFER;
    410436       
    411         if ((numbytes=wandio_read(INPUT.file,
     437        if ((numbytes=wandio_read(libtrace->io,
    412438                                        packet->buffer,
    413439                                        (size_t)dag_record_size)) == -1) {
     
    437463       
    438464        /* read in the rest of the packet */
    439         if ((numbytes=wandio_read(INPUT.file,
     465        if ((numbytes=wandio_read(libtrace->io,
    440466                                        buffer2,
    441467                                        (size_t)size)) != (int)size) {
     
    714740        "$Id$",
    715741        TRACE_FORMAT_ERF,
     742        NULL,                           /* probe filename */
     743        erf_probe_magic,                /* probe magic */
    716744        erf_init_input,                 /* init_input */       
    717745        erf_config_input,               /* config_input */
Note: See TracChangeset for help on using the changeset viewer.