blob: 5889a793401132a48aaefc1c16332f66f360220a [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/*
16 * pcap.h: libpcap packet capture format
17 *
18 * Copyright (c) 2008 Eliot Dresselhaus
19 *
20 * Permission is hereby granted, free of charge, to any person obtaining
21 * a copy of this software and associated documentation files (the
22 * "Software"), to deal in the Software without restriction, including
23 * without limitation the rights to use, copy, modify, merge, publish,
24 * distribute, sublicense, and/or sell copies of the Software, and to
25 * permit persons to whom the Software is furnished to do so, subject to
26 * the following conditions:
27 *
28 * The above copyright notice and this permission notice shall be
29 * included in all copies or substantial portions of the Software.
30 *
31 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38 */
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -070039/**
40 * @file
41 * @brief PCAP utility definitions
42 */
Dave Barach3ae28732018-11-16 17:19:00 -050043#ifndef included_vppinfra_pcap_h
44#define included_vppinfra_pcap_h
Ed Warnickecb9cada2015-12-08 15:45:58 -070045
Dave Barach3ae28732018-11-16 17:19:00 -050046#include <vppinfra/types.h>
47#include <vppinfra/cache.h>
48#include <vppinfra/mem.h>
49#include <vppinfra/lock.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070050
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -070051/**
52 * @brief Packet types supported by PCAP
53 *
Dave Barach3ae28732018-11-16 17:19:00 -050054 * These codes end up in the pcap file header.
55 * If you decide to build a wireshark dissector,
56 * you'll need to know that these codes are mapped
57 * through the pcap_to_wtap_map[] array in .../wiretap/pcap-common.c.
58 *
59 * For example:
60 *
61 * { 160, WTAP_ENCAP_USER13 },
62 *
63 * A file with (vpp) packet type PCAP_PACKET_TYPE_user13
64 * aka 160, will need a top-level dissector registered to
65 * deal with WTAP_ENCAP_USER13 [=58].
66 *
67 * Something like so:
68 *
69 * dissector_add_uint("wtap_encap", WTAP_ENCAP_USER13, vpp_dissector_handle);
70 *
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -070071 * null 0
72 * ethernet 1
73 * ppp 9
74 * ip 12
75 * hdlc 104
Dave Barach3ae28732018-11-16 17:19:00 -050076 * user0 147 ... user15 162
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -070077 */
78#define foreach_vnet_pcap_packet_type \
Ed Warnickecb9cada2015-12-08 15:45:58 -070079 _ (null, 0) \
80 _ (ethernet, 1) \
81 _ (ppp, 9) \
82 _ (ip, 12) \
Dave Barach3ae28732018-11-16 17:19:00 -050083 _ (hdlc, 104) \
84 _ (user0, 147) \
85 _ (user1, 148) \
86 _ (user2, 149) \
87 _ (user3, 150) \
88 _ (user4, 151) \
89 _ (user5, 152) \
90 _ (user6, 153) \
91 _ (user7, 154) \
92 _ (user8, 155) \
93 _ (user9, 156) \
94 _ (user10, 157) \
95 _ (user11, 158) \
96 _ (user12, 159) \
97 _ (user13, 160) \
98 _ (user14, 161) \
99 _ (user15, 162)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700100
sharath reddy1b0c9832017-11-29 20:08:11 +0530101typedef enum
102{
Ed Warnickecb9cada2015-12-08 15:45:58 -0700103#define _(f,n) PCAP_PACKET_TYPE_##f = (n),
104 foreach_vnet_pcap_packet_type
105#undef _
106} pcap_packet_type_t;
107
108#define foreach_pcap_file_header \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700109 /** 0xa1b2c3d4 host byte order. \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700110 0xd4c3b2a1 => need to byte swap everything. */ \
111 _ (u32, magic) \
112 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700113 /** Currently major 2 minor 4. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700114 _ (u16, major_version) \
115 _ (u16, minor_version) \
116 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700117 /** 0 for GMT. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700118 _ (u32, time_zone) \
119 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700120 /** Accuracy of timestamps. Typically set to 0. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700121 _ (u32, sigfigs) \
122 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700123 /** Size of largest packet in file. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124 _ (u32, max_packet_size_in_bytes) \
125 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700126 /** One of vnet_pcap_packet_type_t. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700127 _ (u32, packet_type)
128
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700129/** File header struct */
sharath reddy1b0c9832017-11-29 20:08:11 +0530130typedef struct
131{
Ed Warnickecb9cada2015-12-08 15:45:58 -0700132#define _(t, f) t f;
133 foreach_pcap_file_header
134#undef _
135} pcap_file_header_t;
136
137#define foreach_pcap_packet_header \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700138 /** Time stamp in seconds */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700139 _ (u32, time_in_sec) \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700140 /** Time stamp in microseconds. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700141 _ (u32, time_in_usec) \
142 \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700143 /** Number of bytes stored in file. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700144 _ (u32, n_packet_bytes_stored_in_file) \
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700145 /** Number of bytes in actual packet. */ \
Ed Warnickecb9cada2015-12-08 15:45:58 -0700146 _ (u32, n_bytes_in_packet)
147
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700148/** Packet header. */
sharath reddy1b0c9832017-11-29 20:08:11 +0530149typedef struct
150{
Ed Warnickecb9cada2015-12-08 15:45:58 -0700151#define _(t, f) t f;
152 foreach_pcap_packet_header
153#undef _
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700154 /** Packet data follows. */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700155 u8 data[0];
156} pcap_packet_header_t;
157
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700158/**
159 * @brief PCAP main state data structure
160 */
sharath reddy1b0c9832017-11-29 20:08:11 +0530161typedef struct
162{
Dave Barachf91080c2018-07-26 12:27:27 -0400163 /** spinlock to protect e.g. pcap_data */
164 clib_spinlock_t lock;
165
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700166 /** File name of pcap output. */
sharath reddy1b0c9832017-11-29 20:08:11 +0530167 char *file_name;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700168
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700169 /** Number of packets to capture. */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700170 u32 n_packets_to_capture;
171
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700172 /** Packet type */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700173 pcap_packet_type_t packet_type;
174
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700175 /** Number of packets currently captured. */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700176 u32 n_packets_captured;
177
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700178 /** flags */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700179 u32 flags;
180#define PCAP_MAIN_INIT_DONE (1 << 0)
181
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700182 /** File descriptor for reading/writing. */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700183 int file_descriptor;
184
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700185 /** Bytes written */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700186 u32 n_pcap_data_written;
187
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700188 /** Vector of pcap data. */
sharath reddy1b0c9832017-11-29 20:08:11 +0530189 u8 *pcap_data;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700190
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700191 /** Packets read from file. */
sharath reddy1b0c9832017-11-29 20:08:11 +0530192 u8 **packets_read;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700193
Dave Barach78c56892018-05-16 11:34:35 -0400194 /** Timestamps */
195 u64 *timestamps;
196
Keith Burns (alagalah)07203af2016-08-25 13:37:37 -0700197 /** Min/Max Packet bytes */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700198 u32 min_packet_bytes, max_packet_bytes;
199} pcap_main_t;
200
Dave Barach3ae28732018-11-16 17:19:00 -0500201#endif /* included_vppinfra_pcap_h */
sharath reddy1b0c9832017-11-29 20:08:11 +0530202
203/*
204 * fd.io coding-style-patch-verification: ON
205 *
206 * Local Variables:
207 * eval: (c-set-style "gnu")
208 * End:
209 */