source: lib/format_atmhdr.c @ f2fae49

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

Add new "loss" framework

  • Property mode set to 100644
File size: 4.2 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_received_packets */
135        NULL,                           /* get_filtered_packets */
136        NULL,                           /* get_dropped_packets */
137        NULL,                           /* get_captured_packets */
138        NULL,                           /* get_fd */
139        trace_event_trace,              /* trace_event */
140        NULL,                           /* help */
141        NULL                            /* next pointer */
142};
143       
144
145void atmhdr_constructor(void) {
146        register_format(&atmhdr);
147}
Note: See TracBrowser for help on using the repository browser.