07/01/2021 21:14, Alexander Kozyrev:
> > 07/01/2021 17:57, Alexander Kozyrev:
> > > > 07/01/2021 16:22, Alexander Kozyrev:
> > > > > > 07/01/2021 16:10, Alexander Kozyrev:
> > > > > > > > > > Thursday, January 7, 2021 10:18, Thomas Monjalon
> > > > > > <tho...@monjalon.net>
> > > > > > > > > > > RTE Flows API lacks the ability to save an arbitrary 
> > > > > > > > > > > header field
> > in
> > > > > > > > > > > order to use it later for advanced packet manipulations.
> > Examples
> > > > > > > > > > > include the usage of VxLAN ID after the packet is 
> > > > > > > > > > > decapsulated
> > or
> > > > > > > > > > > storing this ID inside the packet payload itself or 
> > > > > > > > > > > swapping an
> > > > > > > > > > > arbitrary inner and outer packet fields.
> > > > > > > > > > >
> > > > > > > > > > > The idea is to allow a copy of a specified number of bits 
> > > > > > > > > > > form
> > any
> > > > > > > > > > > packet header field into another header field:
> > > > > > > > > > > RTE_FLOW_ACTION_TYPE_COPY_FIELD with the structure
> > defined
> > > > > > below.
> > > > > > > > > > >
> > > > > > > > > > > struct rte_flow_action_copy_field {
> > > > > > > > > > >   struct rte_flow_action_copy_data dest;
> > > > > > > > > > >   struct rte_flow_action_copy_data src;
> > > > > > > > > > >   uint16_t width;
> > > > > > > > > > > };
> > > > > > > > > > >
> > > > > > > > > > > Arbitrary header field (as well as mark, metadata or tag 
> > > > > > > > > > > values)
> > can
> > > > be
> > > > > > > > > > > used as both source and destination fields. This way we 
> > > > > > > > > > > can save
> > an
> > > > > > > > > > > arbitrary header field by copying its value to a
> > tag/mark/metadata
> > > > or
> > > > > > > > > > > copy it into another header field directly. 
> > > > > > > > > > > tag/mark/metadata
> > can
> > > > also
> > > > > > > > > > > be used as a value to be stored in an arbitrary packet 
> > > > > > > > > > > header
> > field.
> > > > > > > > > > >
> > > > > > > > > > > struct rte_flow_action_copy_data {
> > > > > > > > > > >   enum rte_flow_field_id field;
> > > > > > > > > > >   uint16_t index;
> > > > > > > > > > >   uint16_t offset;
> > > > > > > > > > > };
> > > > > > > > > > >
> > > > > > > > > > > The rte_flow_field_id specifies the particular packet 
> > > > > > > > > > > field (or
> > > > > > > > > > > tag/mark/metadata) to be used as a copy source or 
> > > > > > > > > > > destination.
> > > > > > > > > > > The index gives access to inner packet headers or 
> > > > > > > > > > > elements in
> > the
> > > > tags
> > > > > > > > > > > array. The offset allows to copy a packet field value 
> > > > > > > > > > > into the
> > > > payload.
> > > > > > > > > >
> > > > > > > > > > So index is in reality the layer? How is it numbered 
> > > > > > > > > > exactly?
> > > > > > > > >
> > > > > > > > > It is a layer for packet fields, inner headers get higher 
> > > > > > > > > number index.
> > > > > > > > > But is it also an index in the TAG array, so the name comes 
> > > > > > > > > from it.
> > > > > > > >
> > > > > > > > Sorry it is not obvious.
> > > > > > > > Please describe the exact numbering in tunnel and VLAN cases.
> > > > > > > >
> > > > > > > > > > What is the field id if an offset is given?
> > > > > > > > >
> > > > > > > > > Field ID stays the same, you can specify a small offset to 
> > > > > > > > > copy just a
> > > > few
> > > > > > bits
> > > > > > > > > from the entire packet field or a big offset to move to 
> > > > > > > > > completely
> > > > different
> > > > > > > > area.
> > > > > > > >
> > > > > > > > I don't understand what is an offset then.
> > > > > > > > Isn't it the byte or bit where the copy start?
> > > > > > > > Do you handle sizes smaller than a byte?
> > > > > > >
> > > > > > > It is the bit offset, you can copy 20 bits out of 32 bits of IPv4 
> > > > > > > address
> > for
> > > > > > example.
> > > > > >
> > > > > > Now I'm confused.
> > > > > > You mean rte_flow_action_copy_data.offset is a bit offset?
> > > > >
> > > > > rte_flow_action_copy_data.offset and rte_flow_action_copy_field.width
> > > > > are measured in bits, right.
> > > >
> > > > So the offset is limited to 16 bits?
> > > > How can it be useful? Is it an offset starting from the specified field?
> > >
> > > Why 16? It can be up to 2^16=65536 bits. Do you think that is not enough?
> > 
> > Yes 8KB may be too small for huge packets.
> > I recommend 32 bits.
> Sounds good, will make it 32-bit in the implementation.
> 
> > > And it starts from the specific packet field pointed by the Field ID, 
> > > correct.
> > 
> > I think it would be more useful as a global offset
> > starting from the first bit of the packet.
> The API gives you this flexibility when you specify None as the Field ID.
> But Field ID is useful when you don't want to calculate the offset by 
> yourself.
> You can just say: I would like to copy IP address in the inner header (index 
> 1),
> for example, and leave offset as 0 instead of trying to figure out where it 
> is:
> set copy_field width 32 src field ipv4 index 1 offset 0 dst field tag index 0 
> offset 0

OK it makes sense.

I think you should better explain the calculations in the doxygen comments.



Reply via email to