FD.io VPP  v20.01-48-g3e0dafb74
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 <vppinfra/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 {
56  /* Edits in this group. */
58 
59  /* Vector of non-fixed edits for this group. */
61 
62  /* Fixed edits for this group. */
65 
66  /* Byte offset where packet data begins. */
68 
69  /* Number of packet bytes for this edit group. */
71 
72  /* Function to perform miscellaneous edits (e.g. set IP checksum, ...). */
73  void (*edit_function) (struct pg_main_t * pg,
74  struct pg_stream_t * s,
75  struct pg_edit_group_t * g,
76  u32 * buffers, 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 {
86  /* Vector of buffer edits for this stream and buffer index. */
88 
89  /* Buffers pre-initialized with fixed buffer data for this stream. */
91 
93 
94 typedef struct pg_stream_t
95 {
96  /* Stream name. */
97  u8 *name;
98 
100 
101  /* Stream is currently enabled. */
102 #define PG_STREAM_FLAGS_IS_ENABLED (1 << 0)
103 
104  /* Edit groups are created by each protocol level (e.g. ethernet,
105  ip4, tcp, ...). */
107 
109 
110  /* Min/max packet size. */
111  u32 min_packet_bytes, max_packet_bytes;
112 
113  /* Vector of non-fixed edits for this stream.
114  All fixed edits are performed and placed into fixed_packet_data. */
116 
117  /* Packet data with all fixed edits performed.
118  All packets in stream are initialized according with this data.
119  Mask specifies which bits of packet data are covered by fixed edits. */
121 
122  /* Size to use for buffers. 0 means use buffers big enough
123  for max_packet_bytes. */
125 
126  /* Last packet length if packet size edit type is increment. */
128 
129  /* Index into main interface pool for this stream. */
131 
132  /* Interface used to mark packets for this stream. May be different
133  than hw/sw index from pg main interface pool. They will be
134  different if this stream is being used generate buffers as if
135  they were received on a non-pg interface. For example, suppose you
136  are trying to test vlan code and you want to generate buffers that
137  appear to come from an ethernet interface. */
139 
140  /* Node where stream's buffers get put. */
142 
143  /* Worker thread index */
145 
146  /* Output next index to reach output node from stream input node. */
148 
150 
151  /* Number of packets currently generated. */
153 
154  /* Stream is disabled when packet limit is reached.
155  Zero means no packet limit. */
157 
158  /* Only generate up to n_max_frame per frame. */
160 
161  /* Rate for this stream in packets/second.
162  Zero means unlimited rate. */
164 
166 
168 
170 
174 } pg_stream_t;
175 
176 always_inline void
178 {
179  vec_free (bi->edits);
181 }
182 
183 always_inline void
185 {
186  pg_edit_t *e;
187  vec_foreach (e, g->edits) pg_edit_free (e);
188  vec_free (g->edits);
191 }
192 
193 always_inline void
195 {
196  int i;
197  pg_edit_group_t *g;
198  pg_edit_t *e;
202  vec_free (s->edit_groups);
205  vec_free (s->name);
206  for (i = 0; i < vec_len (s->replay_packet_templates); i++)
210 
211  {
212  pg_buffer_index_t *bi;
215  }
216 }
217 
218 always_inline int
220 {
221  return (s->flags & PG_STREAM_FLAGS_IS_ENABLED) != 0;
222 }
223 
226 {
227  return vec_elt_at_index (s->edit_groups, group_index);
228 }
229 
230 always_inline void *
232  int n_edit_bytes, int n_packet_bytes, u32 * group_index)
233 {
234  pg_edit_group_t *g;
235  int n_edits;
236 
237  vec_add2 (s->edit_groups, g, 1);
238  if (group_index)
239  *group_index = g - s->edit_groups;
240 
241  ASSERT (n_edit_bytes % sizeof (pg_edit_t) == 0);
242  n_edits = n_edit_bytes / sizeof (pg_edit_t);
243  vec_resize (g->edits, n_edits);
244 
246 
247  return g->edits;
248 }
249 
250 always_inline void *
251 pg_add_edits (pg_stream_t * s, int n_edit_bytes, int n_packet_bytes,
252  u32 group_index)
253 {
254  pg_edit_group_t *g = pg_stream_get_group (s, group_index);
255  pg_edit_t *e;
256  int n_edits;
257  ASSERT (n_edit_bytes % sizeof (pg_edit_t) == 0);
258  n_edits = n_edit_bytes / sizeof (pg_edit_t);
259  vec_add2 (g->edits, e, n_edits);
261  return e;
262 }
263 
264 always_inline void *
266 {
267  pg_edit_group_t *g = pg_stream_get_group (s, group_index);
268  return g->edits;
269 }
270 
271 /* Number of bytes for all groups >= given group. */
274 {
275  pg_edit_group_t *g;
276  uword n_bytes = 0;
277 
278  for (g = s->edit_groups + group_index; g < vec_end (s->edit_groups); g++)
279  n_bytes += g->n_packet_bytes;
280  return n_bytes;
281 }
282 
283 always_inline void
285 {
286  uword i = vec_len (s->edit_groups) - 1;
288 
289  pg_edit_group_free (g);
290  clib_memset (g, 0, sizeof (g[0]));
291  _vec_len (s->edit_groups) = i;
292 }
293 
294 typedef struct
295 {
296  /* TX lock */
297  volatile u32 *lockp;
298 
299  /* VLIB interface indices. */
300  u32 hw_if_index, sw_if_index;
301 
302  /* Identifies stream for this interface. */
304 
310 
311 /* Per VLIB node data. */
312 typedef struct
313 {
314  /* Parser function indexed by node index. */
316 } pg_node_t;
317 
318 typedef struct pg_main_t
319 {
320  /* Pool of streams. */
322 
323  /* Bitmap indicating which streams are currently enabled. */
325 
326  /* Hash mapping name -> stream index. */
328 
329  /* Pool of interfaces. */
332 
333  /* Vector of buffer indices for use in pg_stream_fill_replay, per thread */
335 
336  /* Per VLIB node information. */
338 } pg_main_t;
339 
340 /* Global main structure. */
341 extern pg_main_t pg_main;
342 
343 /* Global node. */
345 
346 /* Buffer generator input, output node functions. */
348 
349 /* Stream add/delete. */
350 void pg_stream_del (pg_main_t * pg, uword index);
351 void pg_stream_add (pg_main_t * pg, pg_stream_t * s_init);
352 void pg_stream_change (pg_main_t * pg, pg_stream_t * s);
353 
354 /* Enable/disable stream. */
356  int is_enable);
357 
358 /* Find/create free packet-generator interface index. */
359 u32 pg_interface_add_or_get (pg_main_t * pg, uword stream_index,
360  u8 gso_enabled, u32 gso_size);
361 
363 pg_get_node (uword node_index)
364 {
365  pg_main_t *pg = &pg_main;
366  vec_validate (pg->nodes, node_index);
367  return pg->nodes + node_index;
368 }
369 
371  u32 group_index,
372  void *fixed_packet_data,
373  void *fixed_packet_data_mask);
374 
375 void pg_enable_disable (u32 stream_index, int is_enable);
376 
377 typedef struct
378 {
385 
387 
388 typedef struct
389 {
392 }
394 
395 #endif /* included_vlib_pg_h */
396 
397 /*
398  * fd.io coding-style-patch-verification: ON
399  *
400  * Local Variables:
401  * eval: (c-set-style "gnu")
402  * End:
403  */
u32 sw_if_index
Definition: pg.h:300
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:440
Definition: edit.h:64
static int pg_stream_is_enabled(pg_stream_t *s)
Definition: pg.h:219
u32 next_index
Definition: pg.h:147
u64 n_packets_limit
Definition: pg.h:156
void pg_stream_add(pg_main_t *pg, pg_stream_t *s_init)
Definition: stream.c:392
u8 * fixed_packet_data
Definition: pg.h:120
static void * pg_get_edit_group(pg_stream_t *s, u32 group_index)
Definition: pg.h:265
a
Definition: bitmap.h:538
vlib_buffer_t buffer
Definition: pg.h:390
Definition: pg.h:318
unsigned long u64
Definition: types.h:89
pg_edit_group_t * edit_groups
Definition: pg.h:106
PCAP utility definitions.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
pg_edit_type_t
Definition: edit.h:46
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:73
uword * stream_index_by_name
Definition: pg.h:327
u32 worker_index
Definition: pg.h:144
u32 n_max_frame
Definition: pg.h:159
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:561
int i
u32 buffer_index
Definition: pg.h:391
u32 hw_if_index
Definition: pg.h:379
pg_buffer_index_t * buffer_indices
Definition: pg.h:169
u32 pg_interface_add_or_get(pg_main_t *pg, uword stream_index, u8 gso_enabled, u32 gso_size)
Definition: stream.c:182
struct _vnet_device_class vnet_device_class_t
pg_edit_type_t packet_size_edit_type
Definition: pg.h:108
void pg_stream_del(pg_main_t *pg, uword index)
Definition: stream.c:476
unsigned char u8
Definition: types.h:56
u8 * fixed_packet_data_mask
Definition: pg.h:120
u32 start_byte_offset
Definition: pg.h:67
static pg_edit_group_t * pg_stream_get_group(pg_stream_t *s, u32 group_index)
Definition: pg.h:225
double f64
Definition: types.h:142
static pg_node_t * pg_get_node(uword node_index)
Definition: pg.h:363
u32 gso_size
Definition: pg.h:306
PCAP main state data structure.
Definition: pcap.h:156
static void * pg_add_edits(pg_stream_t *s, int n_edit_bytes, int n_packet_bytes, u32 group_index)
Definition: pg.h:251
vl_api_interface_index_t sw_if_index
Definition: gre.api:59
u8 * fixed_packet_data_mask
Definition: pg.h:64
pg_edit_t * edits
Definition: pg.h:87
u32 n_packet_bytes
Definition: pg.h:70
u8 * fixed_packet_data
Definition: pg.h:63
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
Definition: vec.h:243
unsigned int u32
Definition: types.h:88
#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:231
#define PG_STREAM_FLAGS_IS_ENABLED
Definition: pg.h:102
uword * if_index_by_if_id
Definition: pg.h:331
u8 * pcap_file_name
Definition: pg.h:382
clib_error_t * pg_capture(pg_capture_args_t *a)
Definition: cli.c:81
pg_main_t pg_main
Definition: init.c:44
u32 buffer_bytes
Definition: pg.h:124
volatile u32 * lockp
Definition: pg.h:297
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:333
f64 packet_accumulator
Definition: pg.h:167
u32 last_increment_packet_size
Definition: pg.h:127
u32 pg_if_index
Definition: pg.h:130
u32 current_replay_packet_index
Definition: pg.h:173
pg_edit_t * non_fixed_edits
Definition: pg.h:60
u32 ** replay_buffers_by_thread
Definition: pg.h:334
u8 * name
Definition: pg.h:97
static void pg_stream_free(pg_stream_t *s)
Definition: pg.h:194
pcap_main_t pcap_main
Definition: pg.h:307
vlib_node_registration_t pg_input_node
(constructor) VLIB_REGISTER_NODE (pg_input_node)
Definition: input.c:1801
#define always_inline
Definition: ipsec.h:28
vlib_node_function_t pg_output
Definition: pg.h:347
pg_node_t * nodes
Definition: pg.h:337
uword() unformat_function_t(unformat_input_t *input, va_list *args)
Definition: format.h:233
uword ** enabled_streams
Definition: pg.h:324
u8 * pcap_file_name
Definition: pg.h:308
u8 gso_enabled
Definition: pg.h:305
u64 * replay_packet_timestamps
Definition: pg.h:172
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:342
u32 min_packet_bytes
Definition: pg.h:111
static uword pg_edit_group_n_bytes(pg_stream_t *s, u32 group_index)
Definition: pg.h:273
struct pg_stream_t pg_stream_t
void pg_stream_change(pg_main_t *pg, pg_stream_t *s)
Definition: stream.c:496
unformat_function_t * unformat_edit
Definition: pg.h:315
vlib_node_function_t pg_input
Definition: pg.h:347
pg_edit_t * non_fixed_edits
Definition: pg.h:115
u8 ** replay_packet_templates
Definition: pg.h:171
pg_stream_t * streams
Definition: pg.h:321
#define ASSERT(truth)
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
static void pg_free_edit_group(pg_stream_t *s)
Definition: pg.h:284
void pg_stream_enable_disable(pg_main_t *pg, pg_stream_t *s, int is_enable)
Definition: stream.c:49
uword edit_function_opaque
Definition: pg.h:79
#define clib_fifo_free(f)
Definition: fifo.h:257
Definition: pg.h:94
struct _vlib_node_registration vlib_node_registration_t
static void pg_buffer_index_free(pg_buffer_index_t *bi)
Definition: pg.h:177
u32 node_index
Definition: pg.h:141
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u32 id
Definition: pg.h:303
struct pg_edit_group_t pg_edit_group_t
VLIB buffer representation.
Definition: buffer.h:102
u32 if_id
Definition: pg.h:149
u64 uword
Definition: types.h:112
pg_edit_t * edits
Definition: pg.h:57
u32 dev_instance
Definition: pg.h:380
f64 rate_packets_per_second
Definition: pg.h:163
u64 n_packets_generated
Definition: pg.h:152
u8 is_enabled
Definition: pg.h:381
#define vec_foreach(var, vec)
Vector iterator.
static void pg_edit_free(pg_edit_t *e)
Definition: edit.h:91
vnet_device_class_t pg_dev_class
struct pg_main_t pg_main_t
f64 time_last_generate
Definition: pg.h:165
Definition: pg.h:312
pg_interface_t * interfaces
Definition: pg.h:330
static void pg_edit_group_free(pg_edit_group_t *g)
Definition: pg.h:184
void pg_enable_disable(u32 stream_index, int is_enable)
Definition: cli.c:58
u32 flags
Definition: pg.h:99
u32 * buffer_fifo
Definition: pg.h:90