This is the rendered doc http://people.linaro.org/~mike.holmes/output/users-guide.html
On 17 November 2015 at 12:15, Bill Fischofer <bill.fischo...@linaro.org> 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 <bill.fischo...@linaro.org> > --- > 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 > 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
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp