LAT0750
Local Application Tips
LAT0750 Rev 0.3 2020
STM32 以太网 MAC 地址 Hash 过滤
关键词:
MAC
地址,
Hash
过滤
前言
网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接
收到的数据包进行过滤。STM32MCU 的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标 MAC
址,源 MAC 地址进行过滤,STM32H7 系列还提供对 VLAN tag IP 地址,UDP/TCP 端口的过滤。
MAC 地址过滤来说,SM32MCU 支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过
滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect 地址过滤和 Hash 地址过滤。
perfect 地址过滤就是把接收到的以太网帧中的目标地址与 MAC 地址寄存器中保存的地址进行比较,如果匹配,数据
包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与
MAC 地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。
Hash 地址过滤不是直接比较 MAC 地址,而是计算目标 MAC 地址的 CRC32 值,取其高 6位作为索引去查询 Hash
寄存器中对应的值,来判断是否接收该数据帧。Hash 地址过滤的方法稍微复杂,本文接下来将基于
STM32H743Nucleo 板,通过具体的例程介绍如何实现 Hash 地址过滤。
MAC 地址 Hash 过滤
过滤原理
Hash 地址过滤模式下,以太网 MAC 通过一张 64 位的 Hash 表来进行过滤。这张表存储在两个 32 位的寄存器中。
STM32H743 的寄存器 ETH_MACHT0R 保存着 Hash 表的前 32 位,ETH_MACHT1R 中保存着 Hash 表的后 32
值。
MAC 接收到以太网帧后,会自动计算目标 MAC 地址的 CRC 值,然后用该 CRC 值的高 6位,作为索引号去前面提到
Hash 表寄存器中查找对应位,如果该位的值是 1,则收到的以太网帧通过。否则就丢掉。例如,计算出的 CRC
6位是 0,则对应 ETH_MACHT0R bit0,如果该位是 1则通过。
在初始化的时候,应该根据想要接收的目标 MAC 地址,先设置好 ETH_MACHT0R ETH_MACHT1R 寄存器的值。
Hash 地址过滤将 48 位的 MAC 地址,对应到 6位的 Hash 值,肯定会出现多个 MAC 址对应到一个 6Hash 值的
情况,所以这种过滤方式也被称作 imperfect 过滤模式。
Hash 算方法
Hash 地址过滤模式,最关键的就是如何计算 6位的 Hash 值。
RM0433 中介绍了 Hash 产生方法,具体如下:
LAT0750
LAT0750 - Rev 0.3 page 2/6
1.计算目标 MAC 地址的 CRC32 值。计算 CRC32 的方法参IEEE802.3 的第 3.2.8 章中 FCS 的说明 。根据
IEEE802.3 CRC 值的计算要求,和以太网帧中 MAC 地址传输的顺序,MAC 地址的 CRC 值计算方法如下:
第一个 32 位数据进行补码运算
输入的数据都进行按位反转顺序
进行 CRC32 计算,多项式为 0x4C11DB7
对最终输出数据进行补码运算
2. 对第一步的计算值进行按位反转顺序
3.取第二步计算值的高 6
然后就可以根据计算出来的 Hash 值,去设置 ETH_MACHT0R ETH_MACHT1R 寄存器了。
MAC 地址过滤的寄存器配置
目标 MAC 地址过滤的寄存器配置见下表
例程
下面我们将用一个例子来说明如何配置 Hash 地址过滤。
在该例程中,我们希望 STM32H743Nucleo 板只接收广播,发往自己的单播 MAC 地址的消息,以及两个特定多播
MAC 地址的消息。