source: lib/format_atmhdr.c @ c66068d

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

Rewrite the libtrace io subsystem to use the new wandio abstraction layer.

  • Property mode set to 100644
File size: 5.0 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#include "wandio.h"
9
10#include <sys/stat.h>
11#include <assert.h>
12#include <errno.h>
13#include <fcntl.h>
14#include <stdio.h>
15#include <string.h>
16#include <stdlib.h>
17
18
19
20#define DATA(x) ((struct atmhdr_format_data_t *)x->format_data)
21
22#define INPUT DATA(libtrace)->input
23
24struct atmhdr_format_data_t {
25        union {
26                int fd;
27                io_t *file;
28        } input;
29};
30
31static int atmhdr_get_framing_length(const libtrace_packet_t *packet UNUSED)
32{
33        return sizeof(atmhdr_t);
34}
35
36static int atmhdr_init_input(libtrace_t *libtrace) {
37        libtrace->format_data = malloc(sizeof(struct atmhdr_format_data_t));
38        DATA(libtrace)->input.file = NULL;
39        return 0;
40}
41
42static int atmhdr_start_input(libtrace_t *libtrace)
43{
44        if (DATA(libtrace)->input.file)
45                return 0;
46        DATA(libtrace)->input.file = trace_open_file(libtrace);
47        if (DATA(libtrace)->input.file)
48                return 0;
49        return -1;
50}
51
52static int atmhdr_fin_input(libtrace_t *libtrace)
53{
54        wandio_destroy(INPUT.file);
55        free(libtrace->format_data);
56        return 0;
57}
58
59static int atmhdr_prepare_packet(libtrace_t *libtrace, 
60                libtrace_packet_t *packet, void *buffer, 
61                libtrace_rt_types_t rt_type, uint32_t flags) {
62
63        if (packet->buffer != buffer &&
64                        packet->buf_control == TRACE_CTRL_PACKET) {
65                free(packet->buffer);
66        }
67
68        if ((flags & TRACE_PREP_OWN_BUFFER) == TRACE_PREP_OWN_BUFFER) {
69                packet->buf_control = TRACE_CTRL_PACKET;
70        } else
71                packet->buf_control = TRACE_CTRL_EXTERNAL;
72
73        packet->buffer = buffer;
74        packet->header = buffer;
75        packet->payload = (void*)((char*)packet->buffer + 
76                        libtrace->format->get_framing_length(packet));
77        packet->type = rt_type;
78
79        if (libtrace->format_data == NULL) {
80                if (atmhdr_init_input(libtrace))
81                        return -1;
82        }
83        return 0;
84}
85
86static int atmhdr_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
87        int numbytes;
88        void *buffer;
89        uint32_t flags = 0;
90       
91        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
92                packet->buffer=malloc((size_t)LIBTRACE_PACKET_BUFSIZE);
93        }
94        buffer = packet->buffer;
95        flags |= TRACE_PREP_OWN_BUFFER;
96       
97        packet->type = TRACE_RT_DATA_ATMHDR;
98
99        if ((numbytes=wandio_read(INPUT.file, buffer, (size_t)12)) != 12)
100        {
101                if (numbytes != 0) {
102                        trace_set_err(libtrace,errno,"read(%s)",libtrace->uridata);
103                }
104                return numbytes;
105        }
106
107        if (atmhdr_prepare_packet(libtrace, packet, buffer, 
108                                TRACE_RT_DATA_ATMHDR, flags)) {
109                return -1;
110        }
111                               
112       
113        return 12;
114}
115
116static libtrace_linktype_t atmhdr_get_link_type(const libtrace_packet_t *packet UNUSED) {
117        return TRACE_TYPE_ATM;
118}
119
120static int atmhdr_get_capture_length(const libtrace_packet_t *packet UNUSED) {
121        return 4;
122}
123
124static int atmhdr_get_wire_length(const libtrace_packet_t *packet UNUSED) {
125        return 53;
126}
127
128static uint64_t atmhdr_get_erf_timestamp(const libtrace_packet_t *packet) {
129        uint64_t ts;
130        atmhdr_t *atm = (atmhdr_t *)packet->header;
131        ts = (uint64_t)atm->ts_fraction + ((uint64_t)atm->ts_sec << 32);
132
133        return ts;
134}
135
136static struct libtrace_format_t atmhdr = {
137        "atmhdr",
138        "$Id$",
139        TRACE_FORMAT_ATMHDR,
140        atmhdr_init_input,              /* init_input */
141        NULL,                           /* config_input */
142        atmhdr_start_input,             /* start_input */
143        NULL,                           /* pause_input */
144        NULL,                           /* init_output */
145        NULL,                           /* config_output */
146        NULL,                           /* start_output */
147        atmhdr_fin_input,               /* fin_input */
148        NULL,                           /* fin_output */
149        atmhdr_read_packet,             /* read_packet */
150        atmhdr_prepare_packet,          /* prepare_packet */
151        NULL,                           /* fin_packet */
152        NULL,                           /* write_packet */
153        atmhdr_get_link_type,           /* get_link_type */
154        NULL,                           /* get_direction */
155        NULL,                           /* set_direction */
156        atmhdr_get_erf_timestamp,       /* get_erf_timestamp */
157        NULL,                           /* get_timeval */
158        NULL,                           /* get_seconds */
159        NULL,                           /* seek_erf */
160        NULL,                           /* seek_timeval */
161        NULL,                           /* seek_seconds */
162        atmhdr_get_capture_length,      /* get_capture_length */
163        atmhdr_get_wire_length,         /* get_wire_length */
164        atmhdr_get_framing_length,      /* get_framing_length */
165        NULL,                           /* set_capture_length */
166        NULL,                           /* get_received_packets */
167        NULL,                           /* get_filtered_packets */
168        NULL,                           /* get_dropped_packets */
169        NULL,                           /* get_captured_packets */
170        NULL,                           /* get_fd */
171        trace_event_trace,              /* trace_event */
172        NULL,                           /* help */
173        NULL                            /* next pointer */
174};
175       
176
177void atmhdr_constructor(void) {
178        register_format(&atmhdr);
179}
Note: See TracBrowser for help on using the repository browser.