source: lib/format_erf.c @ dfc2673

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since dfc2673 was dfc2673, checked in by Shane Alcock <salcock@…>, 16 years ago

Fixed Makefile.ams to actually use the included DAG directory from --with-dag

  • Property mode set to 100644
File size: 20.8 KB
Line 
1/*
2 * This file is part of libtrace
3 *
4 * Copyright (c) 2004 The University of Waikato, Hamilton, New Zealand.
5 * Authors: Daniel Lawson
6 *          Perry Lorier
7 *         
8 * All rights reserved.
9 *
10 * This code has been developed by the University of Waikato WAND
11 * research group. For further information please see http://www.wand.net.nz/
12 *
13 * libtrace is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * libtrace is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with libtrace; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 *
27 * $Id$
28 *
29 */
30
31#include "config.h"
32#include "libtrace.h"
33#include "libtrace_int.h"
34#include "format_helper.h"
35#include "parse_cmd.h"
36
37#ifdef HAVE_INTTYPES_H
38#  include <inttypes.h>
39#else
40#  error "Can't find inttypes.h - this needs to be fixed"
41#endif
42
43#ifdef HAVE_STDDEF_H
44#  include <stddef.h>
45#else
46# error "Can't find stddef.h - do you define ptrdiff_t elsewhere?"
47#endif
48#include <sys/types.h>
49#include <sys/socket.h>
50#include <sys/un.h>
51#include <sys/mman.h>
52#include <sys/stat.h>
53#include <unistd.h>
54#include <assert.h>
55#include <errno.h>
56#include <netdb.h>
57#include <fcntl.h>
58#include <getopt.h>
59#include <stdio.h>
60
61/* Catch undefined O_LARGEFILE on *BSD etc */
62#ifndef O_LARGEFILE
63#  define O_LARGEFILE 0
64#endif
65
66static struct libtrace_format_t *erf_ptr = 0;
67static struct libtrace_format_t *rtclient_ptr = 0;
68#if HAVE_DAG
69static struct libtrace_format_t *dag_ptr = 0;
70#endif
71
72#define CONNINFO libtrace->format_data->conn_info
73#define INPUT libtrace->format_data->input
74#define OUTPUT libtrace->format_data->output
75#if HAVE_DAG
76#define DAG libtrace->format_data->dag
77#endif
78#define OPTIONS libtrace->format_data->options
79struct libtrace_format_data_t {
80        union {
81                struct {
82                        char *hostname;
83                        short port;
84                } rt;
85                char *path;             
86        } conn_info;
87       
88        union {
89                int fd;
90#if HAVE_ZLIB
91                gzFile *file;
92#else   
93                FILE *file;
94#endif
95        } input;
96
97#if HAVE_DAG
98        struct {
99                void *buf; 
100                unsigned bottom;
101                unsigned top;
102                unsigned diff;
103                unsigned curr;
104                unsigned offset;
105        } dag;
106#endif
107};
108
109struct libtrace_format_data_out_t {
110        union {
111                struct {
112                        char *hostname;
113                        short port;
114                } rt;
115                char *path;
116        } conn_info;
117
118        union {
119                struct {
120                        int level;
121                } erf;
122               
123        } options;
124       
125        union {
126                int fd;
127                struct rtserver_t * rtserver;
128#if HAVE_ZLIB
129                gzFile *file;
130#else
131                FILE *file;
132#endif
133        } output;
134};
135
136#ifdef HAVE_DAG
137static int dag_init_input(struct libtrace_t *libtrace) {
138        struct stat buf;
139        libtrace->format_data = (struct libtrace_format_data_t *)
140                malloc(sizeof(struct libtrace_format_data_t));
141
142        CONNINFO.path = libtrace->uridata;
143        if (stat(CONNINFO.path,&buf) == -1) {
144                perror("stat");
145                return 0;
146        } 
147        if (S_ISCHR(buf.st_mode)) {
148                // DEVICE
149                libtrace->sourcetype = DEVICE;
150                if((INPUT.fd = dag_open(CONNINFO.path)) < 0) {
151                        fprintf(stderr,"Cannot open DAG %s: %m\n", 
152                                        CONNINFO.path,errno);
153                        exit(0);
154                }
155                if((DAG.buf = (void *)dag_mmap(INPUT.fd)) == MAP_FAILED) {
156                        fprintf(stderr,"Cannot mmap DAG %s: %m\n", 
157                                        CONNINFO.path,errno);
158                        exit(0);
159                }
160                if(dag_start(INPUT.fd) < 0) {
161                        fprintf(stderr,"Cannot start DAG %s: %m\n", 
162                                        CONNINFO.path,errno);
163                        exit(0);
164                }
165        } else {
166                fprintf(stderr,"%s isn't a valid char device, exiting\n",
167                                CONNINFO.path);
168                return 0;
169        }
170        return 1;
171}
172#endif
173
174static int erf_init_input(struct libtrace_t *libtrace) {
175        struct stat buf;
176        struct hostent *he;
177        struct sockaddr_in remote;
178        struct sockaddr_un unix_sock;
179        libtrace->format_data = (struct libtrace_format_data_t *)
180                malloc(sizeof(struct libtrace_format_data_t));
181
182        CONNINFO.path = libtrace->uridata;
183        if (!strncmp(CONNINFO.path,"-",1)) {
184                // STDIN
185                libtrace->sourcetype = STDIN;
186#if HAVE_ZLIB
187                INPUT.file = gzdopen(STDIN, "r");
188#else   
189                INPUT.file = stdin;
190#endif
191
192        } else {
193                if (stat(CONNINFO.path,&buf) == -1 ) {
194                        perror("stat");
195                        return 0;
196                }
197                if (S_ISSOCK(buf.st_mode)) {
198                        libtrace->sourcetype = SOCKET;
199                        if ((INPUT.fd = socket(
200                                        AF_UNIX, SOCK_STREAM, 0)) == -1) {
201                                perror("socket");
202                                return 0;
203                        }
204                        unix_sock.sun_family = AF_UNIX;
205                        bzero(unix_sock.sun_path,108);
206                        snprintf(unix_sock.sun_path,
207                                        108,"%s"
208                                        ,CONNINFO.path);
209
210                        if (connect(INPUT.fd, 
211                                        (struct sockaddr *)&unix_sock,
212                                        sizeof(struct sockaddr)) == -1) {
213                                perror("connect (unix)");
214                                return 0;
215                        }
216                } else { 
217                        libtrace->sourcetype = TRACE;
218#if HAVE_ZLIB
219                        // using gzdopen means we can set O_LARGEFILE
220                        // ourselves. However, this way is messy and
221                        // we lose any error checking on "open"
222                        INPUT.file = 
223                                gzdopen(open(
224                                        CONNINFO.path,
225                                        O_LARGEFILE), "r");
226#else
227                        INPUT.file = 
228                                fdopen(open(
229                                        CONNINFO.path,
230                                        O_LARGEFILE), "r");
231#endif
232
233                }
234        }
235        return 1;
236}
237
238static int rtclient_init_input(struct libtrace_t *libtrace) {
239        char *scan;
240        char *uridata = libtrace->uridata;
241        struct hostent *he;
242        struct sockaddr_in remote;
243        libtrace->format_data = (struct libtrace_format_data_t *)
244                malloc(sizeof(struct libtrace_format_data_t));
245
246        libtrace->sourcetype = RT;
247
248        if (strlen(uridata) == 0) {
249                CONNINFO.rt.hostname = 
250                        strdup("localhost");
251                CONNINFO.rt.port = 
252                        COLLECTOR_PORT;
253        } else {
254                if ((scan = strchr(uridata,':')) == NULL) {
255                        CONNINFO.rt.hostname = 
256                                strdup(uridata);
257                        CONNINFO.rt.port =
258                                COLLECTOR_PORT;
259                } else {
260                        CONNINFO.rt.hostname = 
261                                (char *)strndup(uridata,
262                                                (scan - uridata));
263                        CONNINFO.rt.port = 
264                                atoi(++scan);
265                }
266        }
267       
268        if ((he=gethostbyname(CONNINFO.rt.hostname)) == NULL) { 
269                perror("gethostbyname");
270                return 0;
271        } 
272        if ((INPUT.fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
273                perror("socket");
274                return 0;
275        }
276
277        remote.sin_family = AF_INET;   
278        remote.sin_port = htons(CONNINFO.rt.port);
279        remote.sin_addr = *((struct in_addr *)he->h_addr);
280        bzero(&(remote.sin_zero), 8);
281
282        if (connect(INPUT.fd, (struct sockaddr *)&remote,
283                                sizeof(struct sockaddr)) == -1) {
284                perror("connect (inet)");
285                return 0;
286        }
287        return 1;
288}
289
290static int erf_init_output(struct libtrace_out_t *libtrace) {
291        char *filemode = 0;
292        int fd;
293        libtrace->format_data = (struct libtrace_format_data_out_t *)
294                calloc(1,sizeof(struct libtrace_format_data_out_t));
295
296        OPTIONS.erf.level = 0;
297        asprintf(&filemode,"wb%d",OPTIONS.erf.level);
298
299        if (!strncmp(libtrace->uridata,"-",1)) {
300                // STDOUT
301#if HAVE_ZLIB
302                OUTPUT.file = gzdopen(dup(1), filemode);
303#else
304                OUTPUT.file = stdout;
305#endif
306        }
307        else {
308                // TRACE
309                fd = open(libtrace->uridata, O_CREAT | O_LARGEFILE | O_WRONLY, S_IRUSR | S_IWUSR);
310                if (fd <= 0) {
311                        return 0;
312                }
313#if HAVE_ZLIB
314                // using gzdopen means we can set O_LARGEFILE
315                // ourselves. However, this way is messy and
316                // we lose any error checking on "open"
317                OUTPUT.file =  gzdopen(fd, filemode);
318#else
319                OUTPUT.file =  fdopen(fd, "w");
320#endif
321                 
322        }
323        free(filemode); 
324        return 1;
325}
326
327static int erf_config_output(struct libtrace_out_t *libtrace, int argc, char *argv[]) {
328#if HAVE_ZLIB
329        int opt;
330        int level = OPTIONS.erf.level;
331        optind = 1;
332
333
334        while ((opt = getopt(argc, argv, "z:")) != EOF) {
335                switch (opt) {
336                        case 'z':
337                                level = atoi(optarg);
338                                break;
339                        default:
340                                printf("Bad argument to erf: %s\n", opt);
341                                // maybe spit out some help here
342                                return -1;
343                }
344        }
345        if (level != OPTIONS.erf.level) {
346                if (level > 9 || level < 0) {
347                        // retarded level choice
348                        printf("Compression level must be between 0 and 9 inclusive - you selected %i \n", level);
349                       
350                } else {
351                        OPTIONS.erf.level = level;
352                        return gzsetparams(OUTPUT.file, level, Z_DEFAULT_STRATEGY);
353                }
354        }
355#endif
356        return 0;
357
358}
359
360
361#ifdef HAVE_DAG
362static int dag_fin_input(struct libtrace_t *libtrace) {
363        dag_stop(INPUT.fd);
364}
365#endif
366
367static int erf_fin_input(struct libtrace_t *libtrace) {
368#if HAVE_ZLIB
369        gzclose(INPUT.file);
370#else   
371        fclose(INPUT.file);     
372#endif
373        free(libtrace->format_data);
374}
375
376static int rtclient_fin_input(struct libtrace_t *libtrace) {
377        close(INPUT.fd);
378}
379
380static int erf_fin_output(struct libtrace_out_t *libtrace) {
381#if HAVE_ZLIB
382        gzclose(OUTPUT.file);
383#else
384        fclose(OUTPUT.file);
385#endif
386        free(libtrace->format_data);
387}
388 
389
390
391#if HAVE_DAG
392static int dag_read(struct libtrace_t *libtrace, void *buffer, size_t len) {
393        int numbytes;
394        static short lctr = 0;
395        struct dag_record_t *erfptr = 0;
396        int rlen;
397
398        if (buffer == 0)
399                buffer = malloc(len);
400       
401        DAG.bottom = DAG.top;
402        DAG.top = dag_offset(
403                        INPUT.fd,
404                        &(DAG.bottom),
405                        0);
406        DAG.diff = DAG.top -
407                DAG.bottom;
408
409        numbytes=DAG.diff;
410        DAG.offset = 0;
411        return numbytes;
412}
413#endif
414
415#if HAVE_DAG
416static int dag_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
417        int numbytes;
418        int size;
419        char buf[RP_BUFSIZE];
420        dag_record_t *erfptr;
421        void *buffer = packet->buffer;
422        void *buffer2 = buffer;
423        int rlen;
424       
425        if (DAG.diff == 0) {
426                if ((numbytes = dag_read(libtrace,buf,RP_BUFSIZE)) <= 0) 
427                        return numbytes;
428        }
429
430        //DAG always gives us whole packets
431        erfptr = (dag_record_t *) ((void *)DAG.buf + 
432                        (DAG.bottom + DAG.offset));
433        size = ntohs(erfptr->rlen);
434
435        if ( size  > LIBTRACE_PACKET_BUFSIZE) {
436                printf("%d\n",size);
437                assert( size < LIBTRACE_PACKET_BUFSIZE);
438        }
439
440        // have to copy it out of the memory hole at this stage:
441        memcpy(packet->buffer, erfptr, size);
442       
443        packet->status = 0;
444        packet->size = size;
445        DAG.offset += size;
446        DAG.diff -= size;
447
448        assert(DAG.diff >= 0);
449
450        return (size);
451}
452#endif
453
454static int erf_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
455        int numbytes;
456        int size;
457        char buf[RP_BUFSIZE];
458        dag_record_t *erfptr;
459        void *buffer = packet->buffer;
460        void *buffer2 = buffer;
461        int rlen;
462#if HAVE_ZLIB
463        if ((numbytes=gzread(INPUT.file,
464                                        buffer,
465                                        dag_record_size)) == -1) {
466                perror("gzread");
467                return -1;
468        }
469#else
470        if ((numbytes = read(INPUT.file, buffer, dag_record_size)) == -1) {
471                perror("read");
472                return -1;
473        }
474#endif
475        if (numbytes == 0) {
476                return 0;
477        }
478        rlen = ntohs(((dag_record_t *)buffer)->rlen);
479        size = rlen - dag_record_size;
480        assert(size < LIBTRACE_PACKET_BUFSIZE);
481        buffer2 = buffer + dag_record_size;
482       
483        // read in the rest of the packet
484        if ((numbytes=gzread(INPUT.file,
485                                        buffer2,
486                                        size)) == -1) {
487                perror("gzread");
488                return -1;
489        }
490        packet->status = 0;
491        packet->size = rlen;
492        return rlen;
493}
494
495static int rtclient_read(struct libtrace_t *libtrace, void *buffer, size_t len) {
496        int numbytes;
497        static short lctr = 0;
498        struct dag_record_t *erfptr = 0;
499        int rlen;
500
501        if (buffer == 0)
502                buffer = malloc(len);
503        while(1) {
504#ifndef MSG_NOSIGNAL
505#  define MSG_NOSIGNAL 0
506#endif
507                if ((numbytes = recv(INPUT.fd,
508                                                buffer,
509                                                len,
510                                                MSG_NOSIGNAL)) == -1) {
511                        if (errno == EINTR) {
512                                //ignore EINTR in case
513                                // a caller is using signals
514                                continue;
515                        }
516                        perror("recv");
517                        return -1;
518                }
519                break;
520
521        }
522        return numbytes;
523}
524
525static int rtclient_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
526        int numbytes = 0;
527        int size = 0;
528        char buf[RP_BUFSIZE];
529        dag_record_t *erfptr = 0;
530        int read_required = 0;
531       
532        void *buffer = 0;
533
534        packet->trace = libtrace;
535        buffer = packet->buffer;
536
537        do {
538                if (tracefifo_out_available(libtrace->fifo) == 0 || read_required) {
539                        if ((numbytes = rtclient_read(
540                                        libtrace,buf,RP_BUFSIZE))<=0) {
541                                return numbytes;
542                        }
543                        tracefifo_write(libtrace->fifo,buf,numbytes);
544                        read_required = 0;
545                }
546                // Read status byte
547                if (tracefifo_out_read(libtrace->fifo,
548                                &packet->status, sizeof(int)) == 0) {
549                        read_required = 1;
550                        continue;
551                }
552                tracefifo_out_update(libtrace->fifo,sizeof(int));
553
554                // read in the ERF header
555                if ((numbytes = tracefifo_out_read(libtrace->fifo, buffer,
556                                                sizeof(dag_record_t))) == 0) {
557                        tracefifo_out_reset(libtrace->fifo);
558                        read_required = 1;
559                        continue;
560                }
561                size = ntohs(((dag_record_t *)buffer)->rlen);
562               
563                // read in the full packet
564                if ((numbytes = tracefifo_out_read(libtrace->fifo, 
565                                                buffer, size)) == 0) {
566                        tracefifo_out_reset(libtrace->fifo);
567                        read_required = 1;
568                        continue;
569                }
570
571                // got in our whole packet, so...
572                tracefifo_out_update(libtrace->fifo,size);
573
574                tracefifo_ack_update(libtrace->fifo,size + sizeof(int));
575
576                packet->size = numbytes;
577                return numbytes;
578        } while(1);
579}
580
581static int erf_dump_packet(struct libtrace_out_t *libtrace, dag_record_t *erfptr, void *buffer, size_t size) {
582        int numbytes = 0;
583#if HAVE_ZLIB
584        if ((numbytes = gzwrite(OUTPUT.file, erfptr, dag_record_size + 2)) == 0) {
585                perror("gzwrite");
586                return -1;
587        }
588        if ((numbytes = gzwrite(OUTPUT.file, buffer, size)) == 0) {
589                perror("gzwrite");
590                return -1;
591        }
592#else
593        if ((numbytes = write(OUTPUT.file, erfptr, dag_record_size + 2)) == 0) {
594                perror("write");
595                return -1;
596        }
597        if ((numbytes = write(OUTPUT.file, buffer, size)) == 0) {
598                perror("write");
599                return -1;
600        }
601#endif
602        return numbytes + sizeof(dag_record_t);
603
604}
605               
606static int erf_write_packet(struct libtrace_out_t *libtrace, struct libtrace_packet_t *packet) {
607        int numbytes = 0;
608        dag_record_t erfhdr;
609        void *payload = (void *)trace_get_link(packet);
610
611        if (packet->trace->format == erf_ptr || 
612#if HAVE_DAG
613                        packet->trace->format == dag_ptr ||
614#endif
615                        packet->trace->format == rtclient_ptr ) {
616                numbytes = erf_dump_packet(libtrace,
617                                (dag_record_t *)packet->buffer,
618                                payload,
619                                packet->size - 
620                                        (dag_record_size + 2)); 
621        } else {
622                // convert format - build up a new erf header
623                // Timestamp
624                erfhdr.ts = trace_get_erf_timestamp(packet);
625                // Link type
626                switch(trace_get_link_type(packet)) {
627                case TRACE_TYPE_ETH:
628                        erfhdr.type=TYPE_ETH; break;
629                case TRACE_TYPE_ATM:
630                        erfhdr.type=TYPE_ATM; break;
631                default:
632                        erfhdr.type=0; 
633                }
634                // Flags. Can't do this
635                memset(&erfhdr.flags,1,1);
636                // Packet length
637                erfhdr.rlen = trace_get_capture_length(packet);
638                // loss counter. Can't do this
639                erfhdr.lctr = 0;
640                // Wire length
641                erfhdr.wlen = trace_get_wire_length(packet);
642               
643                // Write it out
644                numbytes = erf_dump_packet(libtrace,
645                                &erfhdr,
646                                payload,
647                                erfhdr.rlen);
648        }
649        return numbytes;
650}
651
652
653static void *erf_get_link(const struct libtrace_packet_t *packet) {
654        const void *ethptr = 0;
655        dag_record_t *erfptr = 0;
656        erfptr = (dag_record_t *)packet->buffer;
657       
658        if (erfptr->flags.rxerror == 1) {
659                return NULL;
660        }
661        ethptr = ((uint8_t *)packet->buffer +
662                        dag_record_size + 2);
663        return (void *)ethptr;
664}
665
666static libtrace_linktype_t erf_get_link_type(const struct libtrace_packet_t *packet) {
667        dag_record_t *erfptr = 0;
668        erfptr = (dag_record_t *)packet->buffer;
669        switch (erfptr->type) {
670                case TYPE_ETH: return TRACE_TYPE_ETH;
671                case TYPE_ATM: return TRACE_TYPE_ATM;
672                default: assert(0);
673        }
674        return erfptr->type;
675}
676
677static int8_t erf_get_direction(const struct libtrace_packet_t *packet) {
678        dag_record_t *erfptr = 0;
679        erfptr = (dag_record_t *)packet->buffer;
680        return erfptr->flags.iface;
681}
682
683static int8_t erf_set_direction(const struct libtrace_packet_t *packet, int8_t direction) {
684        dag_record_t *erfptr = 0;
685        erfptr = (dag_record_t *)packet->buffer;
686        erfptr->flags.iface = direction;
687        return erfptr->flags.iface;
688}
689
690static uint64_t erf_get_erf_timestamp(const struct libtrace_packet_t *packet) {
691        dag_record_t *erfptr = 0;
692        erfptr = (dag_record_t *)packet->buffer;
693        return erfptr->ts;
694}
695
696static int erf_get_capture_length(const struct libtrace_packet_t *packet) {
697        dag_record_t *erfptr = 0;
698        erfptr = (dag_record_t *)packet->buffer;
699        return ntohs(erfptr->rlen);
700}
701
702static int erf_get_wire_length(const struct libtrace_packet_t *packet) {
703        dag_record_t *erfptr = 0;
704        erfptr = (dag_record_t *)packet->buffer;
705        return ntohs(erfptr->wlen);
706}
707
708static size_t erf_set_capture_length(struct libtrace_packet_t *packet, size_t size) {
709        dag_record_t *erfptr = 0;
710        assert(packet);
711        if(size > packet->size) {
712                // can't make a packet larger
713                return packet->size;
714        }
715        erfptr = (dag_record_t *)packet->buffer;
716        erfptr->rlen = ntohs(size + sizeof(dag_record_t));
717        packet->size = size + sizeof(dag_record_t);
718        return packet->size;
719}
720
721static int rtclient_get_fd(struct libtrace_packet_t *packet) {
722        return packet->trace->format_data->input.fd;
723}
724
725static int erf_get_fd(struct libtrace_packet_t *packet) {
726        return packet->trace->format_data->input.fd;
727}
728
729#if HAVE_DAG
730static void dag_help() {
731        printf("dag format module: $Revision$\n");
732        printf("Supported input URIs:\n");
733        printf("\tdag:/dev/dagn\n");
734        printf("\n");
735        printf("\te.g.: dag:/dev/dag0\n");
736        printf("\n");
737        printf("Supported output URIs:\n");
738        printf("\tnone\n");
739        printf("\n");
740}
741#endif
742
743
744static void erf_help() {
745        printf("erf format module: $Revision$\n");
746        printf("Supported input URIs:\n");
747        printf("\terf:/path/to/file\t(uncompressed)\n");
748        printf("\terf:/path/to/file.gz\t(gzip-compressed)\n");
749        printf("\terf:-\t(stdin, either compressed or not)\n");
750        printf("\terf:/path/to/socket\n");
751        printf("\n");
752        printf("\te.g.: erf:/tmp/trace\n");
753        printf("\n");
754        printf("Supported output URIs:\n");
755        printf("\terf:path/to/file\t(uncompressed)\n");
756        printf("\terf:/path/to/file.gz\t(gzip-compressed)\n");
757        printf("\terf:-\t(stdout, either compressed or not)\n");
758        printf("\n");
759        printf("\te.g.: erf:/tmp/trace\n");
760        printf("\n");
761        printf("Supported output options:\n");
762        printf("\t-z\tSpecify the gzip compression, ranging from 0 (uncompressed) to 9 - defaults to 1\n");
763        printf("\n");
764
765       
766}
767
768static void rtclient_help() {
769        printf("rtclient format module\n");
770        printf("Supported input URIs:\n");
771        printf("\trtclient:hostname:port\n");
772        printf("\trtclient:hostname (connects on default port)\n");
773        printf("\n");
774        printf("\te.g.: rtclient:localhost\n");
775        printf("\te.g.: rtclient:localhost:32500\n");
776        printf("\n");
777        printf("Supported output URIs:\n");
778        printf("\trtclient: \t(will output on default port on all available IP addresses) \n");
779        printf("\trtclient:hostname:port\n");
780        printf("\trtclient:port\n");
781        printf("\n");
782        printf("\te.g.: rtclient:32500\n");
783        printf("\te.g.: rtclient:\n");
784        printf("\n");
785
786}
787
788       
789static struct libtrace_format_t erf = {
790        "erf",
791        "$Id$",
792        "erf",
793        erf_init_input,                 /* init_input */       
794        erf_init_output,                /* init_output */
795        erf_config_output,              /* config_output */
796        erf_fin_input,                  /* fin_input */
797        erf_fin_output,                 /* fin_output */
798        erf_read_packet,                /* read_packet */
799        erf_write_packet,               /* write_packet */
800        erf_get_link,                   /* get_link */
801        erf_get_link_type,              /* get_link_type */
802        erf_get_direction,              /* get_direction */
803        erf_set_direction,              /* set_direction */
804        erf_get_erf_timestamp,          /* get_erf_timestamp */
805        NULL,                           /* get_timeval */
806        NULL,                           /* get_seconds */
807        erf_get_capture_length,         /* get_capture_length */
808        erf_get_wire_length,            /* get_wire_length */
809        erf_set_capture_length,         /* set_capture_length */
810        erf_get_fd,                     /* get_fd */
811        trace_event_trace,              /* trace_event */
812        erf_help                        /* help */
813};
814
815#ifdef HAVE_DAG
816static struct libtrace_format_t dag = {
817        "dag",
818        "$Id$",
819        "erf",
820        dag_init_input,                 /* init_input */       
821        NULL,                           /* init_output */
822        NULL,                           /* config_output */
823        dag_fin_input,                  /* fin_input */
824        NULL,                           /* fin_output */
825        dag_read_packet,                /* read_packet */
826        NULL,                           /* write_packet */
827        erf_get_link,                   /* get_link */
828        erf_get_link_type,              /* get_link_type */
829        erf_get_direction,              /* get_direction */
830        erf_set_direction,              /* set_direction */
831        erf_get_erf_timestamp,          /* get_erf_timestamp */
832        NULL,                           /* get_timeval */
833        NULL,                           /* get_seconds */
834        erf_get_capture_length,         /* get_capture_length */
835        erf_get_wire_length,            /* get_wire_length */
836        erf_set_capture_length,         /* set_capture_length */
837        NULL,                           /* get_fd */
838        trace_event_trace,              /* trace_event */
839        dag_help                        /* help */
840};
841#endif
842
843static struct libtrace_format_t rtclient = {
844        "rtclient",
845        "$Id$",
846        "erf",
847        rtclient_init_input,            /* init_input */       
848        NULL,                           /* init_output */
849        NULL,                           /* config_output */
850        rtclient_fin_input,             /* fin_input */
851        NULL,                           /* fin_output */
852        rtclient_read_packet,           /* read_packet */
853        NULL,                           /* write_packet */
854        erf_get_link,                   /* get_link */
855        erf_get_link_type,              /* get_link_type */
856        erf_get_direction,              /* get_direction */
857        erf_set_direction,              /* set_direction */
858        erf_get_erf_timestamp,          /* get_erf_timestamp */
859        NULL,                           /* get_timeval */
860        NULL,                           /* get_seconds */
861        erf_get_capture_length,         /* get_capture_length */
862        erf_get_wire_length,            /* get_wire_length */
863        erf_set_capture_length,         /* set_capture_length */
864        rtclient_get_fd,                /* get_fd */
865        trace_event_device,             /* trace_event */
866        rtclient_help                   /* help */
867};
868
869void __attribute__((constructor)) erf_constructor() {
870        erf_ptr = &erf;
871        register_format(erf_ptr);
872#ifdef HAVE_DAG
873        dag_ptr = &dag;
874        register_format(dag_ptr);
875#endif
876        rtclient_ptr = &rtclient;
877        register_format(rtclient_ptr);
878}
Note: See TracBrowser for help on using the repository browser.