source: lib/format_legacy.c @ e1fdc05

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