source: lib/format_atmhdr.c @ dd06159

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since dd06159 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: 4.1 KB
Line 
1#define _GNU_SOURCE
2
3#include "config.h"
4#include "common.h"
5#include "libtrace.h"
6#include "libtrace_int.h"
7#include "format_helper.h"
8
9#include <sys/stat.h>
10#include <assert.h>
11#include <errno.h>
12#include <fcntl.h>
13#include <stdio.h>
14#include <string.h>
15#include <stdlib.h>
16
17
18
19#define DATA(x) ((struct atmhdr_format_data_t *)x->format_data)
20
21#define INPUT DATA(libtrace)->input
22
23struct atmhdr_format_data_t {
24        union {
25                int fd;
26                libtrace_io_t *file;
27        } input;
28};
29
30static int atmhdr_get_framing_length(const libtrace_packet_t *packet UNUSED)
31{
32        return sizeof(atmhdr_t);
33}
34
35static int atmhdr_init_input(libtrace_t *libtrace) {
36        libtrace->format_data = malloc(sizeof(struct atmhdr_format_data_t));
37        DATA(libtrace)->input.file = NULL;
38        return 0;
39}
40
41static int atmhdr_start_input(libtrace_t *libtrace)
42{
43        if (DATA(libtrace)->input.file)
44                return 0;
45        DATA(libtrace)->input.file = trace_open_file(libtrace);
46        if (DATA(libtrace)->input.file)
47                return 0;
48        return -1;
49}
50
51static int atmhdr_fin_input(libtrace_t *libtrace)
52{
53        libtrace_io_close(INPUT.file);
54        free(libtrace->format_data);
55        return 0;
56}
57
58static int atmhdr_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
59        int numbytes;
60        void *buffer;
61
62        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
63                packet->buf_control = TRACE_CTRL_PACKET;
64                packet->buffer=malloc((size_t)LIBTRACE_PACKET_BUFSIZE);
65        }
66        buffer = packet->buffer;
67
68        packet->type = TRACE_RT_DATA_ATMHDR;
69
70        if ((numbytes=libtrace_io_read(INPUT.file, buffer, (size_t)12)) != 12)
71        {
72                if (numbytes != 0) {
73                        trace_set_err(libtrace,errno,"read(%s)",libtrace->uridata);
74                }
75                return numbytes;
76        }
77
78        packet->header = packet->buffer;
79        packet->payload = (void*)((char*)packet->buffer +
80                        libtrace->format->get_framing_length(packet));
81
82        return 12;
83}
84
85static libtrace_linktype_t atmhdr_get_link_type(const libtrace_packet_t *packet UNUSED) {
86        return TRACE_TYPE_ATM;
87}
88
89static int atmhdr_get_capture_length(const libtrace_packet_t *packet UNUSED) {
90        return 4;
91}
92
93static int atmhdr_get_wire_length(const libtrace_packet_t *packet UNUSED) {
94        return 53;
95}
96
97static uint64_t atmhdr_get_erf_timestamp(const libtrace_packet_t *packet) {
98        uint64_t ts;
99        atmhdr_t *atm = (atmhdr_t *)packet->header;
100        ts = (uint64_t)atm->ts_fraction + ((uint64_t)atm->ts_sec << 32);
101
102        return ts;
103}
104
105static struct libtrace_format_t atmhdr = {
106        "atmhdr",
107        "$Id$",
108        TRACE_FORMAT_ATMHDR,
109        atmhdr_init_input,                 /* init_input */
110        NULL,                           /* config_input */
111        atmhdr_start_input,                /* start_input */
112        NULL,                           /* pause_input */
113        NULL,                           /* init_output */
114        NULL,                           /* config_output */
115        NULL,                           /* start_output */
116        atmhdr_fin_input,                  /* fin_input */
117        NULL,                           /* fin_output */
118        atmhdr_read_packet,             /* read_packet */
119        NULL,                           /* fin_packet */
120        NULL,                           /* write_packet */
121        atmhdr_get_link_type,        /* get_link_type */
122        NULL,                           /* get_direction */
123        NULL,                           /* set_direction */
124        atmhdr_get_erf_timestamp,       /* get_erf_timestamp */
125        NULL,                           /* get_timeval */
126        NULL,                           /* get_seconds */
127        NULL,                           /* seek_erf */
128        NULL,                           /* seek_timeval */
129        NULL,                           /* seek_seconds */
130        atmhdr_get_capture_length,      /* get_capture_length */
131        atmhdr_get_wire_length,      /* get_wire_length */
132        atmhdr_get_framing_length,   /* get_framing_length */
133        NULL,                           /* set_capture_length */
134        NULL,                           /* get_fd */
135        trace_event_trace,              /* trace_event */
136        NULL,                 /* help */
137        NULL                            /* next pointer */
138};
139       
140
141void atmhdr_constructor(void) {
142        register_format(&atmhdr);
143}
Note: See TracBrowser for help on using the repository browser.