diff options
author | Dave Barach <dave@barachs.net> | 2020-04-15 09:34:43 -0400 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-04-15 19:19:29 +0000 |
commit | 08eb2bb205f998a75dacd1f3b999ec1a10160b35 (patch) | |
tree | c5d83c0db16472322720ba17c626cb74aae635e6 /src/vnet/pg | |
parent | 4422753b9f7edf7ff391f97a10c1b8a7dbd7dafb (diff) |
pg: set vnet buffer flags in pg streams
See .../extras/pg/checksum_offload.pg for a nontrivial example, which
deliberately sets bogus ip and udp checksums in the generated packets,
then fixes the mess with (software emulated) hardware checksum
offload.
Validated via "pcap dispatch trace on max 1000 buffer-trace pg-input 100".
Packets stuffed into loop1-output have the configured bogus ip and udp
checksums. vnet_calc_checksums_inline(...) fixes the checksums, which
are correct when packets visit loop1-tx.
The packet generator is a dumb robot in this regard. If you ask for a
ridiculous flag combination - example: ip4 and ip6 - your mileage may
vary.
Type: feature
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I6d9e790f373bcd9e445a89113ca8e4c8f9aa9419
Diffstat (limited to 'src/vnet/pg')
-rw-r--r-- | src/vnet/pg/cli.c | 4 | ||||
-rw-r--r-- | src/vnet/pg/input.c | 5 | ||||
-rw-r--r-- | src/vnet/pg/pg.h | 3 |
3 files changed, 11 insertions, 1 deletions
diff --git a/src/vnet/pg/cli.c b/src/vnet/pg/cli.c index 9336ca406d7..b3aaddfda2b 100644 --- a/src/vnet/pg/cli.c +++ b/src/vnet/pg/cli.c @@ -376,6 +376,10 @@ new_stream (vlib_main_t * vm, else if (unformat (input, "source pg%u", &s.if_id)) ; + else if (unformat (input, "buffer-flags %U", + unformat_vnet_buffer_flags, &s.buffer_flags)) + ; + else if (unformat (input, "node %U", unformat_vlib_node, vm, &s.node_index)) ; diff --git a/src/vnet/pg/input.c b/src/vnet/pg/input.c index bbcd34e763a..8ba3b361894 100644 --- a/src/vnet/pg/input.c +++ b/src/vnet/pg/input.c @@ -1106,6 +1106,8 @@ init_buffers_inline (vlib_main_t * vm, b0 = vlib_get_buffer (vm, bi0); b1 = vlib_get_buffer (vm, bi1); + b0->flags |= s->buffer_flags; + b1->flags |= s->buffer_flags; vnet_buffer (b0)->sw_if_index[VLIB_RX] = vnet_buffer (b1)->sw_if_index[VLIB_RX] = s->sw_if_index[VLIB_RX]; @@ -1135,6 +1137,7 @@ init_buffers_inline (vlib_main_t * vm, n_left -= 1; b0 = vlib_get_buffer (vm, bi0); + b0->flags |= s->buffer_flags; vnet_buffer (b0)->sw_if_index[VLIB_RX] = s->sw_if_index[VLIB_RX]; vnet_buffer (b0)->sw_if_index[VLIB_TX] = s->sw_if_index[VLIB_TX]; @@ -1269,7 +1272,7 @@ pg_stream_fill_replay (pg_main_t * pg, pg_stream_t * s, u32 n_alloc) clib_memcpy_fast (b->data, d0 + data_offset, bytes_this_chunk); vnet_buffer (b)->sw_if_index[VLIB_RX] = s->sw_if_index[VLIB_RX]; vnet_buffer (b)->sw_if_index[VLIB_TX] = s->sw_if_index[VLIB_TX]; - b->flags = 0; + b->flags = s->buffer_flags; b->next_buffer = 0; b->current_data = 0; b->current_length = bytes_this_chunk; diff --git a/src/vnet/pg/pg.h b/src/vnet/pg/pg.h index 55bc75dc282..a6616d9ced7 100644 --- a/src/vnet/pg/pg.h +++ b/src/vnet/pg/pg.h @@ -123,6 +123,9 @@ typedef struct pg_stream_t for max_packet_bytes. */ u32 buffer_bytes; + /* Buffer flags to set in each packet e.g. checksum offload flags */ + u32 buffer_flags; + /* Last packet length if packet size edit type is increment. */ u32 last_increment_packet_size; |