6. ODP 组件

基于ODP概念,ODP提供了与ODP应用程序的工作流程相关的多个组件。 这些组件包括分类器,调度程序和流量管理器等。 这些组件与数据包处理的三个主要阶段有关:接收,处理和发送。

6.1. 分类器(Classifier)

分类器提供了一套控制数据包接收(RX)处理的API。

../_images/odp-classfier.svg

ODP Receive Processing with Classifier

Classfier提供两个逻辑相关的服务:

  • Packet parsing : 检查并从接收的数据包中提取结构信息
  • Packet classification : 将模式匹配规则PMR应用于解析结果,以将传入的数据包分配给服务等级CoS

综合起来,这些允许进入的数据包被分类成流,这些流是具有共同处理要求的逻辑上相关的数据包系列。 虽然许多数据面应用程序执行无状态报文处理(如简单转发),但是也有很多数据面程序执行有状态报文处理。 流的状态信息与这些报文组的状态相关。

CoS确定属于某条流的数据包的两个属性:

  • 收到报文时存储的池
  • 报文将被添加进去的处理队列

ODP支持的PRMs允许基于报文字段值组合(tuples)的流分类。分类的主要优点是在许多平台上,这些功能是以硬件方式执行的, 这意味着当数据包正在被接收,而ODP应用程序没有任何明确处理的情况下,分类是以线速发生的。

Note

Classfier的使用是可选的。如果选择使用,应用程序可以通过直接轮询的方式直接从对应PktIO输入队列接收数据包。

6.2. 调度器(Scheduler)

Scheduler提供了一套控制可扩展事件处理的API。

../_images/odp-scheduler.svg

ODP Scheduler and Event Processing

Scheduler负责选择和调度一个或多个事件到请求的线程。 事件选择基于几个因素,涉及包含可调度事件的队列和进行 odp_schedule()odp_schedule_multi() 调用的线程。

ODP队列具有调度优先级(scheduling priority),可以确定应相对于其他队列上的事件,当前队列上的紧急事件如何处理。 队列还具有与他们相关联的调度程序组的ID,他们必须与调用程序的线程的关联调度程序组线程掩码想匹配。 这允许事件被分类处理,并且具有专门用于处理某一类事件的线程。 线程可以动态地加入或离开调度程序组,从而允许应用程序的相应更快地满足需求。

当线程从shceduler接收到事件时,它又可以通过异步操作的ODP API(如加密处理)来调用其他处理引擎。 当这样的处理完成时,完成的事件被添加回可调度队列中,这个事件可以被再次调度回线程,以使用异步操作的结果继续处理。

线程本身可以将事件排入队列,以供其他线程进行下游处理,从而允许应用程序自身结构最大化并发处理。

6.3. 流量管理(Traffic Manager)

Traffic Manager提供了一整套API用于控制数据包输出的流量整形和服务质量QoS处理。

../_images/odp-tm.svg

ODP Transmit processing with Traffic Manager

报文处理的最后阶段是发包。 此时,应用程序有几个选择。 与RX处理一样,应用程序可以将数据包直接发送到PktIO TX队列进行直接传输。 但是,通常情况下,应用陈旭需要对包括作为发送处理的一部分流的分组执行流量整形和相关服务质量QoS处理。 为了满足这一需求,ODP提供了一套流量管理API,允许编码建立仲裁器,整形器等,以控制输出数据包处理实现所需要的QoS目标。 而且,这样做的优点是在许多平台上,流量管理功能都是硬件实现的,允许透明的卸载这个功能。