目前 AMD 的以太网 IP 核,如软核 10G/25G,40G/50G 或者硬核 CMAC,MRMAC,DCMAC 等等,都采用的是同一种 Pause 帧处理方式。
这篇文章主要介绍了用户应当如何设置以太网 IP 的相关参数,使其能够有效处理以太网的 Pause 帧。
按照 IEEE802.3 协议,一个 Pause 帧是一个最小长度,即 64bytes 长的以太网帧,目标地址(DA)为一个广播地址 01-80-C2-00-01,Type 为 8808,Opcode 为 0001(Global)或者 0101(Priority)。具体细节请参考 IEEE802.3 协议。
PFC 结构如下所示:
AMD 以太网 IP,可以灵活的设置这些以太网 Pause 帧参数。例如通过设置如下 TX 侧的参数,包括 GPP(Global Pause Packet)的目标地址(DA),Ether Type,Opcode 等,这样 IP 会产生你所期望的任意数据包,作为你要的 Pause 帧发送出去。
同样,IP 也需要在 RX 侧做相应的设置,这样才能识别出 Pause 帧并进行处理。接下来重点介绍,如何在 RX 侧设置 Pause 帧的处理。
首先,IP 遵循如下 3 个 Steps,对收到的以太网帧进行处理:
Step1,如果通过了,则该以太网帧被认为是控制包,进入 Step2,并且不再出现在用户数据侧显示;只有将 ctl_rx_forward_control 设为 1 的时候,即使是控制包,IP 仍然会将其跟其它数据包一起输出到 RX 用户侧;如果 Step1 没通过,则该以太网帧为普通 RX 数据包。
Step2,如果通过了,则该以太网帧被确认为全局 Pause 帧;如果没通过,则进入 Step3。
Step3,如果通过了,则该以太网帧被确认为 Priority Pause 帧;如果没通过,则不是 Pause 帧,为其它类型控制帧。
也就是说,这里有四种特殊的以太网帧,分别是两种控制包 Global Control Packet(gcp),Priority Control Packet(pcp),和两种 Pause 帧 Global Pause Packet(gpp),Priority Pause Packet(ppp)。
IP 需要首先判断收到的是否是控制包(即 gcp 或 pcp),如果是,则先判断是否是 Global Pause 帧,再判断是否是 Priority Pause 帧。这几步判断,IP 都给了相应的参数,供用户设置,每一个条件,用户都可以选择是否要作检查。
文档里给出了 IP 是如何做判断的相关代码,如下:(由于某些新的 IP 文档尚未完善,如 DCMAC,如果缺失这部分内容,也是可以参考其它 IP 文档里的这一段内容)。
接下来,选取 Step2 中的两句,具体解释下,如何理解这个代码。其它部分可以类推。
先来看图中第二句,判断该以太网数据包为 Global Pause 帧(gpp),首先要满足 Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是 DA 符合,SA 符合,Etype 符合,Opcode 符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。
再来看第一句,Opcode 符合(assign opcode_match_gpp),是由后面两个条件“或”起来。这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;这就意味着,不打开这个使能表示代码不检测这个条件,任意数据都会被当作满足条件,所有数据包都会被认作 Pause 帧;使能打开后,才会要求后面的第二个条件符合才行,第二个条件即 RX 收到的数据包的该段数据,满足你设置的 ctl_rx_opcode_gpp,按照协议你应当将其设置为 0001。
总之,在设置完这些 Pause 帧相关参数后,就可以使用以太网 IP 的流控功能了。通过 stat_tx_pause 确认 IP 是否成功发出 Pause 帧,并通过 stat_rx_pause 确认 IP 是否能收到 Pause 帧。如果仍然无法成功接收到 Pause 帧,不要忘了将 ctl_rx_forward_control 设为 1,并在用户侧接收数据的地方,检查 IP 实际收到的数据包,并逐条对照之前的。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !