source: lib/format_legacy.c @ cab58c5

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

Move RT_* to TRACE_RT_* and put it in libtrace.h

  • Property mode set to 100644
File size: 8.9 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
38#include <sys/stat.h>
39#include <assert.h>
40#include <errno.h>
41#include <fcntl.h>
42#include <stdio.h>
43#include <string.h>
44#include <stdlib.h>
45
[33e1501]46#ifdef WIN32
47#  include <io.h>
48#  include <share.h>
49#  define snprintf sprintf_s
50#endif
[37195b4]51
52
53/* Catch undefined O_LARGEFILE on *BSD etc */
54#ifndef O_LARGEFILE
55#  define O_LARGEFILE 0
56#endif
57
[ab4cb04]58#define DATA(x) ((struct legacy_format_data_t *)x->format_data)
59
60#define INPUT DATA(libtrace)->input
61
62struct legacy_format_data_t {
[37195b4]63        union {
64                int fd;
[edb18ce]65                libtrace_io_t *file;
[37195b4]66        } input;
67};
68
[e6d963c]69static int legacyeth_get_framing_length(const libtrace_packet_t *packet UNUSED) 
[37195b4]70{
71        return sizeof(legacy_ether_t);
72}
73
[e6d963c]74static int legacypos_get_framing_length(const libtrace_packet_t *packet UNUSED) 
[37195b4]75{
76        return sizeof(legacy_pos_t);
77}
78
[e6d963c]79static int legacyatm_get_framing_length(const libtrace_packet_t *packet UNUSED) 
[37195b4]80{
81        return sizeof(legacy_cell_t);
82}
83
[e6d963c]84static int erf_init_input(libtrace_t *libtrace) 
[3d4d52d]85{
[ab4cb04]86        libtrace->format_data = malloc(sizeof(struct legacy_format_data_t));
[37195b4]87
[f9d2f04]88        DATA(libtrace)->input.file = NULL;
89
[ab4cb04]90        return 0;
91}
[3d4d52d]92
[ab4cb04]93static int erf_start_input(libtrace_t *libtrace)
94{
[bb75d10]95        if (DATA(libtrace)->input.file)
96                return 0;
97
[ab4cb04]98        DATA(libtrace)->input.file = trace_open_file(libtrace);
[3d4d52d]99
[ab4cb04]100        if (DATA(libtrace)->input.file)
101                return 0;
[3d4d52d]102
[ab4cb04]103        return -1;
[37195b4]104}
105
[e6d963c]106static int erf_fin_input(libtrace_t *libtrace) {
[edb18ce]107        libtrace_io_close(INPUT.file);
[37195b4]108        free(libtrace->format_data);
109        return 0;
110}
111
[e6d963c]112static int legacy_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
[37195b4]113        int numbytes;
[c1db742]114        void *buffer;
115
116        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
117                packet->buf_control = TRACE_CTRL_PACKET;
118                packet->buffer=malloc(LIBTRACE_PACKET_BUFSIZE);
119        }
120        buffer = packet->buffer;
[afd0b73]121
122        switch(libtrace->format->type) {
123                case TRACE_FORMAT_LEGACY_ATM:
[cab58c5]124                        packet->type = TRACE_RT_DATA_LEGACY_ATM;
[afd0b73]125                        break;
126                case TRACE_FORMAT_LEGACY_POS:
[cab58c5]127                        packet->type = TRACE_RT_DATA_LEGACY_POS;
[afd0b73]128                        break;
129                case TRACE_FORMAT_LEGACY_ETH:
[cab58c5]130                        packet->type = TRACE_RT_DATA_LEGACY_ETH;
[afd0b73]131                        break;
[d8f02df]132                default:
133                        assert(0);
[afd0b73]134        }
[37195b4]135       
[edb18ce]136        if ((numbytes=libtrace_io_read(INPUT.file,
[37195b4]137                                        buffer,
[7e28dcf]138                                        64)) != 64) {
139                if (numbytes!=0) {
140                        trace_set_err(libtrace,errno,"read(%s)",libtrace->uridata);
141                }
142                return numbytes;
[37195b4]143        }
144       
145        packet->header = packet->buffer;
[880aa58]146        packet->payload = (void*)((char*)packet->buffer + 
[52f8fc2]147                libtrace->format->get_framing_length(packet));
[37195b4]148       
149        return 64;
150       
151}
152
[e6d963c]153static libtrace_linktype_t legacypos_get_link_type(const libtrace_packet_t *packet UNUSED) {
[088533a]154        return TRACE_TYPE_POS;
[37195b4]155}
156
[e6d963c]157static libtrace_linktype_t legacyatm_get_link_type(const libtrace_packet_t *packet UNUSED) {
[088533a]158        return TRACE_TYPE_ATM;
[37195b4]159}
160
[e6d963c]161static libtrace_linktype_t legacyeth_get_link_type(const libtrace_packet_t *packet UNUSED) {
[088533a]162        return TRACE_TYPE_ETH;
[37195b4]163}
164
[e6d963c]165static int legacy_get_capture_length(const libtrace_packet_t *packet UNUSED) {
[37195b4]166        return 64;
167}
168
[e6d963c]169static int legacypos_get_wire_length(const libtrace_packet_t *packet) {
[37195b4]170        legacy_pos_t *lpos = (legacy_pos_t *)packet->header;
[bb75d10]171        assert(ntohl(lpos->wlen)>0);
172        return ntohl(lpos->wlen);
[37195b4]173}
174
[e6d963c]175static int legacyatm_get_wire_length(const libtrace_packet_t *packet UNUSED) {
[37195b4]176        return 53;
177}
178
[e6d963c]179static int legacyeth_get_wire_length(const libtrace_packet_t *packet) {
[37195b4]180        legacy_ether_t *leth = (legacy_ether_t *)packet->header;
181        return ntohs(leth->wlen);
182}
183
[e6d963c]184static uint64_t legacy_get_erf_timestamp(const libtrace_packet_t *packet)
[37195b4]185{
186        legacy_ether_t *legacy = (legacy_ether_t*)packet->header;
187        return legacy->ts;
188} 
189
[33d83d4]190static void legacypos_help(void) {
[37195b4]191        printf("legacypos format module: $Revision$\n");
192        printf("Supported input URIs:\n");
193        printf("\tlegacypos:/path/to/file\t(uncompressed)\n");
194        printf("\tlegacypos:/path/to/file.gz\t(gzip-compressed)\n");
195        printf("\tlegacypos:-\t(stdin, either compressed or not)\n");
196        printf("\n");
197        printf("\te.g.: legacypos:/tmp/trace.gz\n");
198        printf("\n");
199}
200
[33d83d4]201static void legacyatm_help(void) {
[37195b4]202        printf("legacyatm format module: $Revision$\n");
203        printf("Supported input URIs:\n");
204        printf("\tlegacyatm:/path/to/file\t(uncompressed)\n");
205        printf("\tlegacyatm:/path/to/file.gz\t(gzip-compressed)\n");
206        printf("\tlegacyatm:-\t(stdin, either compressed or not)\n");
207        printf("\n");
208        printf("\te.g.: legacyatm:/tmp/trace.gz\n");
209        printf("\n");
210}
211
[33d83d4]212static void legacyeth_help(void) {
[37195b4]213        printf("legacyeth format module: $Revision$\n");
214        printf("Supported input URIs:\n");
215        printf("\tlegacyeth:/path/to/file\t(uncompressed)\n");
216        printf("\tlegacyeth:/path/to/file.gz\t(gzip-compressed)\n");
217        printf("\tlegacyeth:-\t(stdin, either compressed or not)\n");
218        printf("\n");
219        printf("\te.g.: legacyeth:/tmp/trace.gz\n");
220        printf("\n");
221}
222
223static struct libtrace_format_t legacyatm = {
224        "legacyatm",
225        "$Id$",
[9ff68ff]226        TRACE_FORMAT_LEGACY_ATM,
[37195b4]227        erf_init_input,                 /* init_input */       
228        NULL,                           /* config_input */
[ab4cb04]229        erf_start_input,                /* start_input */
[1fbd938]230        NULL,                           /* pause_input */
[37195b4]231        NULL,                           /* init_output */
232        NULL,                           /* config_output */
233        NULL,                           /* start_output */
234        erf_fin_input,                  /* fin_input */
235        NULL,                           /* fin_output */
236        legacy_read_packet,             /* read_packet */
[eeab9832]237        NULL,                           /* fin_packet */
[37195b4]238        NULL,                           /* write_packet */
239        legacyatm_get_link_type,        /* get_link_type */
240        NULL,                           /* get_direction */
241        NULL,                           /* set_direction */
242        legacy_get_erf_timestamp,       /* get_erf_timestamp */
243        NULL,                           /* get_timeval */
244        NULL,                           /* get_seconds */
[1fbd938]245        NULL,                           /* seek_erf */
246        NULL,                           /* seek_timeval */
247        NULL,                           /* seek_seconds */
[37195b4]248        legacy_get_capture_length,      /* get_capture_length */
249        legacyatm_get_wire_length,      /* get_wire_length */
250        legacyatm_get_framing_length,   /* get_framing_length */
251        NULL,                           /* set_capture_length */
252        NULL,                           /* get_fd */
253        trace_event_trace,              /* trace_event */
[eeab9832]254        legacyatm_help,                 /* help */
255        NULL                            /* next pointer */
[37195b4]256};
257
258static struct libtrace_format_t legacyeth = {
259        "legacyeth",
260        "$Id$",
[9ff68ff]261        TRACE_FORMAT_LEGACY_ETH,
[37195b4]262        erf_init_input,                 /* init_input */       
263        NULL,                           /* config_input */
[ab4cb04]264        erf_start_input,                /* start_input */
[1fbd938]265        NULL,                           /* pause_input */
[37195b4]266        NULL,                           /* init_output */
267        NULL,                           /* config_output */
268        NULL,                           /* start_output */
269        erf_fin_input,                  /* fin_input */
270        NULL,                           /* fin_output */
271        legacy_read_packet,             /* read_packet */
[eeab9832]272        NULL,                           /* fin_packet */
[37195b4]273        NULL,                           /* write_packet */
274        legacyeth_get_link_type,        /* get_link_type */
275        NULL,                           /* get_direction */
276        NULL,                           /* set_direction */
277        legacy_get_erf_timestamp,       /* get_erf_timestamp */
278        NULL,                           /* get_timeval */
279        NULL,                           /* get_seconds */
[1fbd938]280        NULL,                           /* seek_erf */
281        NULL,                           /* seek_timeval */
282        NULL,                           /* seek_seconds */
[37195b4]283        legacy_get_capture_length,      /* get_capture_length */
284        legacyeth_get_wire_length,      /* get_wire_length */
285        legacyeth_get_framing_length,   /* get_framing_length */
286        NULL,                           /* set_capture_length */
287        NULL,                           /* get_fd */
288        trace_event_trace,              /* trace_event */
[eeab9832]289        legacyeth_help,                 /* help */
290        NULL                            /* next pointer */
[37195b4]291};
292
293static struct libtrace_format_t legacypos = {
294        "legacypos",
295        "$Id$",
[9ff68ff]296        TRACE_FORMAT_LEGACY_POS,
[37195b4]297        erf_init_input,                 /* init_input */       
298        NULL,                           /* config_input */
[ab4cb04]299        erf_start_input,                /* start_input */
[1fbd938]300        NULL,                           /* pause_input */
[37195b4]301        NULL,                           /* init_output */
302        NULL,                           /* config_output */
303        NULL,                           /* start_output */
304        erf_fin_input,                  /* fin_input */
305        NULL,                           /* fin_output */
306        legacy_read_packet,             /* read_packet */
[eeab9832]307        NULL,                           /* fin_packet */
[37195b4]308        NULL,                           /* write_packet */
309        legacypos_get_link_type,        /* get_link_type */
310        NULL,                           /* get_direction */
311        NULL,                           /* set_direction */
312        legacy_get_erf_timestamp,       /* get_erf_timestamp */
313        NULL,                           /* get_timeval */
314        NULL,                           /* get_seconds */
[1fbd938]315        NULL,                           /* seek_erf */
316        NULL,                           /* seek_timeval */
317        NULL,                           /* seek_seconds */
[37195b4]318        legacy_get_capture_length,      /* get_capture_length */
319        legacypos_get_wire_length,      /* get_wire_length */
320        legacypos_get_framing_length,   /* get_framing_length */
321        NULL,                           /* set_capture_length */
322        NULL,                           /* get_fd */
323        trace_event_trace,              /* trace_event */
[eeab9832]324        legacypos_help,                 /* help */
325        NULL,                           /* next pointer */
[37195b4]326};
327
328       
[33d83d4]329void legacy_constructor(void) {
[37195b4]330        register_format(&legacypos);
331        register_format(&legacyeth);
332        register_format(&legacyatm);
333}
Note: See TracBrowser for help on using the repository browser.