source: lib/format_legacy.c @ f9d2f04

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

Fix bug with legacy trace not being initialised properly
Remove debugging

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