1、
PIP/PID从SGMII/1000BASE-X, XAUI/DXAUI/RXAUI, ILK, DPI 等接口 或者 PKO 反压通道中接收输入包数据
2、
MAC发送给PIP/IPD的每一个包都会被分配一个接口类型(pkind),从0到63,PDP/PIP利用这个pkind来决定配置
3、
每一个包也会被分配一个反压ID(bpid),从0-63,PIP/IPD利用这个反压ID进行计算buff空间,包括drop,RED,和backpressure
4、
PIP/IPD单元申请buff,并且把包数据写入buffer,写入的形式要和高层软件调用的一致,PIP/IPD支持可编程的buffer size,并且如果输入包size过大,可以将数据分布到多个buffer中存储。
5、
POP/IPD也会为每一个packet分配一个wqe节点,这个wqe节点包含指向2层到4层包头的 指针,对其进行硬件解析和包错误校验。PIP/IPD支持很多2到4层的包校验算法,例如TCP/UDP
6、
PIP/IPD在解析输入包之前可以跳过一个可配置大小的用户自定义数据,这可以pass掉用户自定义的报文数据,此单元还包括包解析头,用来调度和解析包数据信息来实现更深层次的控制
7、
port kinds (pkind)
PIP/IPD支持大量的输入通道和接口,从不同接口上来的包需要执行不同的操作
pkind就提供了一个特殊的解决方法来在不加重软硬件负担的情况下提供重组的可编程性,PIP/IPD用pkind来决定输入包将会被如何执行。
8、
PIP/IPD硬件可以从最多64哥pkind上接收包,软件会分配一个pkind给每一个port、ring、channel、interface
软件用GMX(0..4)_PRT(0..3)_CFG[PKND]寄存器来为每一个packet interface的port配置pkind,packet interface 这个寄存器能配置的模式包括:XAUI/DXAUI/RXAUI或者SGMII/1000BASE-X,即两类:XAUI类和SGMII类
9、
映射到一个pkind的接口上的报文的处理过程是一样的
10、
不同的接口可以指向相同的pkind,具有相同pkind的包通常也会有相同的反压id(bpid)
11、
反压id(bpid)
PIP/IPD为每一个packet分配0-63的反压ID
反压id的作用是PIP/IPD在阻止packet进入的时候反压回哪个接口?还是反压回原接口?
12、
重组buffer
PIP/IPD用64个重组buffer来提供packet buffer,每一个重组buffer中都有一部分packet,它标识一个包开始,不标识一个包结束
13、
很多种接口的硬件自动申请重组buffer
Interlaken类型的接口有44个重组buffer服务于它,如果超过44个packet,还没收到包结束标识,则丢弃此报文
14、
输入包格式和ip头之前的解析
PIP/IPD提供了三种不同的输入包解析方式
【1】翻译型
【2】直接跳到第二层头
【3】直接找到ip头,跳到ip头
15、
如果一个包没有解释头,PIP/IPD会根据包数据和配置来调度和解析这个包,典型的包解释头更便于PIP/IPD处理
16、
略
17、
packet 存储
PIP/IPD通常向L2/DRAM中写一份wqe packet的拷贝,并且会把packet的一部分或者全部写到wqe节点的WORD4-WORD15上
18、
一个packed没有存储到L2/DRAM上的几个原因:
【1】所有的packet都能存放到wqe节点的WORD4-WORD15上,所以L2/DRAM上的存储就冗余或者被忽略掉了
【2】packet被PIP/IPD选择为要drop掉,这种情况下,packet数据既不存放在L2/DRAM,也不存放在WQE节点上
【3】packet被丢弃,因为buffer超出了PIP/IPD
19、
packet存放在L2/DRAM上的情形:
PIP/IPD既申请buffer,又写buffer;它从free pool 0 上获取packet buffer。
20、
PIP/IPD将大包写入L2/DRAM的方法:
包如果很大,则PIP就会向FPA申请多个buffer,写数据进去,并且用指针将这些buffer连接起来。
这些buffer的第一个指针存放在wqe中,wqe中也会存放一共有多少个buffer来存放这个包,
21、PIP/IPD连续的存放packet,但是会在每一个buffer的头部空出一部分,软件可以用一个64位的word来配置一个buffer前不存放packet data的空间的大小,一共有两个配置值来配置每一个buffer顶端的这个保留距离
IPD_1ST_MBUFF_SKIP[SKIP_SZ]
IPD_NOT_1ST_MBUFF_SKIP[SKIP_SZ])
这个保留长度小至0字节多至32个64位字,软件也可以配置这个长度
22、
紧随其后的64位字单元的空间大小存放在IPD_PACKET_MBUFF_SIZE[MB_SIZE]中,这个值至少要比IPD_1ST_MBUFF_SKIP[SKIP_SZ]和IPD_NOT_1ST_MBUFF_SKIP[SKIP_SZ]大18个64-bit words,
略
23、
packet调度
PIP/IPD为每一个packet创建一个wqe节点,这个节点上包含以下几个对调度而言有用的字段
QOS:选择一个SSO input queue
GRP:选择work联系的组(决定这个wqe能调度到那些core)
TT:tag type
Tag
24、wqe详解:
word0中存的是各层头数据,和bpid(反压编号)和pknd(决定包会被如何处理)
word1中存的是调度信息
word2中存的是解码信息(包括ipd_port,包信息总览)
woed3中存的是第一个buffer的指针
woed4-15中存的是packet data
25、如果一个包被PIP/IPD分类为了一个短包,即在WQE结构体中就能储存的下全部内容,那么这个包就不需要在L2/DRAM中申请buffer,所以WORD2中的bufs字段就是0
26、IPD的QoS
在一般情况下,CN68XX的QoS有多重功能,PIP和IPD在packet的drop和back pressure操作中都扮演了重要角色
首先,当pool0耗尽,PIP/IPD会停止从任何CPU接口中接收任何包,这会导致包还未申请空间就被drop掉或者反压回入接口
有多种方法可以防止FPA pool耗尽
【1】反压,可以阻止包进入PIP/IPD,可以阻止CN68XX drop包,每一个接口都设置了一个反压id,(bpid)
【2】当PIP/IPD缓存包时,每个PIP/IPD的bpid都会增长,每从pool中申请一个wqe时,bpid也会增加,bpid可以阻止pool0的申请和包的到来,
【3】CN68XX对于pool0提供了每一个QoS的准入机制,当FPA pool 数量降低,PIP/IPD就可以丢包,不同的QoS可以设置不同的丢包FPA free pool剩余阀值
27、QoS管理丢包阀值的实现过程
PIP/IPD在发送packet到SSO之前,用pkind,配置变量,包解析数据来共同生成了8个QoS等级,每一个QoS等级都有
【1】独立的通过阀值和丢包阀值,用于调度
【2】独立的混合算法来计算FPA pool 允许的buffer数量平均值
28、
IPD_QOS(0..7)_RED_MARKS[PASS]和IPD_QOS(0..7)_RED_MARKS[DROP]两个字段控制
IPD_RED_QUE(0..7)_PARAM[PRB_CON]也需要有与其匹配的配置,才能使功能正确的执行
相应硬件会定期为这8个QoS计算丢弃的可能,(计算时间是一个周期的1/256?)
29、
有两种情况会丢包:
首先,丢包是由于FPA pool 耗尽所导致,FPA pool耗尽的原因有两种
【1】输入XAUI速率太高,直接将FPA pool占满
【2】输出command FPA pool与输入FPA pool相比太少,导致输入pool中的work发送不出去,输入FPA pool 得不到释放,这种情况也称作反压
30、
word中的QoS字段
SSO单元的输入队列是用于存work的,对于RAWFULL和RAWSCH类型的包,QOS是PKT_INST_HDR[QOS] 的值,经查找,这个值位于SLI_PKT(0..31)_INSTR_HEADE寄存器中,和DPI/SLI相关