source: lib/format_atmhdr.c @ f0fb38f

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since f0fb38f was f0fb38f, checked in by Shane Alcock <salcock@…>, 13 years ago
  • Added prepare_packet functions to all formats, primarily to support translating RT packets into the appropriate format. These functions are all used internally as well, as most formats still need to "prepare" packets that have been read by setting pointers, updating loss counters etc.
  • Also added a trace_prepare_packet function, but this is not made available externally at this stage
  • Added init_format_data functions to some formats to initialise format data structures in cases where the init_trace function does more than just that
  • Refactored rt packet reading code to use the new trace_prepare_packet functionality - also did a lot of tidying of the code
  • Added missing RT type for BPF format
  • 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
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_prepare_packet(libtrace_t *libtrace, 
59                libtrace_packet_t *packet, void *buffer, 
60                libtrace_rt_types_t rt_type, uint32_t flags) {
61
62        if (packet->buffer != buffer &&
63                        packet->buf_control == TRACE_CTRL_PACKET) {
64                free(packet->buffer);
65        }
66
67        if ((flags & TRACE_PREP_OWN_BUFFER) == TRACE_PREP_OWN_BUFFER) {
68                packet->buf_control = TRACE_CTRL_PACKET;
69        } else
70                packet->buf_control = TRACE_CTRL_EXTERNAL;
71
72        packet->buffer = buffer;
73        packet->header = buffer;
74        packet->payload = (void*)((char*)packet->buffer + 
75                        libtrace->format->get_framing_length(packet));
76        packet->type = rt_type;
77
78        if (libtrace->format_data == NULL) {
79                if (atmhdr_init_input(libtrace))
80                        return -1;
81        }
82        return 0;
83}
84
85static int atmhdr_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
86        int numbytes;
87        void *buffer;
88        uint32_t flags = 0;
89       
90        if (!packet->buffer || packet->buf_control == TRACE_CTRL_EXTERNAL) {
91                packet->buffer=malloc((size_t)LIBTRACE_PACKET_BUFSIZE);
92        }
93        buffer = packet->buffer;
94        flags |= TRACE_PREP_OWN_BUFFER;
95       
96        packet->type = TRACE_RT_DATA_ATMHDR;
97
98        if ((numbytes=libtrace_io_read(INPUT.file, buffer, (size_t)12)) != 12)
99        {
100                if (numbytes != 0) {
101                        trace_set_err(libtrace,errno,"read(%s)",libtrace->uridata);
102                }
103                return numbytes;
104        }
105
106        if (atmhdr_prepare_packet(libtrace, packet, buffer, 
107                                TRACE_RT_DATA_ATMHDR, flags)) {
108                return -1;
109        }
110                               
111       
112        return 12;
113}
114
115static libtrace_linktype_t atmhdr_get_link_type(const libtrace_packet_t *packet UNUSED) {
116        return TRACE_TYPE_ATM;
117}
118
119static int atmhdr_get_capture_length(const libtrace_packet_t *packet UNUSED) {
120        return 4;
121}
122
123static int atmhdr_get_wire_length(const libtrace_packet_t *packet UNUSED) {
124        return 53;
125}
126
127static uint64_t atmhdr_get_erf_timestamp(const libtrace_packet_t *packet) {
128        uint64_t ts;
129        atmhdr_t *atm = (atmhdr_t *)packet->header;
130        ts = (uint64_t)atm->ts_fraction + ((uint64_t)atm->ts_sec << 32);
131
132        return ts;
133}
134
135static struct libtrace_format_t atmhdr = {
136        "atmhdr",
137        "$Id$",
138        TRACE_FORMAT_ATMHDR,
139        atmhdr_init_input,              /* init_input */
140        NULL,                           /* config_input */
141        atmhdr_start_input,             /* start_input */
142        NULL,                           /* pause_input */
143        NULL,                           /* init_output */
144        NULL,                           /* config_output */
145        NULL,                           /* start_output */
146        atmhdr_fin_input,               /* fin_input */
147        NULL,                           /* fin_output */
148        atmhdr_read_packet,             /* read_packet */
149        atmhdr_prepare_packet,          /* prepare_packet */
150        NULL,                           /* fin_packet */
151        NULL,                           /* write_packet */
152        atmhdr_get_link_type,           /* get_link_type */
153        NULL,                           /* get_direction */
154        NULL,                           /* set_direction */
155        atmhdr_get_erf_timestamp,       /* get_erf_timestamp */
156        NULL,                           /* get_timeval */
157        NULL,                           /* get_seconds */
158        NULL,                           /* seek_erf */
159        NULL,                           /* seek_timeval */
160        NULL,                           /* seek_seconds */
161        atmhdr_get_capture_length,      /* get_capture_length */
162        atmhdr_get_wire_length,         /* get_wire_length */
163        atmhdr_get_framing_length,      /* get_framing_length */
164        NULL,                           /* set_capture_length */
165        NULL,                           /* get_received_packets */
166        NULL,                           /* get_filtered_packets */
167        NULL,                           /* get_dropped_packets */
168        NULL,                           /* get_captured_packets */
169        NULL,                           /* get_fd */
170        trace_event_trace,              /* trace_event */
171        NULL,                           /* help */
172        NULL                            /* next pointer */
173};
174       
175
176void atmhdr_constructor(void) {
177        register_format(&atmhdr);
178}
Note: See TracBrowser for help on using the repository browser.