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