FD.io VPP  v16.09
Vector Packet Processing
pg.h
Go to the documentation of this file.
1 /*
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  * pg.h: VLIB packet generator
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  */
39 
40 #ifndef included_vlib_pg_h
41 #define included_vlib_pg_h
42 
43 #include <vlib/vlib.h> /* for VLIB_N_RX_TX */
44 #include <vnet/pg/edit.h>
45 #include <vppinfra/fifo.h> /* for buffer_fifo */
46 #include <vnet/unix/pcap.h>
47 #include <vnet/interface.h>
48 
50 
51 struct pg_main_t;
52 struct pg_stream_t;
53 
54 typedef struct pg_edit_group_t {
55  /* Edits in this group. */
57 
58  /* Vector of non-fixed edits for this group. */
60 
61  /* Fixed edits for this group. */
64 
65  /* Byte offset where packet data begins. */
67 
68  /* Number of packet bytes for this edit group. */
70 
71  /* Function to perform miscellaneous edits (e.g. set IP checksum, ...). */
72  void (* edit_function) (struct pg_main_t * pg,
73  struct pg_stream_t * s,
74  struct pg_edit_group_t * g,
75  u32 * buffers,
76  u32 n_buffers);
77 
78  /* Opaque data for edit function's use. */
81 
82 /* Packets are made of multiple buffers chained together.
83  This struct keeps track of data per-chain index. */
84 typedef struct {
85  /* Vector of buffer edits for this stream and buffer index. */
87 
88  /* Buffers pre-initialized with fixed buffer data for this stream. */
90 
91  /* Buffer free list for this buffer index in stream. */
94 
95 typedef struct pg_stream_t {
96  /* Stream name. */
97  u8 * name;
98 
100 
101  /* Stream is currently enabled. */
102 #define PG_STREAM_FLAGS_IS_ENABLED (1 << 0)
103 #define PG_STREAM_FLAGS_DISABLE_BUFFER_RECYCLE (1 << 1)
104 
105  /* Edit groups are created by each protocol level (e.g. ethernet,
106  ip4, tcp, ...). */
108 
110 
111  /* Min/max packet size. */
112  u32 min_packet_bytes, max_packet_bytes;
113 
114  /* Vector of non-fixed edits for this stream.
115  All fixed edits are performed and placed into fixed_packet_data. */
117 
118  /* Packet data with all fixed edits performed.
119  All packets in stream are initialized according with this data.
120  Mask specifies which bits of packet data are covered by fixed edits. */
122 
123  /* Size to use for buffers. 0 means use buffers big enough
124  for max_packet_bytes. */
126 
127  /* Last packet length if packet size edit type is increment. */
129 
130  /* Index into main interface pool for this stream. */
132 
133  /* Interface used to mark packets for this stream. May be different
134  than hw/sw index from pg main interface pool. They will be
135  different if this stream is being used generate buffers as if
136  they were received on a non-pg interface. For example, suppose you
137  are trying to test vlan code and you want to generate buffers that
138  appear to come from an ethernet interface. */
139  u32 sw_if_index[VLIB_N_RX_TX];
140 
141  /* Node where stream's buffers get put. */
143 
144  /* Output next index to reach output node from stream input node. */
146 
148 
149  /* Number of packets currently generated. */
151 
152  /* Stream is disabled when packet limit is reached.
153  Zero means no packet limit. */
155 
156  /* Rate for this stream in packets/second.
157  Zero means unlimited rate. */
159 
161 
163 
165 
168 } pg_stream_t;
169 
170 always_inline void
172 {
173  vec_free (bi->edits);
175 }
176 
177 always_inline void
179 {
180  pg_edit_t * e;
181  vec_foreach (e, g->edits)
182  pg_edit_free (e);
183  vec_free (g->edits);
186 }
187 
188 always_inline void
190 {
191  pg_edit_group_t * g;
192  pg_edit_t * e;
194  pg_edit_free (e);
196  vec_foreach (g, s->edit_groups)
197  pg_edit_group_free (g);
198  vec_free (s->edit_groups);
201  vec_free (s->name);
202 
203  {
204  pg_buffer_index_t * bi;
205  vec_foreach (bi, s->buffer_indices)
208  }
209 }
210 
211 always_inline int
213 { return (s->flags & PG_STREAM_FLAGS_IS_ENABLED) != 0; }
214 
217 { return vec_elt_at_index (s->edit_groups, group_index); }
218 
219 always_inline void *
221  int n_edit_bytes,
222  int n_packet_bytes,
223  u32 * group_index)
224 {
225  pg_edit_group_t * g;
226  int n_edits;
227 
228  vec_add2 (s->edit_groups, g, 1);
229  if (group_index)
230  *group_index = g - s->edit_groups;
231 
232  ASSERT (n_edit_bytes % sizeof (pg_edit_t) == 0);
233  n_edits = n_edit_bytes / sizeof (pg_edit_t);
234  vec_resize (g->edits, n_edits);
235 
237 
238  return g->edits;
239 }
240 
241 always_inline void *
242 pg_add_edits (pg_stream_t * s, int n_edit_bytes, int n_packet_bytes,
243  u32 group_index)
244 {
245  pg_edit_group_t * g = pg_stream_get_group (s, group_index);
246  pg_edit_t * e;
247  int n_edits;
248  ASSERT (n_edit_bytes % sizeof (pg_edit_t) == 0);
249  n_edits = n_edit_bytes / sizeof (pg_edit_t);
250  vec_add2 (g->edits, e, n_edits);
252  return e;
253 }
254 
255 always_inline void *
257 {
258  pg_edit_group_t * g = pg_stream_get_group (s, group_index);
259  return g->edits;
260 }
261 
262 /* Number of bytes for all groups >= given group. */
265 {
266  pg_edit_group_t * g;
267  uword n_bytes = 0;
268 
269  for (g = s->edit_groups + group_index; g < vec_end (s->edit_groups); g++)
270  n_bytes += g->n_packet_bytes;
271  return n_bytes;
272 }
273 
274 always_inline void
276 {
277  uword i = vec_len (s->edit_groups) - 1;
279 
280  pg_edit_group_free (g);
281  memset (g, 0, sizeof (g[0]));
282  _vec_len (s->edit_groups) = i;
283 }
284 
285 typedef struct {
286  /* VLIB interface indices. */
287  u32 hw_if_index, sw_if_index;
288 
289  /* Identifies stream for this interface. */
291 
295 
296 /* Per VLIB node data. */
297 typedef struct {
298  /* Parser function indexed by node index. */
300 } pg_node_t;
301 
302 typedef struct pg_main_t {
303  /* Back pointer to main structure. */
305 
306  /* Pool of streams. */
308 
309  /* Bitmap indicating which streams are currently enabled. */
311 
312  /* Hash mapping name -> stream index. */
314 
315  /* Pool of interfaces. */
318 
319  /* Per VLIB node information. */
321 } pg_main_t;
322 
323 /* Global main structure. */
324 extern pg_main_t pg_main;
325 
326 /* Global node. */
328 
329 /* Buffer generator input, output node functions. */
331 
332 /* Stream add/delete. */
333 void pg_stream_del (pg_main_t * pg, uword index);
334 void pg_stream_add (pg_main_t * pg, pg_stream_t * s_init);
335 
336 /* Enable/disable stream. */
337 void pg_stream_enable_disable (pg_main_t * pg, pg_stream_t * s, int is_enable);
338 
339 /* Find/create free packet-generator interface index. */
340 u32 pg_interface_add_or_get (pg_main_t * pg, uword stream_index);
341 
343 pg_get_node (uword node_index)
344 {
345  pg_main_t * pg = &pg_main;
346  vec_validate (pg->nodes, node_index);
347  return pg->nodes + node_index;
348 }
349 
351  u32 group_index,
352  void * fixed_packet_data,
353  void * fixed_packet_data_mask);
354 
355 void pg_enable_disable (u32 stream_index, int is_enable);
356 
357 typedef struct {
364 
366 
367 #endif /* included_vlib_pg_h */
u32 sw_if_index
Definition: pg.h:287
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:396
Definition: edit.h:63
static int pg_stream_is_enabled(pg_stream_t *s)
Definition: pg.h:212
u32 next_index
Definition: pg.h:145
uword( vlib_node_function_t)(struct vlib_main_t *vm, struct vlib_node_runtime_t *node, struct vlib_frame_t *frame)
Definition: node.h:54
u64 n_packets_limit
Definition: pg.h:154
void pg_stream_add(pg_main_t *pg, pg_stream_t *s_init)
Definition: stream.c:343
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:343
uword( unformat_function_t)(unformat_input_t *input, va_list *args)
Definition: format.h:231
u8 * fixed_packet_data
Definition: pg.h:121
static void * pg_get_edit_group(pg_stream_t *s, u32 group_index)
Definition: pg.h:256
a
Definition: bitmap.h:516
Definition: pg.h:302
pg_edit_group_t * edit_groups
Definition: pg.h:107
PCAP utility definitions.
pg_edit_type_t
Definition: edit.h:46
uword * stream_index_by_name
Definition: pg.h:313
struct _vlib_node_registration vlib_node_registration_t
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:521
u32 hw_if_index
Definition: pg.h:358
pg_buffer_index_t * buffer_indices
Definition: pg.h:164
struct _vnet_device_class vnet_device_class_t
pg_edit_type_t packet_size_edit_type
Definition: pg.h:109
void pg_stream_del(pg_main_t *pg, uword index)
Definition: stream.c:433
u8 * fixed_packet_data_mask
Definition: pg.h:121
u32 start_byte_offset
Definition: pg.h:66
static pg_edit_group_t * pg_stream_get_group(pg_stream_t *s, u32 group_index)
Definition: pg.h:216
static pg_node_t * pg_get_node(uword node_index)
Definition: pg.h:343
PCAP main state data structure.
Definition: pcap.h:122
static void * pg_add_edits(pg_stream_t *s, int n_edit_bytes, int n_packet_bytes, u32 group_index)
Definition: pg.h:242
#define always_inline
Definition: clib.h:84
u8 * fixed_packet_data_mask
Definition: pg.h:63
pg_edit_t * edits
Definition: pg.h:86
u32 n_packet_bytes
Definition: pg.h:69
u8 * fixed_packet_data
Definition: pg.h:62
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
unsigned long u64
Definition: types.h:89
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
Definition: vec.h:201
#define vec_end(v)
End (last data address) of vector.
static void * pg_create_edit_group(pg_stream_t *s, int n_edit_bytes, int n_packet_bytes, u32 *group_index)
Definition: pg.h:220
#define PG_STREAM_FLAGS_IS_ENABLED
Definition: pg.h:102
uword * if_index_by_if_id
Definition: pg.h:317
u8 * pcap_file_name
Definition: pg.h:361
clib_error_t * pg_capture(pg_capture_args_t *a)
Definition: cli.c:74
pg_main_t pg_main
Definition: init.c:44
u32 buffer_bytes
Definition: pg.h:125
void pg_edit_group_get_fixed_packet_data(pg_stream_t *s, u32 group_index, void *fixed_packet_data, void *fixed_packet_data_mask)
Definition: stream.c:283
f64 packet_accumulator
Definition: pg.h:162
u32 last_increment_packet_size
Definition: pg.h:128
u32 pg_if_index
Definition: pg.h:131
u32 current_replay_packet_index
Definition: pg.h:167
pg_edit_t * non_fixed_edits
Definition: pg.h:59
u8 * name
Definition: pg.h:97
static void pg_stream_free(pg_stream_t *s)
Definition: pg.h:189
pcap_main_t pcap_main
Definition: pg.h:292
vlib_node_registration_t pg_input_node
(constructor) VLIB_REGISTER_NODE (pg_input_node)
Definition: input.c:1736
vlib_node_function_t pg_output
Definition: pg.h:330
pg_node_t * nodes
Definition: pg.h:320
u32 pg_interface_add_or_get(pg_main_t *pg, uword stream_index)
Definition: stream.c:146
u8 * pcap_file_name
Definition: pg.h:293
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:300
u32 min_packet_bytes
Definition: pg.h:112
static uword pg_edit_group_n_bytes(pg_stream_t *s, u32 group_index)
Definition: pg.h:264
struct pg_stream_t pg_stream_t
unformat_function_t * unformat_edit
Definition: pg.h:299
vlib_node_function_t pg_input
Definition: pg.h:330
pg_edit_t * non_fixed_edits
Definition: pg.h:116
u8 ** replay_packet_templates
Definition: pg.h:166
pg_stream_t * streams
Definition: pg.h:307
#define ASSERT(truth)
vlib_main_t * vlib_main
Definition: pg.h:304
unsigned int u32
Definition: types.h:88
u32 free_list_index
Definition: pg.h:92
static void pg_free_edit_group(pg_stream_t *s)
Definition: pg.h:275
uword * enabled_streams
Definition: pg.h:310
void pg_stream_enable_disable(pg_main_t *pg, pg_stream_t *s, int is_enable)
Definition: stream.c:45
uword edit_function_opaque
Definition: pg.h:79
#define clib_fifo_free(f)
Definition: fifo.h:257
Definition: pg.h:95
u64 uword
Definition: types.h:112
static void pg_buffer_index_free(pg_buffer_index_t *bi)
Definition: pg.h:171
u32 node_index
Definition: pg.h:142
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
double f64
Definition: types.h:142
void(* edit_function)(struct pg_main_t *pg, struct pg_stream_t *s, struct pg_edit_group_t *g, u32 *buffers, u32 n_buffers)
Definition: pg.h:72
u32 id
Definition: pg.h:290
unsigned char u8
Definition: types.h:56
struct pg_edit_group_t pg_edit_group_t
u32 if_id
Definition: pg.h:147
pg_edit_t * edits
Definition: pg.h:56
u32 dev_instance
Definition: pg.h:359
f64 rate_packets_per_second
Definition: pg.h:158
u64 n_packets_generated
Definition: pg.h:150
u8 is_enabled
Definition: pg.h:360
#define vec_foreach(var, vec)
Vector iterator.
static void pg_edit_free(pg_edit_t *e)
Definition: edit.h:89
vnet_device_class_t pg_dev_class
struct pg_main_t pg_main_t
f64 time_last_generate
Definition: pg.h:160
Definition: pg.h:297
pg_interface_t * interfaces
Definition: pg.h:316
static void pg_edit_group_free(pg_edit_group_t *g)
Definition: pg.h:178
void pg_enable_disable(u32 stream_index, int is_enable)
Definition: cli.c:55
u32 flags
Definition: pg.h:99
u32 * buffer_fifo
Definition: pg.h:89