1、一般包收发过程:一般情况下,网卡收到数据包后通过DMA映射到指定的内存位置,然后中断通知CPU来取数据包,经过几次内存拷贝后到达协议栈。为了加速包的处理效率,一些CPU采用各种协处理器来帮助完成包的处理。
2、Cavium的OCTEON为网络做了大量优化,主要包括数量众多的协处理器,不同的协处理器完成特定的任务,大大简化了软件的复杂度提高了性能,并且能够从硬件上保证一些特性比如包保序。
3、FPA:Free Pool Alloctor主要负责分配收发包过程中的packet work entry以及packet的data buffer和PKO command buffer。
4、对FPA的操作主要有三种:
对FPA的操作主要有三种:
buffer_allocte(synchronous): core会等待可用的buffer返回或者是返回的NULL
buffer_allocte(asynchronous): core不会等待buffer地址返回,而是在之后的时间里会从特定位置接受到buffer地址
buffer_free(synchronous): 这个操作会把buffer地址返还到特定的FPA pool
5、主要使用了FPA 0 1 2,0负责在收到packet后存储packet buffer data部分,1负责对packet header部分进行简单hash后的信息存储,2是pko command buffers。在banfflite的一个BUG中人为的在FPA0中分配packet buffer的时候会出现crash的现象,Cavium的人就此给出一个workaround就是建议在FPA4中分配packet buffer去发送这个包,但是OCTEON在硬件上规定收包必须用FPA0.因此packet buffer的大小就是2176。
6、PIP/IPD
这个协处理器的主要作用就是从interface上比如:SGMII XAUI口上收到数据后由PIP对数据包的头部进行5-tuple的计算后得到这个包的WQE(Work Queue Entry)和group tag Qos类提交给SSO所需要的数据,而IPD则是将收到的数据包的数据部分copy到data FPA中申请的fpa buffer中去。这个协处理器提供收包以及包的最简单的CRC 错误检查以及丢弃操作,OCTEON也提供另外一种收包方法,在不用PIP/IPD的时候可以使用内核的NAPI的方式使用cnMIPS core的poll方式来进行收包。
检查packet,包括L2/L3头部的错误
提供拥塞控制,可在PIP部分丢掉部分包
创建WQE(Work Queue Entry)
决定提供给SSO的WQE的包属性(Group Qos Tag-Type Tage-Value)
把收到的包存储在PIP/IPD内部的buffer和RAM中
发送WQE到SSO完成调度
一般配置流程:
一个core调用: cvmx_helper_initialize_packet_io_global()
每个core都调用: cvmx_helper_initialize_packet_io_local()
使用cvmx_pip*和cvmx_ipd*来配置PIP/IPD
使用:cvmx_helper_ipd_and_packet_input_enable()打开收包功能