source: lib/format_legacy.c @ 1fbd938

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 1fbd938 was 1fbd938, checked in by Perry Lorier <perry@…>, 15 years ago

More -pedantic cleanups
Changed the format structure (again) for pause and seek support

  • Property mode set to 100644
File size: 10.2 KB
RevLine 
[37195b4]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#define _GNU_SOURCE
31
32#include "config.h"
33#include "common.h"
34#include "libtrace.h"
35#include "libtrace_int.h"
36#include "format_helper.h"
37#include "parse_cmd.h"
38
39#ifdef HAVE_INTTYPES_H
40#  include <inttypes.h>
41#else
42#  error "Can't find inttypes.h - this needs to be fixed"
43#endif
44
45#ifdef HAVE_STDDEF_H
46#  include <stddef.h>
47#else
48# error "Can't find stddef.h - do you define ptrdiff_t elsewhere?"
49#endif
50#include <sys/types.h>
51#include <sys/socket.h>
52#include <sys/un.h>
53#include <sys/mman.h>
54#include <sys/stat.h>
55#include <unistd.h>
56#include <assert.h>
57#include <errno.h>
58#include <netdb.h>
59#include <fcntl.h>
60#include <getopt.h>
61#include <stdio.h>
62#include <string.h>
63#include <stdlib.h>
64
65
66#define COLLECTOR_PORT 3435
67
68/* Catch undefined O_LARGEFILE on *BSD etc */
69#ifndef O_LARGEFILE
70#  define O_LARGEFILE 0
71#endif
72
73static struct libtrace_format_t legacypos;
74static struct libtrace_format_t legacyeth;
75static struct libtrace_format_t legacyatm;
76
77#define CONNINFO libtrace->format_data->conn_info
78#define INPUT libtrace->format_data->input
79#define OUTPUT libtrace->format_data->output
80#if HAVE_DAG
81#define DAG libtrace->format_data->dag
82#endif
83#define OPTIONS libtrace->format_data->options
84struct libtrace_format_data_t {
85        union {
86                struct {
87                        char *hostname;
88                        short port;
89                } rt;
90                char *path;             
91        } conn_info;
92        union {
93                int fd;
94#if HAVE_ZLIB
95                gzFile *file;
96#else   
97                //FILE  *file;
98                int file;
99#endif
100        } input;
101};
102
103struct libtrace_format_data_out_t {
104        union {
105                struct {
106                        char *hostname;
107                        short port;
108                } rt;
109                char *path;
110        } conn_info;
111};
112
113
114static int legacyeth_get_framing_length(const struct libtrace_packet_t *packet UNUSED) 
115{
116        return sizeof(legacy_ether_t);
117}
118
119static int legacypos_get_framing_length(const struct libtrace_packet_t *packet UNUSED) 
120{
121        return sizeof(legacy_pos_t);
122}
123
124static int legacyatm_get_framing_length(const struct libtrace_packet_t *packet UNUSED) 
125{
126        return sizeof(legacy_cell_t);
127}
128
129static int erf_init_input(struct libtrace_t *libtrace) {
130        struct stat buf;
131        struct sockaddr_un unix_sock;
132        libtrace->format_data = (struct libtrace_format_data_t *)
133                malloc(sizeof(struct libtrace_format_data_t));
134
135        CONNINFO.path = libtrace->uridata;
136        if (!strncmp(CONNINFO.path,"-",1)) {
137                // STDIN
[6eb91ff]138                libtrace->sourcetype = TRACE_SOURCE_STDIN;
[37195b4]139                INPUT.file = LIBTRACE_FDOPEN(fileno(stdin), "r");
140        } else {
141                if (stat(CONNINFO.path,&buf) == -1 ) {
142                        perror("stat");
143                        return 0;
144                }
145                if (S_ISSOCK(buf.st_mode)) {
[6eb91ff]146                        libtrace->sourcetype = TRACE_SOURCE_SOCKET;
[37195b4]147                        if ((INPUT.fd = socket(
148                                        AF_UNIX, SOCK_STREAM, 0)) == -1) {
149                                perror("socket");
150                                return 0;
151                        }
152                        unix_sock.sun_family = AF_UNIX;
153                        bzero(unix_sock.sun_path,108);
154                        snprintf(unix_sock.sun_path,
155                                        108,"%s"
156                                        ,CONNINFO.path);
157
158                        if (connect(INPUT.fd, 
159                                        (struct sockaddr *)&unix_sock,
160                                        sizeof(struct sockaddr)) == -1) {
161                                perror("connect (unix)");
162                                return 0;
163                        }
164                } else { 
[6eb91ff]165                        libtrace->sourcetype = TRACE_SOURCE_TRACE;
[37195b4]166
167                        // we use an FDOPEN call to reopen an FD
168                        // returned from open(), so that we can set
169                        // O_LARGEFILE. This gets around gzopen not
170                        // letting you do this...
171                        INPUT.file = LIBTRACE_FDOPEN(open(
172                                                CONNINFO.path,
173                                                O_LARGEFILE),"r");
174                }
175        }
176        return 1;
177}
178
179static int erf_fin_input(struct libtrace_t *libtrace) {
180        LIBTRACE_CLOSE(INPUT.file);
181        free(libtrace->format_data);
182        return 0;
183}
184
185static int legacy_read_packet(struct libtrace_t *libtrace, struct libtrace_packet_t *packet) {
186        int numbytes;
187        void *buffer = packet->buffer;
188       
189        if ((numbytes=LIBTRACE_READ(INPUT.file,
190                                        buffer,
191                                        64)) == -1) {
192                perror("libtrace_read");
193                return -1;
194        }
195        packet->size = 64;
196       
197        packet->header = packet->buffer;
198        packet->payload = packet->buffer + 
199                packet->trace->format->get_framing_length(packet);
200       
201        return 64;
202       
203}
204
205static libtrace_linktype_t legacypos_get_link_type(const struct libtrace_packet_t *packet UNUSED) {
206        return TRACE_TYPE_LEGACY_POS;
207}
208
209static libtrace_linktype_t legacyatm_get_link_type(const struct libtrace_packet_t *packet UNUSED) {
210        return TRACE_TYPE_LEGACY_ATM;
211}
212
213static libtrace_linktype_t legacyeth_get_link_type(const struct libtrace_packet_t *packet UNUSED) {
214        return TRACE_TYPE_LEGACY_ETH;
215}
216
217static int legacy_get_capture_length(const struct libtrace_packet_t *packet __attribute__((unused))) {
218        return 64;
219}
220
221static int legacypos_get_wire_length(const struct libtrace_packet_t *packet) {
222        legacy_pos_t *lpos = (legacy_pos_t *)packet->header;
223        return ntohs(lpos->wlen);
224}
225
226static int legacyatm_get_wire_length(const struct libtrace_packet_t *packet UNUSED) {
227        return 53;
228}
229
230static int legacyeth_get_wire_length(const struct libtrace_packet_t *packet) {
231        legacy_ether_t *leth = (legacy_ether_t *)packet->header;
232        return ntohs(leth->wlen);
233}
234
235static uint64_t legacy_get_erf_timestamp(const struct libtrace_packet_t *packet)
236{
237        legacy_ether_t *legacy = (legacy_ether_t*)packet->header;
238        return legacy->ts;
239} 
240
241static void legacypos_help() {
242        printf("legacypos format module: $Revision$\n");
243        printf("Supported input URIs:\n");
244        printf("\tlegacypos:/path/to/file\t(uncompressed)\n");
245        printf("\tlegacypos:/path/to/file.gz\t(gzip-compressed)\n");
246        printf("\tlegacypos:-\t(stdin, either compressed or not)\n");
247        printf("\n");
248        printf("\te.g.: legacypos:/tmp/trace.gz\n");
249        printf("\n");
250}
251
252static void legacyatm_help() {
253        printf("legacyatm format module: $Revision$\n");
254        printf("Supported input URIs:\n");
255        printf("\tlegacyatm:/path/to/file\t(uncompressed)\n");
256        printf("\tlegacyatm:/path/to/file.gz\t(gzip-compressed)\n");
257        printf("\tlegacyatm:-\t(stdin, either compressed or not)\n");
258        printf("\n");
259        printf("\te.g.: legacyatm:/tmp/trace.gz\n");
260        printf("\n");
261}
262
263static void legacyeth_help() {
264        printf("legacyeth format module: $Revision$\n");
265        printf("Supported input URIs:\n");
266        printf("\tlegacyeth:/path/to/file\t(uncompressed)\n");
267        printf("\tlegacyeth:/path/to/file.gz\t(gzip-compressed)\n");
268        printf("\tlegacyeth:-\t(stdin, either compressed or not)\n");
269        printf("\n");
270        printf("\te.g.: legacyeth:/tmp/trace.gz\n");
271        printf("\n");
272}
273
274static struct libtrace_format_t legacyatm = {
275        "legacyatm",
276        "$Id$",
277        "legacyatm",
278        erf_init_input,                 /* init_input */       
279        NULL,                           /* config_input */
280        NULL,                           /* start_input */
[1fbd938]281        NULL,                           /* pause_input */
[37195b4]282        NULL,                           /* init_output */
283        NULL,                           /* config_output */
284        NULL,                           /* start_output */
285        erf_fin_input,                  /* fin_input */
286        NULL,                           /* fin_output */
287        legacy_read_packet,             /* read_packet */
288        NULL,                           /* write_packet */
289        legacyatm_get_link_type,        /* get_link_type */
290        NULL,                           /* get_direction */
291        NULL,                           /* set_direction */
292        legacy_get_erf_timestamp,       /* get_erf_timestamp */
293        NULL,                           /* get_timeval */
294        NULL,                           /* get_seconds */
[1fbd938]295        NULL,                           /* seek_erf */
296        NULL,                           /* seek_timeval */
297        NULL,                           /* seek_seconds */
[37195b4]298        legacy_get_capture_length,      /* get_capture_length */
299        legacyatm_get_wire_length,      /* get_wire_length */
300        legacyatm_get_framing_length,   /* get_framing_length */
301        NULL,                           /* set_capture_length */
302        NULL,                           /* get_fd */
303        trace_event_trace,              /* trace_event */
304        legacyatm_help                  /* help */
305};
306
307static struct libtrace_format_t legacyeth = {
308        "legacyeth",
309        "$Id$",
310        "legacyeth",
311        erf_init_input,                 /* init_input */       
312        NULL,                           /* config_input */
313        NULL,                           /* start_input */
[1fbd938]314        NULL,                           /* pause_input */
[37195b4]315        NULL,                           /* init_output */
316        NULL,                           /* config_output */
317        NULL,                           /* start_output */
318        erf_fin_input,                  /* fin_input */
319        NULL,                           /* fin_output */
320        legacy_read_packet,             /* read_packet */
321        NULL,                           /* write_packet */
322        legacyeth_get_link_type,        /* get_link_type */
323        NULL,                           /* get_direction */
324        NULL,                           /* set_direction */
325        legacy_get_erf_timestamp,       /* get_erf_timestamp */
326        NULL,                           /* get_timeval */
327        NULL,                           /* get_seconds */
[1fbd938]328        NULL,                           /* seek_erf */
329        NULL,                           /* seek_timeval */
330        NULL,                           /* seek_seconds */
[37195b4]331        legacy_get_capture_length,      /* get_capture_length */
332        legacyeth_get_wire_length,      /* get_wire_length */
333        legacyeth_get_framing_length,   /* get_framing_length */
334        NULL,                           /* set_capture_length */
335        NULL,                           /* get_fd */
336        trace_event_trace,              /* trace_event */
337        legacyeth_help                  /* help */
338};
339
340static struct libtrace_format_t legacypos = {
341        "legacypos",
342        "$Id$",
343        "legacypos",
344        erf_init_input,                 /* init_input */       
345        NULL,                           /* config_input */
346        NULL,                           /* start_input */
[1fbd938]347        NULL,                           /* pause_input */
[37195b4]348        NULL,                           /* init_output */
349        NULL,                           /* config_output */
350        NULL,                           /* start_output */
351        erf_fin_input,                  /* fin_input */
352        NULL,                           /* fin_output */
353        legacy_read_packet,             /* read_packet */
354        NULL,                           /* write_packet */
355        legacypos_get_link_type,        /* get_link_type */
356        NULL,                           /* get_direction */
357        NULL,                           /* set_direction */
358        legacy_get_erf_timestamp,       /* get_erf_timestamp */
359        NULL,                           /* get_timeval */
360        NULL,                           /* get_seconds */
[1fbd938]361        NULL,                           /* seek_erf */
362        NULL,                           /* seek_timeval */
363        NULL,                           /* seek_seconds */
[37195b4]364        legacy_get_capture_length,      /* get_capture_length */
365        legacypos_get_wire_length,      /* get_wire_length */
366        legacypos_get_framing_length,   /* get_framing_length */
367        NULL,                           /* set_capture_length */
368        NULL,                           /* get_fd */
369        trace_event_trace,              /* trace_event */
370        legacypos_help                  /* help */
371};
372
373       
374static void __attribute__((constructor)) legacy_constructor() {
375        register_format(&legacypos);
376        register_format(&legacyeth);
377        register_format(&legacyatm);
378}
Note: See TracBrowser for help on using the repository browser.