你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 以太网MAC 地址Hash 过滤

[复制链接]
STMCU小助手 发布时间:2021-7-12 12:49
前言
# }% V  }- Y9 K  Q" n5 d) N网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接收到的数据包进行过滤。STM32MCU的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标MAC  地址,源 MAC地址进行过滤,STM32H7系列还提供对 VLANtag和 IP地址,UDP/TCP端口的过滤。, C* e+ o' e7 Q" l
& {. q6 x" V: Z7 o$ a1 a/ `: D2 O
拿 MAC地址过滤来说,SM32MCU支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect地址过滤和 Hash地址过滤。
- Y0 `' z/ M4 c/ S0 a8 d
8 h/ H% c) v* Gperfect地址过滤就是把接收到的以太网帧中的目标地址与 MAC地址寄存器中保存的地址进行比较,如果匹配,数据包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与MAC地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。
6 Y/ y: `! \8 |4 b " ~( f! K, x7 M6 U/ C7 y3 I
Hash地址过滤不是直接比较 MAC地址,而是计算目标 MAC地址的 CRC32值,取其高 6位作为索引去查询 Hash表寄存器中对应的值,来判断是否接收该数据帧。Hash地址过滤的方法稍微复杂,本文接下来将基于STM32H743Nucleo板,通过具体的例程介绍如何实现 Hash地址过滤。, ^9 I  M& h4 Q% `

) t) Q8 C' V! Z9 F; K) ~
9 s: {9 G: _# L0 [7 }+ K' `' |MAC 地址Hash 过滤
7 |& b& A+ j0 [. W/ B
. S+ \0 o0 P5 x1 Z5 V1 Z. a3 S过滤原理
% b# M4 X9 _6 {, R2 c% J: H% W在 Hash地址过滤模式下,以太网 MAC通过一张 64位的 Hash表来进行过滤。这张表存储在两个 32位的寄存器中。STM32H743的寄存器 ETH_MACHT0R 保存着 Hash表的前 32位,ETH_MACHT1R中保存着 Hash表的后 32位值。& d7 U& X5 r0 x7 Y
' B7 G6 `5 {2 p7 w+ N- F+ t0 c' z! K
MAC接收到以太网帧后,会自动计算目标 MAC地址的 CRC值,然后用该 CRC值的高 6位,作为索引号去前面提到的 Hash表寄存器中查找对应位,如果该位的值是 1,则收到的以太网帧通过。否则就丢掉。例如,计算出的 CRC高6位是 0,则对应 ETH_MACHT0R的 bit0,如果该位是 1,则通过。5 N. v3 P6 c4 c( k4 }4 e+ e" X

* L+ j) y: o- V" `在初始化的时候,应该根据想要接收的目标 MAC地址,先设置好 ETH_MACHT0R和 ETH_MACHT1R寄存器的值。Hash地址过滤将 48位的 MAC地址,对应到 6位的 Hash值,肯定会出现多个MAC地址对应到一个 6位 Hash值的情况,所以这种过滤方式也被称作 imperfect过滤模式3 [% ]' y  G0 J
Hash值的计算方法
/ L) d6 K4 h# N9 AHash地址过滤模式,最关键的是如何计算6位的Hash值。在RM0433中介绍了 Hash的产生方法,具体如下:7 b5 t- y7 A! ?) ?; @6 R& y( ^

& h/ W3 `3 k' x" G1. 计算目标 MAC地址的 CRC32值。计算 CRC32的方法参见 IEEE802.3的第 3.2.8章中FCS的说明 。根据IEEE802.3中 CRC值的计算要求,和以太网帧中 MAC地址传输的顺序,MAC地址的 CRC值计算方法如下:3 b# c6 R  m: m7 F3 ~
第一个 32位数据进行补码运算
9 ^( o0 ~8 p% O  V' V7 ~" g. ]2 K输入的数据都进行按位反转顺序, U. `8 e8 Q8 x7 f4 ]2 ?
进行 CRC32计算,多项式为 0x4C11DB7  ]5 v5 Y$ L+ }! H; R8 g
对最终输出数据进行补码运算
! C% k3 r- f% R. _2 G) u2. 对第一步的计算值进行按位反转顺序
( u* E$ j* X  p% M" B  X: Y/ {) Q& ?7 O8 B/ z6 r9 ?
3. 取第二步计算值的高 6位
" v) e  D. J6 Z! \9 Y1 B7 W
1 P" s2 l& }; J& Q) j1 k4 `' E然后就可以根据计算出来的 Hash值,去设置 ETH_MACHT0R和 ETH_MACHT1R寄存器了。' B4 Z* `+ c! Y0 S2 K
' D" V$ C6 y5 o) z$ V8 ?
MAC地址过滤的寄存器配置; v5 l/ }9 \( X# `8 p+ c: h# J
目标 MAC地址过滤的寄存器配置见下表:* @6 D. H' R3 J$ V
微信图片_20210712124030.jpg
2 O# Y2 S. ?' X, }0 e+ o" d# }6 Q2 R0 o5 J1 b9 d4 S1 ?
例程说明- R1 V. w6 N5 n# p/ V5 t" R
下面我们将用一个例子来说明如何配置Hash地址过滤。
( Q0 g1 l( s) V7 K在该例程中,我们希望 STM32H743Nucleo板只接收广播,发往自己的单播 MAC地址的消息,以及两个特定多播MAC地址的消息。
. U, K. c' l0 L. T8 c单播 MAC地址为:00:80:E1:00:00:00,7 b' n5 @7 t$ x4 I/ ^: w- _
多播 MAC地址为:01:0c:0d:01:01:03和 01: 00: 5e: a8: 00: 0a。+ J7 D. K3 R- b4 P3 a( K
例程中,我们需要做以下设置:: ?9 j6 X9 L) ?$ r$ S
1.  设置数据包过滤寄存器 ETH_MACPFR中相关位设置,使能单播perfect过滤,多播 Hash过滤,不屏蔽广播消息。. {- B& u) k$ U+ k0 X
2.jpg
) G- y1 @+ R( `' R1 u) ~0 D5 b1 z1 Y! a
2.将单播地址设置到 ETH_MACA0HR和 ETH_MACA0LR中,并使能该地址。那么所有发往00:80:E1:00:00:00的单播数据包都能被收到,其他的单播数据包将被丢掉。5 n4 g; z( I* l' k
  o: ?6 Y2 w6 ]. Y' m4 v8 T6 l, l
3.设置 Hash过滤表寄存器。在初始化以太网外设时,利用 STM32H743的 CRC外设自动计算 MAC地址的 CRC32值,再得到对应的 Hash值,根据该值去初始化ETH_MACHT0R和 ETH_MACHT1R寄存器。H743Nucleo将可以接收发往 01:0c:0d:01:01:03和 01:00: 5e: a8: 00: 0a MAC地址的多播消息,其他的多播消息都被丢掉。
7 U2 `( j& X: j/ ]6 f ( ~  x: f) G! D7 t  v2 f
CRC外设初始化代码:1 x) J, @4 ^. R( U+ Q2 |# c
3.jpg
( y2 B" U1 x& c6 a* ~计算并使能 HashMAC地址过滤的代码:6 Z5 q: _3 n6 i6 K' |0 }6 S
4.jpg 3 Y+ H3 @8 l+ A1 M
+ D' F8 m. E' \* ~
运行结果将附件的例程烧录到H743Nucleo板,通过 XCAP连续发送下面的 6条消息。: _$ ?$ }, j2 k0 E
5.jpg 包括:
8 `/ E9 s# G( u; K! i4 ~+ A3 a1 o. K两条单播消息,目标MAC地址分别是:00:80:E1:00:00:00和 02:00:00:00:00:00。
& D& _4 V1 y5 l1 I7 M6 A+ W$ C三条多播消息,目标 MAC地址分别是:01:0c:0d:01:01:03,01: 00: 5e: a8: 00:0a和 01:0c:0d:01:01:ff。2 l$ J7 \3 V7 p) H; v# O+ Y* X# b
一条广播消息。
  r: K& a: e) a/ N- f; `. D从程序的打印信息里可以看到,H743Nucleo板接收到了其中的 4条消息,MAC地址没有设置的一条单播消息$ y8 S$ O* \- _) {& D. U0 a
(02:00:00:00:00:00)和一条多播消息(01:0c:0d:01:01:ff)都被过滤掉了。
$ T& g3 ]% ~% W3 |$ |3 H 6.jpg ) B) F! h& I' O* u

8 G! [1 z0 R0 `7 P$ S  M1 z7 X  S6 f- m% ?: g- {1 X5 ?1 W- p! G

+ V: A' S. A$ k2 p* o# K
; j% B( l% Q5 }+ ?, U
收藏 评论0 发布时间:2021-7-12 12:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版