On 28 January 2016 at 10:05, Bill Fischofer <bill.fischo...@linaro.org>
wrote:

> Signed-off-by: Bill Fischofer <bill.fischo...@linaro.org>
>

Reviewed-by Mike Holmes <mike.hol...@linaro.org>


> ---
>  doc/users-guide/users-guide.adoc | 121
> +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>
> diff --git a/doc/users-guide/users-guide.adoc
> b/doc/users-guide/users-guide.adoc
> index b3c08a1..b31e381 100644
> --- a/doc/users-guide/users-guide.adoc
> +++ b/doc/users-guide/users-guide.adoc
> @@ -768,6 +768,127 @@ NOTE: Both ordered and parallel queues improve
> throughput over atomic queues
>  due to parallel event processing, but require that the application take
>  steps to ensure context data synchronization if needed.
>
> +== Packet Processing
> +ODP applications are designed to process packets, which are the basic
> unit of
> +data of interest in the data plane. To assist in processing packets, ODP
> +provides a set of APIs that enable applications to examine and manipulate
> +packet data and metadata. Packets are referenced by an abstract
> *odp_packet_t*
> +handle defined by each implementation.
> +
> +Packet objects are normally created at ingress when they arrive at a
> source
> +*odp_pktio_t* and are received by an application either directly or (more
> +typically) for a scheduled receive queue. They MAY be implicitly freed
> when
> +they are transmitted to an output *odp_pktio_t* via an associated transmit
> +queue, or freed directly via the +odp_packet_free()+ API.
> +
> +Occasionally an application may originate a packet itself, either _de
> novo_ or
> +by deriving it from an existing packet, and APIs are provided to assist in
> +these cases as well. Application-created packets can be recycled back
> through
> +a _loopback interface_ to reparse and reclassify them, or the application
> can
> +do its own parsing as desired.
> +
> +Various attributes associated with a packet, such as parse results, are
> +stored as metadata and APIs are provided to permit applications to examine
> +and/or modify this information.
> +
> +=== Packet Structure and Concepts
> +A _packet_ consists of a sequence of octets conforming to an architected
> +format, such as Ethernet, that can be received and transmitted via the ODP
> +*pktio* abstraction. Packets of a _length_, which is the number of bytes
> in
> +the packet. Packet data in ODP is referenced via _offsets_ since these
> reflect
> +the logical contents and structure of a packet independent of how
> particular
> +ODP implementations store that data.
> +
> +These concepts are shown in the following diagram:
> +
> +.ODP Packet Structure
> +image::../images/packet.svg[align="center"]
> +
> +Packet data consists of zero or more _headers_ followed by 0 or more
> bytes of
> +_payload_, followed by zero or more _trailers_.  Shown here are various
> APIs
> +that permit applications to examine and navigate various parts of a
> packet and
> +to manipulate its structure.
> +
> +To support packet manipulation, predefined _headroom_ and _tailroom_
> +areas are logically associated with a packet. Packets can be adjusted by
> +_pulling_ and _pushing_ these areas. Typical packet processing might
> consist
> +of stripping headers from a packet via +odp_pull_head()+ calls as part of
> +receive processing and then replacing them with new headers via
> ++odp_push_head()+ calls as the packet is being prepared for transmit.
> +
> +=== Packet Segments and Addressing
> +ODP platforms use various methods and techniques to store and process
> packets
> +efficiently. These vary considerably from platform to platform, so to
> ensure
> +portability across them ODP adopts certain conventions for referencing
> +packets.
> +
> +ODP APIs use a handle of type *odp_packet_t* to refer to packet objects.
> +Associated with packets are various bits of system metadata that describe
> the
> +packet. By referring to the metadata, ODP applications accelerate packet
> +processing by minimizing the need to examine packet data. This is because
> the
> +metadata is populated by parsing and classification functions that are
> coupled
> +to ingress processing that occur prior to a packet being presented to the
> +application via the ODP scheduler.
> +
> +When an ODP application needs to examine the contents of a packet, it
> requests
> +addressability to it via an API call that makes the packet (or a
> contiguously
> +addressable _segment_ of it) available for coherent access by the
> application.
> +To ensure portability, ODP applications assume that the underlying
> +implementation stores packets in _segments_ of implementation-defined
> +and managed size. These represent the contiguously addressable portions
> of a
> +packet that the application may refer to via normal memory accesses. ODP
> +provides APIs that allow applications to operate on packet segments in an
> +efficient and portable manner as needed. By combining these with the
> metadata
> +provided by packets, ODP applications can operate in a fully
> +platform-independent manner while still achieving optimal performance
> across
> +the range of platforms that support ODP.
> +
> +The use of segments for packet addressing and their relationship to
> metadata
> +is shown in this diagram:
> +
> +.ODP Packet Segmentation
> +image::../images/segment.svg[align="center"]
> +
> +The packet metadata is set during parsing and identifies the starting
> offsets
> +of the various headers in the packet. The packet itself is physically
> stored
> +as a sequence of segments that area managed by the ODP implementation.
> +Segment 0 is the first segment of the packet and is where the packet's
> headroom
> +and headers typically reside. Depending on the length of the packet,
> +additional segments may be part of the packet and contain the remaining
> packet
> +payload and tailroom. The application need not concern itself with
> segments
> +except that when the application requires addressability to a packet it
> +understands that addressability is provided on a per-segment basis. So,
> for
> +example, if the application makes a call like +odp_packet_l4_ptr()+ to
> obtain
> +addressability to the packet's Layer 4 header, the returned length from
> that
> +call is the number of bytes from the start of the Layer 4 header that are
> +contiguously addressable to the application from the returned pointer
> address.
> +This is because the following byte occupies a different segment and may be
> +stored elsewhere. To obtain access to those bytes, the application simply
> +requests addressability to that offset and it will be able to address the
> +packet bytes that occupy the next segment, etc. Note that the returned
> +length for any packet addressability call is always the lesser of the
> remaining
> +packet length or size of its containing segment.  So a mapping for
> segment 2
> +in the above figure, for example, would return a length that extends only
> to
> +the end of the packet since the remaining bytes are part of the tailroom
> +reserved for the packet and are not usable by the application until made
> +available to it by an appropriate API call.
> +
> +=== Metadata Processing
> +As noted, packet metadata is normally set by the parser as part of
> +classification that occurs during packet receive processing. It is
> important
> +to note that this metadata may be changed by the application to reflect
> +changes in the packet contents and/or structure as part of its processing
> of
> +the packet. While changing this metadata may effect some ODP APIs,
> changing
> +metadata is designed to _document_ application changes to the packet but
> +does not in itself _cause_ those changes to be made. For example, if an
> +application changes the Layer 3 offset by using the
> +odp_packet_l3_offset_set()+
> +API, the subsequent calls to +odp_packet_l3_ptr()+ will return an address
> +starting from that changed offset, changing an attribute like
> ++odp_packet_has_udp_set()+ will not, by itself, turn a non-UDP packet into
> +a valid UDP packet. Applications are expected to exercise appropriate care
> +when changing packet metadata to ensure that the resulting metadata
> changes
> +reflect the actual changed packet structure that the application has made.
> +
>  == Cryptographic services
>
>  ODP provides support for cryptographic operations required by various
> security
> --
> 2.5.0
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>



-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
"Work should be fun and collborative, the rest follows"
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to