source: lib/format_linux_ring.h @ 771ab22

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivelibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 771ab22 was 1871afc, checked in by Richard Sanger <rsangerarj@…>, 6 years ago

Add missing files

  • Property mode set to 100644
File size: 6.7 KB
Line 
1/*
2 * This file is part of libtrace
3 *
4 * Copyright (c) 2007,2008,2009,2010 The University of Waikato, Hamilton,
5 * New Zealand.
6 *
7 * Authors: Daniel Lawson
8 *          Perry Lorier
9 *          Shane Alcock
10 *          Richard Sanger
11 *
12 * All rights reserved.
13 *
14 * This code has been developed by the University of Waikato WAND
15 * research group. For further information please see http://www.wand.net.nz/
16 *
17 * libtrace is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * libtrace is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with libtrace; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
30 *
31 * $Id$
32 *
33 */
34
35/* This format module deals with using the Linux ring capture format.
36 *
37 * Linux ring is a LIVE capture format.
38 *
39 * This format also supports writing which will write packets out to the
40 * network as a form of packet replay. This should not be confused with the
41 * RT protocol which is intended to transfer captured packet records between
42 * RT-speaking programs.
43 */
44
45static int linuxring_init_input(libtrace_t *libtrace)
46{
47        init_input(libtrace);
48        FORMAT(libtrace->format_data)->format = TRACE_RT_DATA_LINUX_RING;
49        return 0;
50}
51
52static int linuxring_start_input(libtrace_t *libtrace)
53{
54        char error[2048];
55
56        /* We set the socket up the same and then convert it to PACKET_MMAP */
57        if(linuxnative_start_input(libtrace) != 0)
58                return -1;
59
60        strncpy(error, "No known error", 2048);
61
62        /* Make it a packetmmap */
63        if(socket_to_packetmmap(libtrace->uridata, PACKET_RX_RING,
64                        FORMAT(libtrace->format_data)->fd,
65                        &FORMAT(libtrace->format_data)->req,
66                        &FORMAT(libtrace->format_data)->rx_ring,
67                        &FORMAT(libtrace->format_data)->max_order,
68                        error) != 0){
69                trace_set_err(libtrace, TRACE_ERR_INIT_FAILED,
70                              "Initialisation of packet MMAP failed: %s",
71                              error);
72                close(DATAOUT(libtrace)->fd);
73                free(libtrace->format_data);
74                libtrace->format_data = NULL;
75                return -1;
76        }
77
78        return 0;
79}
80
81static int linuxring_pause_input(libtrace_t *libtrace)
82{
83        munmap(FORMAT(libtrace->format_data)->rx_ring, 
84                FORMAT(libtrace->format_data)->req.tp_block_size *
85                        FORMAT(libtrace->format_data)->req.tp_block_nr);
86        FORMAT(libtrace->format_data)->rx_ring = NULL;
87        return linuxnative_pause_input(libtrace);
88}
89
90
91
92#ifdef HAVE_NETPACKET_PACKET_H
93/* TODO: Fix this revision number */
94static void linuxring_help(void) {
95        printf("linuxring format module: $Revision: 1793 $\n");
96        printf("Supported input URIs:\n");
97        printf("\tring:eth0\n");
98        printf("\n");
99        printf("Supported output URIs:\n");
100        printf("\tring:eth0\n");
101        printf("\n");
102        return;
103}
104
105static struct libtrace_format_t linuxring = {
106        "ring",
107        "$Id$",
108        TRACE_FORMAT_LINUX_RING,
109        linuxnative_probe_filename,     /* probe filename */
110        NULL,                           /* probe magic */
111        linuxring_init_input,           /* init_input */
112        linuxnative_config_input,       /* config_input */
113        linuxring_start_input,  /* start_input */
114        linuxring_pause_input,  /* pause_input */
115        linuxring_init_output,  /* init_output */
116        NULL,                           /* config_output */
117        linuxring_start_output, /* start_ouput */
118        linuxnative_fin_input,          /* fin_input */
119        linuxring_fin_output,           /* fin_output */
120        linuxring_read_packet,  /* read_packet */
121        linuxring_prepare_packet,       /* prepare_packet */
122        linuxring_fin_packet,                           /* fin_packet */
123        linuxring_write_packet, /* write_packet */
124        linuxring_get_link_type,        /* get_link_type */
125        linuxring_get_direction,        /* get_direction */
126        linuxring_set_direction,        /* set_direction */
127        NULL,                           /* get_erf_timestamp */
128        linuxring_get_timeval,  /* get_timeval */
129        linuxring_get_timespec, /* get_timespec */
130        NULL,                           /* get_seconds */
131        NULL,                           /* seek_erf */
132        NULL,                           /* seek_timeval */
133        NULL,                           /* seek_seconds */
134        linuxring_get_capture_length,   /* get_capture_length */
135        linuxring_get_wire_length,      /* get_wire_length */
136        linuxring_get_framing_length,   /* get_framing_length */
137        linuxring_set_capture_length,   /* set_capture_length */
138        NULL,                           /* get_received_packets */
139        linuxnative_get_filtered_packets,/* get_filtered_packets */
140        linuxnative_get_dropped_packets,/* get_dropped_packets */
141        linuxnative_get_captured_packets,/* get_captured_packets */
142        linuxnative_get_fd,             /* get_fd */
143        linuxring_event,                /* trace_event */
144        linuxring_help,         /* help */
145        NULL,                           /* next pointer */
146        {true, -1},              /* Live, no thread limit */
147        linuxnative_pstart_input,                       /* pstart_input */
148        linuxring_pread_packets,                        /* pread_packets */
149        linuxnative_ppause_input,                       /* ppause */
150        linuxnative_fin_input,                          /* p_fin */
151        linuxnative_pconfig_input,
152        linux_pregister_thread,
153        NULL
154};
155#else
156static void linuxring_help(void) {
157        printf("linuxring format module: $Revision: 1793 $\n");
158        printf("Not supported on this host\n");
159}
160
161static struct libtrace_format_t linuxring = {
162        "ring",
163        "$Id$",
164        TRACE_FORMAT_LINUX_RING,
165        NULL,                           /* probe filename */
166        NULL,                           /* probe magic */
167        NULL,                           /* init_input */
168        NULL,                           /* config_input */
169        NULL,                           /* start_input */
170        NULL,                           /* pause_input */
171        NULL,                           /* init_output */
172        NULL,                           /* config_output */
173        NULL,                           /* start_ouput */
174        NULL,                           /* fin_input */
175        NULL,                           /* fin_output */
176        NULL,                           /* read_packet */
177        linuxring_prepare_packet,       /* prepare_packet */
178        NULL,                           /* fin_packet */
179        NULL,                           /* write_packet */
180        linuxring_get_link_type,        /* get_link_type */
181        linuxring_get_direction,        /* get_direction */
182        linuxring_set_direction,        /* set_direction */
183        NULL,                           /* get_erf_timestamp */
184        linuxring_get_timeval,          /* get_timeval */
185        linuxring_get_timespec,         /* get_timespec */
186        NULL,                           /* get_seconds */
187        NULL,                           /* seek_erf */
188        NULL,                           /* seek_timeval */
189        NULL,                           /* seek_seconds */
190        linuxring_get_capture_length,   /* get_capture_length */
191        linuxring_get_wire_length,      /* get_wire_length */
192        linuxring_get_framing_length,   /* get_framing_length */
193        linuxring_set_capture_length,   /* set_capture_length */
194        NULL,                           /* get_received_packets */
195        linuxnative_get_filtered_packets,/* get_filtered_packets */
196        linuxnative_get_dropped_packets,/* get_dropped_packets */
197        linuxnative_get_captured_packets,/* get_captured_packets */
198        linuxnative_get_fd,             /* get_fd */
199        NULL,                           /* trace_event */
200        linuxring_help,                 /* help */
201        NULL,                   /* next pointer */
202        NON_PARALLEL(true)
203};
204#endif
205
206/* TODO: We should try to prefer the ring format over the native format
207 * if the user only specifies the interface (eth0 etc). */
208void linuxring_constructor(void)
209{
210        register_format(&linuxring);
211}
Note: See TracBrowser for help on using the repository browser.