Look at .../src/vnet/ipfix-export/flow_report.c : send_template_packet(...) for 
a decent example of most of the mechanics involved. Also look at 
.../src/vlib/buffer.c : vlib_buffer_add_data(...).

If you're going to send lots of such packets, it may well improve performance 
to allocate a fair number of buffers at a time, and maintain a private buffer 
cache. See ../src/vnet/tcp/tcp_output.c : tcp_alloc_tx_buffers(...).

HTH... Dave

-----Original Message-----
From: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> On Behalf Of Prashant Upadhyaya
Sent: Sunday, October 28, 2018 3:13 AM
To: vpp-dev@lists.fd.io
Subject: [vpp-dev] Regarding vlib_buffer_t construction for tx of a self-made 
packet

Hi,

I have a situation where one of my plugins needs to construct an l2 packet 
(containing an ip datagram inside).
So I have a local buffer which contains the following bytes laid out -- dst mac 
src mac ethertype ip header + payload

Assume for the sake of generality that the above buffer is 4K bytes (because I 
have an ip payload of that much size) Assume further that I magically already 
know the sw if indices of the RX and TX.
It is also ensured that the l2 paylod size is lesser than or equal to the MTU 
of the TX interface

Now once I have all of the above information, I need to create a vlib_buffer_t 
(possibly a chained set) So I need some guidelines/best practices of how to go 
about it flawlessly so that once the vlib_buffer_t is constructed, I can simply 
send it to the "interface-output" and accomplish the act of transmission.

The high level set of things that I can think of is --

1. Allocate a vlib_buffer_t (or a chained flavour of those) 2. Start appending 
data to those buffers 3. What about the various control fields to be set in the 
above buffers ?
. I suppose I will have to do the following --
  vnet_buffer (b0)->sw_if_index[VLIB_RX] = <My known index>;
                vnet_buffer (b0)->sw_if_index[VLIB_TX] = <My known index>; Do I 
need to do anything with b0->buffer_pool_index ?
What to do with b0->current_data ?
What to do with b0->flags ?
What to do with b->current_length ?
And if it is a chained set, what is to be done on individual vlib_buffer_t of 
the chain and what on the first one of the chain ?

I suppose I need a convenience function like the following

vlib_buffer_t* foo(char* myl2packet, int lengthOfMyL2Packet, u32 mySwIfRxIndex, 
u32 mySwIfTxIndex)

The above should return to me a nice little vlib_buffer_t (possibly
chained) which I can then ship to interface output.
I am willing to write such a function by all means but want to find out if 
anything like this (or closer) already exists.
If it doesn't exist, what idioms can I follow from the functions which already 
exist and what I have to be careful about.

Regards
-Prashant
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#11012): https://lists.fd.io/g/vpp-dev/message/11012
Mute This Topic: https://lists.fd.io/mt/27770677/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to