source: lib/format_atmhdr.c @ 1aa4bf7

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

Support using timespec's for dealing with traces

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