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 地址对应到一个 6位Hash 值的
情况,所以这种过滤方式也被称作 imperfect 过滤模式。
Hash 值的计算方法
Hash 地址过滤模式,最关键的就是如何计算 6位的 Hash 值。
在RM0433 中介绍了 Hash 的产生方法,具体如下: