On 17 November 2015 at 12:54, Bill Fischofer <[email protected]>
wrote:

> Is that a review comment?  Is there a problem with the rendering?
>

Not a review comment just to make it easier for folks to read initially.


> On Tue, Nov 17, 2015 at 11:51 AM, Mike Holmes <[email protected]>
> wrote:
>
>> This is the rendered doc
>>
>> http://people.linaro.org/~mike.holmes/output/users-guide.html
>>
>> On 17 November 2015 at 12:15, Bill Fischofer <[email protected]>
>> wrote:
>>
>>> Add a basic ODP overview to the User's Guide, providing
>>> an overview of ODP concepts, components, etc. Included
>>> are a number of diagrams covering component structure
>>> as well as packet RX, event scheduling, and packet TX
>>> processing.
>>>
>>> Signed-off-by: Bill Fischofer <[email protected]>
>>> ---
>>>  doc/users-guide/users-guide.adoc | 400
>>> ++++++++++++++++++++++++++++++++++++++-
>>>  1 file changed, 398 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/doc/users-guide/users-guide.adoc
>>> b/doc/users-guide/users-guide.adoc
>>> index 7f70046..cf77fa0 100644
>>> --- a/doc/users-guide/users-guide.adoc
>>> +++ b/doc/users-guide/users-guide.adoc
>>> @@ -8,7 +8,7 @@ OpenDataPlane (ODP)  Users-Guide
>>>  Abstract
>>>  --------
>>>  This document is intended to guide a new ODP application developer.
>>> -Further details about ODP may be found at then 
>>> http://opendataplane.org[ODP]
>>> home page.
>>> +Further details about ODP may be found at the http://opendataplane.org[ODP]
>>> home page.
>>>
>>>  .Overview of a system running ODP applications
>>>  image::../images/overview.png[align="center"]
>>> @@ -16,6 +16,403 @@ image::../images/overview.png[align="center"]
>>>  ODP is an API specification that allows many implementations to provide
>>> platform independence, automatic hardware acceleration and CPU scaling to
>>> high performance networking  applications.
>>>  This document describes how to write an application that can
>>> successfully take advantage of the API.
>>>
>>> +:numbered:
>>> +== Introduction ==
>>> +.OpenDataPlane Components
>>> +image::../images/odp_components.png[align="center"]
>>> +
>>> +.The ODP API Specification
>>> +ODP consists of three separate but related component parts. First, ODP
>>> is an
>>> +abstract API specification that describes a functional model for
>>> +data plane applications. This specification covers many common data
>>> plane
>>> +application programming needs, such as the ability to receive,
>>> manipulate, and
>>> +transmit packet data, without specifying how these functions are
>>> performed. This
>>> +is quite intentional. It is precisely because ODP APIs do not have a
>>> preferred
>>> +embodiment that they permit innovation in how these functions can
>>> +be realized on various platforms that offer implementations of ODP. To
>>> achieve
>>> +this goal, ODP APIs are described using abstract data types whose
>>> definition
>>> +is left up to the ODP implementer.  For example, in ODP packets are
>>> referenced
>>> +by abstract handles of type +odp_packet_t+, and packet-related APIs take
>>> +arguments of this type. What an +odp_packet_t+ actually is is not part
>>> of the
>>> +ODP API specification--that is the responsibility of each ODP
>>> implementation.
>>> +
>>> +.Summary: ODP API attributes:
>>> +* Open Source, open contribution, BSD-3 licensed.
>>> +* Vendor and platform neutral.
>>> +* Application-centric.  Covers functional needs of data plane
>>> applications.
>>> +* Ensures portability by specifying the functional behavior of ODP.
>>> +* Defined jointly and openly by application writers and platform
>>> implementers.
>>> +* Archiected to be implementable on a wide range of platforms
>>> efficiently
>>> +* Sponsored, governed, and maintained by the Linaro Networking Group
>>> (LNG)
>>> +
>>> +.ODP Implementations
>>> +Second, ODP consists of multiple implementations of this API
>>> specification,
>>> +each tailored to a specific target platform. ODP implementations
>>> determine
>>> +how each ODP abstract type is represented on that platform and how each
>>> ODP
>>> +API is realized. On some platforms, ODP APIs will
>>> +be realized using specialized instructions that accelerate the
>>> functional
>>> +behavior specified by the API. On others, hardware co-processing
>>> engines may
>>> +completely offload the API so that again it can be performed with
>>> little or no
>>> +involvement by a CPU. In all cases, the application sees the same
>>> +functional behavior independent of how a given platform has chosen to
>>> realize
>>> +it. By allowing each platform the freedom to determine how best to
>>> realize each
>>> +API's specified functional behavior in an optimal manner, ODP permits
>>> +applications written to its APIs to take full advantage of the unique
>>> +capabilities of each platform without the application programmer
>>> needing to
>>> +have specialist knowledge of that platform or to be concerned with how
>>> best
>>> +to tune the application to a particular platform. This latter
>>> consideration is
>>> +particularly important in Network Function Virtualization (NFV)
>>> environments
>>> +where the application will run on a target platform chosen by someone
>>> else.
>>> +
>>> +.Summary: ODP Implementation Characteristics
>>> +* One size does not fit all--supporting multiple implementations allows
>>> ODP
>>> +to adapt to widely differing internals among platforms.
>>> +* Anyone can create an ODP implementation tailored to their platform
>>> +* Distribution and mainteinance of each implementation is as owner
>>> wishes
>>> +  - Open source or closed source as business needs determine
>>> +  - Have independent release cycles and service streams
>>> +* Allows HW and SW innovation in how ODP APIs are implemented on each
>>> platform.
>>> +
>>> +.Reference Implementations
>>> +To make it easy to get started with implementing ODP on a new platform,
>>> ODP
>>> +supplies a number of _reference implementations_ that can serve as a
>>> +starting point.  The two primary references implementations supplied by
>>> ODP are
>>> +*odp-linux* and *odp-dpdk*
>>> +
>>> +.odp-linux
>>> +The *odp-linux* reference implementation is a pure SW implementation of
>>> the
>>> +ODP API that relies only on the Linux programming API. As a functional
>>> model
>>> +for ODP, it enables ODP to be bootstrapped easily to any platform that
>>> +supports a Linux kernel.
>>> +
>>> +.odp-dpdk
>>> +The *odp-dpdk* reference implementation is a pure SW implementation of
>>> the
>>> +ODP API that uses http://dpdk.org[DPDK] as a SW accelerator. In
>>> particular,
>>> +*odp-dpdk* offers superior I/O performance for systems that use NICs,
>>> allowing
>>> +ODP applications to take immediate full advantage of the various NIC
>>> device
>>> +drivers supported by DPDK.
>>> +
>>> +.Summary: ODP Reference Implementations
>>> +* Open source, open contribution, BSD-3 licensed.
>>> +* Provide easy bootstrapping of ODP onto new platforms
>>> +* Implementers free to borrow or tailor code as needed for their
>>> platform
>>> +* Implementers retain full control over their implementations whether
>>> or not
>>> +they are derived from a reference implementation.
>>> +
>>> +.ODP Validation Test Suite
>>> +Third, to enure consistency between different ODP implementations, ODP
>>> +consists of a validation suite that verifies that any given
>>> implementation of
>>> +ODP faithfully provides the specified functional behavior of each ODP
>>> API.
>>> +As a separate open source component, the validation suite may be used by
>>> +application writers, system integrators, and platform providers alike to
>>> +confirm that any purported implementation of ODP does indeed conform to
>>> the
>>> +ODP API specification.
>>> +
>>> +.Summary: ODP Validation Test Suite
>>> +* Synchronized with ODP API specification
>>> +* Maintained and distributed by LNG
>>> +* Open source, open contribution, BSD-3 licensed.
>>> +* Key to ensuring application portability across all ODP implementations
>>> +* Tests that ODP implementations conform to the specified functional
>>> behavior
>>> +of ODP APIs.
>>> +* Can be run at any time by users and vendors to validat implementations
>>> +od ODP.
>>> +
>>> +=== ODP API Specification Versioning ===
>>> +As an evolving standard, the ODP API specification is released under an
>>> +incrementing version number, and corresponding implementations of ODP,
>>> as well
>>> +as the validation suite that verifies API conformance, are linked to
>>> this
>>> +version number. ODP versions are specified using a stanard three-level
>>> +number (major.minor.fixlevel) that are incremented according to the
>>> degree of
>>> +change the level represents. Increments to the fixlevel represent
>>> clarification
>>> +of the specification or other minor changes that do not affect either
>>> the
>>> +syntax or semantics of the specification. Such changes in the API
>>> specification
>>> +are expected to be rare. Increments to the minor level
>>> +represent the introduction of new APIs or functional capabilities, or
>>> changes
>>> +to he specified syntax or functional behavior of APIs and thus may
>>> require
>>> +application source code changes. Such changes are well documented in the
>>> +release notes for each revision of the specification. Finally,
>>> increments to
>>> +the major level represent significant structural changes that most
>>> likely
>>> +require some level of application source code change, again as
>>> documented in
>>> +the release notes for that version.
>>> +
>>> +=== ODP Implementation Versioning ===
>>> +ODP implementations are free to use whatever release naming/numbering
>>> +conventions they wish, as long as it is clear what level of the ODP API
>>> a given
>>> +release implements. A recommended convention is to use the same three
>>> level
>>> +numbering scheme where the major and minor numbers correspond to the
>>> ODP API
>>> +level and the fixlevel represents an implementation-defined service
>>> level
>>> +associated with that API level implementation. The LNG-supplied ODP
>>> reference
>>> +implementations follow this convention.
>>> +
>>> +=== ODP Validation Test Suite Versioning ===
>>> +The ODP validation test suite follows these same naming conventions.
>>> The major
>>> +and minor release numbers correspond to the ODP API level that the suite
>>> +validates and the fixlevel represents the service level of the
>>> validation
>>> +suite itself for that API level.
>>> +
>>> +=== ODP Design Goals ===
>>> +ODP has three primary goals that follow from its component structure.
>>> The first
>>> +is application portability across a wide range of platforms. These
>>> platforms
>>> +differ in terms of processor instruction set architecture, number and
>>> types of
>>> +application processing cores, memory oranization, as well as the number
>>> and
>>> +type of platform specific hardware acceleration and offload features
>>> that
>>> +are available. ODP applications can move from one conforming
>>> implementation
>>> +to another with at most a recompile.
>>> +
>>> +Second, ODP is designed to permit data plane applications to avail
>>> themselves
>>> +of platform-specific features, including specialized hardware
>>> accelerators,
>>> +without specialized programming. This is achieved by separating the API
>>> +specification from their implementation on individual platforms. Since
>>> each
>>> +platform implements each ODP API in a manner optimal to that platform,
>>> +applications automatically gain the benefit of such optimizations
>>> without the
>>> +need for explicit programming.
>>> +
>>> +Third, ODP is designed to allow applications to scale out automatically
>>> to
>>> +support many core architectures. This is done using an event based
>>> programming
>>> +model that permits applications to be written to be independent of the
>>> number
>>> +of processing cores that are available to realize application function.
>>> The
>>> +result is that an application written to this model does not require
>>> redesign
>>> +as it scales from 4, to 40, to 400 cores.
>>> +
>>> +== Organization of this Document ==
>>> +This document is organized into several sections. The first presents a
>>> high
>>> +level overview of the ODP API component areas and their associated
>>> abstract
>>> +data types. This section introduces ODP APIs at a conceptual level.
>>> +The second provides a tutorial on the programming model(s)
>>> +supported by ODP, paying particular attention to the event model as this
>>> +represents the preferred structure for most ODP applications. This
>>> section
>>> +builds on the concepts introduced in the first section and shows how ODP
>>> +applications are structured to best realize the three ODP design goals
>>> +mentioned earlier. The third section provides a more detailed overview
>>> of
>>> +the major ODP API components and is designed to serve as a companion to
>>> the
>>> +full reference specification for each API. The latter is intended to be
>>> used
>>> +by ODP application programmers, as well as implementers, to understand
>>> the
>>> +precise syntax and semantics of each API.
>>> +
>>> +== ODP API Concepts ==
>>> +ODP programs are built around several conceptual structures that every
>>> +appliation programmer needs to be familiar with to use ODP effectively.
>>> The
>>> +main ODP concepts are:
>>> +Thread, Event, Queue, Pool, Shared Memory, Buffer, Packet, PktIO, Timer,
>>> +and Synchronizer.
>>> +
>>> +=== Thread ===
>>> +The thread is the fundamental programming unit in ODP.  ODP
>>> applications are
>>> +organized into a collection of threads that perform the work that the
>>> +application is designed to do. ODP threads may or may not share memory
>>> with
>>> +other threads--that is up to the implementation. Threads come in two
>>> "flavors":
>>> +control and worker, that are represented by the abstract type
>>> ++odp_thread_type_t+.
>>> +
>>> +A control thread is a supervisory thread that organizes
>>> +the operation of worker threads. Worker threads, by contrast, exist to
>>> +perform the main processing logic of the application and employ a run to
>>> +completion model. Worker threads, in particular, are intended to
>>> operate on
>>> +dedicated processing cores, especially in many core proessing
>>> environments,
>>> +however a given implementation may multitask multiple threads on a
>>> single
>>> +core if desired (typically on smaller and lower performance target
>>> +environments).
>>> +
>>> +In addition to thread types, threads have associated _attributes_ such
>>> as
>>> +_thread mask_ and _scheduler group_ that determine where they can run
>>> and
>>> +the type of work that they can handle. These will be discussed in
>>> greater
>>> +detail later.
>>> +
>>> +=== Event ===
>>> +Events are what threads process to perform their work. Events can
>>> represent
>>> +new work, such as the arrival of a packet that needs to be processed,
>>> or they
>>> +can represent the completion of requests that have executed
>>> asynchronously.
>>> +Events can also represent notifications of the passage of time, or of
>>> status
>>> +changes in various components of interest to the application. Events
>>> have an
>>> +event type that describes what it represents. Threads can create new
>>> events
>>> +or consume events processed by them, or they can perform some
>>> processing on
>>> +an event and then pass it along to another component for further
>>> processing.
>>> +References to events are via handles of abstract type +odp_event_t+.
>>> Cast
>>> +functions are provided to convert these into specific handles of the
>>> +appropriate type represented by the event.
>>> +
>>> +=== Queue ===
>>> +A queue is a message passing channel that holds events.  Events can be
>>> +added to a queue via enqueue operations or removed from a queue via
>>> dequeue
>>> +operations. The endpoints of a queue will vary depending on how it is
>>> used.
>>> +Queues come in two major types: polled and scheduled, which will be
>>> +discussed in more detail when the event model is introduced. Queues may
>>> also
>>> +have an associated context, which represents a persistent state for all
>>> +events that make use of it. These states are what permit threads to
>>> perform
>>> +stateful processing on events as well as stateless processing.
>>> +
>>> +Queues are represented by handles of abstract type +odp_queue_t+.
>>> +
>>> +=== Pool ===
>>> +A pool is a shared memory area from which elements may be drawn. Pools
>>> +represent the backing store for events, among other things. Pools are
>>> +typically created and destroyed by the application during
>>> initialization and
>>> +termination, respectively, and then used during processing. Pools may be
>>> +used by ODP components exclusively, by applications exclusively, or
>>> their
>>> +use may be shared between the two. Pools have an associated type that
>>> +characterizes the elements that they contain. The two most important
>>> pool types
>>> +are Buffer and Packet.
>>> +
>>> +Pools are represented by handles of abstract type +odp_pool_t+.
>>> +
>>> +=== Shared Memory ===
>>> +Shared memory represents raw blocks of storage that are sharable between
>>> +threads. They are the building blocks of pools but can be used directly
>>> by
>>> +ODP applications if desired.
>>> +
>>> +Shared memory is represented by handles of abstract type +odp_shm_t+.
>>> +
>>> +=== Buffer ===
>>> +A buffer is a fixed sized block of shared storage that is used by ODP
>>> +components and/or applications to realize their function. Buffers
>>> contain
>>> +zero or more bytes of application data as well as system maintained
>>> +metadata that provide information about the buffer, such as its size or
>>> the
>>> +pool it was allocated from. Metadata is an important ODP concept
>>> because it
>>> +allows for arbitrary amounts of side information to be associated with
>>> an
>>> +ODP object. Most ODP objects have assocaited metadata and this metadata
>>> is
>>> +manipulated via accessor functions that act as getters and setters for
>>> +this information. Getter acces functions permit an application to read
>>> +a metadata item, while setter access functions permit an application to
>>> write
>>> +a metadata item. Note that some metadata is inherently read only and
>>> thus
>>> +no setter is provided to manipulate it.  When object have multiple
>>> metadata
>>> +items, each has its own associated getter and/or setter access function
>>> to
>>> +inspect or manipulate it.
>>> +
>>> +Buffers are represened by handles of abstract type +odp_buffer_t+.
>>> +
>>> +=== Packet ===
>>> +Packets are received and transmitted via I/O interfaces and represent
>>> +the basic data that data plane applications manipulate.
>>> +Packets are drawn from pools of type +ODP_POOL_PACKET+.
>>> +Unlike  buffers, which are simple objects,
>>> +ODP packets have a rich set of semantics that permit their inspection
>>> +and manipulation in complex ways to be described later. Packets also
>>> support
>>> +a rich set of metadata as well as user metadata. User metadata permits
>>> +applications to associate an application-determined amount of side
>>> information
>>> +with each packet for its own use.
>>> +
>>> +Packets are represented by handles of abstract type +odp_packet_t+.
>>> +
>>> +=== PktIO ===
>>> +PktIO is how ODP represents I/O interfaces. A pktio object is a logical
>>> +port capable of receiving and/or transmitting packets. This may be
>>> directly
>>> +supported by the underlying platform as an integrated feature,
>>> +or may represent a device attached via a PCIE or other bus.
>>> +
>>> +PktIOs are represented by handles of abstract type +odp_pktio_t+.
>>> +
>>> +=== Timer ===
>>> +Timers are how ODP applications measure and respond to the passage of
>>> time.
>>> +Timers are drawn from specialized pools called timer pools that have
>>> their
>>> +own abstract type (+odp_timer_pool_t+). Applications may have many
>>> timers
>>> +active at the same time and can set them to use either relative or
>>> absolute
>>> +time. When timers expire they create events of type +odp_timeout_t+,
>>> which
>>> +serve as notifications of timer expiration.
>>> +
>>> +=== Synchronizer ===
>>> +Multiple threads operating in parallel typically require various
>>> +synchronization services to permit them to operate in a reliable and
>>> +coordinated manner. ODP provides a rich set of locks, barriers, and
>>> similar
>>> +synchronization primitives, as well as abstract types for representing
>>> various
>>> +types of atomic variables. The ODP event model also makes use of queues
>>> to
>>> +avoid the need for explicit locking in many cases. This will be
>>> discussed
>>> +in the next section.
>>> +
>>> +== ODP Components ==
>>> +Building on ODP concepts, ODP offers several components that relate to
>>> the
>>> +flow of work through an ODP application. These include the Classifier,
>>> +Scheduler, and Traffic Manager.  These components relate to the three
>>> +main stages of packet processing: Receive, Process, and Transmit.
>>> +
>>> +=== Classifier ===
>>> +The *Classifier* provides a suite of APIs that control packet receive
>>> (RX)
>>> +processing.
>>> +
>>> +.ODP Receive Processing with Classifier
>>> +image::../images/odp_rx_processing.png[align="center"]
>>> +
>>> +The classifier provides two logically related services:
>>> +[horizontal]
>>> +Packet parsing:: Verifying and extracting structural information from a
>>> +received packet.
>>> +
>>> +Packet classification:: Applying *Pattern Matching Rules (PMRs)* to the
>>> +parsed results to assign an incoming packet to a *Class of Service
>>> (CoS)*.
>>> +
>>> +Combined, these permit incoming packets to be sorted into *flows*,
>>> which are
>>> +logically related sequences of packets that share common processing
>>> +requirements. While many data plane applications perform stateless
>>> packet
>>> +processing (_e.g.,_ for simple forwarding) others perform stateful
>>> packet
>>> +processing.  Flows anchor state information relating to these groups of
>>> +packets.
>>> +
>>> +A CoS determines two variables for packets belonging to a flow:
>>> +[list]
>>> +* The pool that they will be stored in on receipt
>>> +* The queue that they will be added to for processing
>>> +
>>> +The PMRs supported by ODP permit flow determination based on
>>> combinations of
>>> +packet field values (tuples). The main advantage of classification is
>>> that on
>>> +many platforms these functions are performed in hardware, meaning that
>>> +classification occurs at line rate as packets are being received without
>>> +any explicit processing by the ODP application.
>>> +
>>> +Note that the use of the classifier is optional.  Applications may
>>> directly
>>> +receive packets from a corresponding PktIO input queue via direct
>>> polling
>>> +if they choose.
>>> +
>>> +=== Scheduler ===
>>> +The *Scheduler* provides a suite of APIs that control scalabable event
>>> +processing.
>>> +
>>> +.ODP Scheduler and Event Processing
>>> +image::../images/odp_scheduling.png[align="center"]
>>> +
>>> +The Scheduler is responsible for selecting and dispatching one or more
>>> events
>>> +to a requesting thread. Event selection is based on several factors
>>> involving
>>> +both the queues containing schedulable events and the thread making an
>>> ++odp_schedule()+ or +odp_schedule_multi()+ call.
>>> +
>>> +ODP queues have a _scheduling priority_ that determines how urgently
>>> events
>>> +on them should be processed relative to events contained in other
>>> queues.
>>> +Queues also have a _scheduler group id_ associated with them that must
>>> match
>>> +the associated scheduler group _thread mask_ of the thread calling the
>>> +scheduler. This permits events to be grouped for processing into
>>> classes and
>>> +have threads that are dedicated to processing events from specified
>>> classes.
>>> +Threads can join and leave scheduler groups dynamically, permitting easy
>>> +application response to increases in demand.
>>> +
>>> +When a thread receives an event from the scheduler, it in turn can
>>> invoke
>>> +other processing engines via ODP APIs (_e.g.,_ crypto processing) that
>>> +can operate asynchronously. When such processing is complete, the
>>> result is
>>> +that a *completion event* is added to a schedulable queue where it can
>>> be
>>> +scheduled back to a thread to continue processing with the results of
>>> the
>>> +requested asynchronous operation.
>>> +
>>> +Threads themselves can enqueue events to queues for downstream
>>> processing
>>> +by other threads, permitting flexibility in how applicaitions structure
>>> +themselves to maximize concurrency.
>>> +
>>> +=== Traffic Manager ===
>>> +The *Traffic Manager* provides a suite of APIs that control traffic
>>> shaping and
>>> +Quality of Service (QoS) processing for packet output.
>>> +
>>> +.ODP Transmit processing with Traffic Manager
>>> +image::../images/odp_traffic_manager.png[align="center"]
>>> +
>>> +The final stage of packet processing is to transmit it. Here,
>>> applications have
>>> +several choices.  As with RX processing, applications may send packets
>>> +directly to PktIO TX queues for direct transmission.  Often, however,
>>> +applications need to perform traffic shaping and related
>>> +*Quality of Service (QoS)* processing on the packets comprising a flow
>>> as part
>>> +of transmit processing. To handle this need, ODP provides a suite of
>>> +*Traffic Manager* APIs that permit programmatic establishment of
>>> arbiters,
>>> +shapers, etc. that control output packet processing to achieve desired
>>> QoS
>>> +goals. Again, the advantage here is that on many platforms traffic
>>> management
>>> +functions are implemented in hardware, permitting transparent offload of
>>> +this work.
>>> +
>>>  Glossary
>>>  --------
>>>  [glossary]
>>> @@ -28,7 +425,6 @@ odp_thread::
>>>  event::
>>>      An event is a notification that can be placed in a queue.
>>>
>>> -:numbered:
>>>  The include structure
>>>  ---------------------
>>>  Applications only include the 'include/odp.h file which includes the
>>> 'platform/<implementation name>/include/plat' files to provide a complete
>>> definition of the API on that platform.
>>> --
>>> 2.1.4
>>>
>>> _______________________________________________
>>> lng-odp mailing list
>>> [email protected]
>>> 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
>>
>>
>>
>


-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to