1、简介
PKO从L2/DRAM上收集数据,然后将数据发送到SGMII,XAUI,ILK,DPI等接口上,PKO也可以将一个包回环到包输入上。
PKO可以将一个包同时发送到多达21个不同的接口或者目的地,每一个接口或者目的都能收到一个线性的包数据
2、PKO架构
左边是包输出队列,core在需要发送包的时候会将包发送到256个包输出队列之一,输出接口/目的地在右边,紧接着映射的管道值,这个值用来管理反压。PKO硬件实现了一个多级分布式算法来将一个packet发送到1到20个PKO DMA引擎上,包含128个PKO内部限制速率接口
PKO硬件支持256个output 队列,每一个队列都是L2/DRAM中的一段命令,每一个包传输过程都是一个在output 队列的命令,内核软件在放一个命令到output队列上之后会写一个doorbell寄存器(用来存储命令执行状态),PKO在发送完一个packet之后会执行提交一个work节点或者清空L2/DRAM
PKO硬件有两种模式来将L2/DRAM中的包片段给连到一起:link模式和true-gather模式,并且可以在发送完一个packet之后清除存放packet的空间,PKO硬件是大端的,它也会在读完所有片段的命令字之后清除命令队列buf。
每一个PKO内部接口都会有数个连续的output队列与其连接,最多32个,PKO的每一个内部接口都有byte计数和packet计数
每一个PKO DMA 引擎都可以最多抓取8个in-flight包,并区分每一个包是连接的到本PKO DMA的中多接口中的一哪个接口上的包,并且有校验算法
3、
下面是PKO的内部架构:
packet data和queue cmd通过PKO总线进入到L2/DRAM单元,PKO硬件通过PKO总线传送packet data给各种CPU接口,PKO通过IO总线传送回环包给PIP/IPD,当包数据块释放,FAU寄存器减少,work 节点减少,L2/DRAM写0,output doorbell的写操作也会通过IO总线到达PKO。
4、
interfaces:
PKO硬件发送数据给多达21个不同种类的接口
5、输出包格式和TCP/UDP校验插入方法
如果一个packet的cmd没有直接给PKO来进行TCP/UDP的校验,则不需要任何format限制,在这中情况下,PKO简单的把output包翻译为一个byte流,包中会包含L2头,一个IP包,和其他字段,但PKO单元并不会解析它们。
如果一个packet的cmd直接给PKO进行TCP/UDP检验,这个cmd中就会格外的包含一个指示IP包的第一个byte的字段,TCP/UDP L4校验需要以下条件:
略
4、output queue
每一个outputqueue都是一些块链接而成,软件申请这些块,PKO硬件释放这些块,PKO硬件从这个output queue中读words,并且如果是这个chunk的最后一个word,则它的next指针会指向下一个chunk
chunk的大小由一个结构体决定,最小为16个64bit word,最后的word指向下一个chunk,全部的其他word里都放有有效的cmd,每一个cmd都有提供PKO发送一个packet的信息,cmd被命名为N到N+9,越先进去的cmd ,num越小,先进去的cmd被先send出去,每一条cmd长度为2或3个word
PKO硬件保存output queue的尾指针,core软件保存头指针,想要向queue中插入一个packet,
软件必须先向queue中写入一个cmd 字,申请chunks,在PKO doorbell 中写需要多少数量的word空间。
软件必须在 doorbell 写操作到达PKO之前保证L2/DRAM上有doorbell 写操作要求的数量的word空间。
头指针和尾指针的距离既是输出队列的size,又是doorbell的count,core必须保证每一个queue长度小于2的20次方个word。【这里可能影响性能,增加每一个ipd_port管理的输出队列的个数解决】
PKO硬件会在doorbell 的count指出下一个chunk上有有效的命令时立即去读下一个chunk,这意味着软件必须申请next chunk空间,并且要立即将这个空间和上一个chunk的尾指针关联起来 。
软件可以用任何长度的cmd触发这个doorbell,或者为每一条cmd执行doorbell写操作,
PKO硬件可以设置256,128,64,32几种可能的输出队列,设置寄存器为QUEUE_MODE,
5、command格式
PKO在一个queue访问到有效command的时候会从L2/DRAM中读packet data,并发送到一个接口上。
每个command都能【1】分辨PKO能否计算和插入IP/TCP的校验头【2】分辨用gather还是用link模式来组包,在其他情况下,PKO硬件从L2/DRAM中读packet数据段,并且能释放packet回FPA pool,