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

STM32 以太网MAC 地址Hash 过滤

[复制链接]
STMCU小助手 发布时间:2021-7-12 12:49
前言9 }$ N, V: h) t5 `5 Z
网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接收到的数据包进行过滤。STM32MCU的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标MAC  地址,源 MAC地址进行过滤,STM32H7系列还提供对 VLANtag和 IP地址,UDP/TCP端口的过滤。& |. O9 F8 Y' c
6 G3 s( B2 `6 ?
拿 MAC地址过滤来说,SM32MCU支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect地址过滤和 Hash地址过滤。( l  @4 Q0 v7 V4 v: c& \

! i$ L2 Q" V: e4 c* x' N: Y8 K. Yperfect地址过滤就是把接收到的以太网帧中的目标地址与 MAC地址寄存器中保存的地址进行比较,如果匹配,数据包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与MAC地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。0 P3 u0 s1 q! t7 R& f& t

$ l/ x- L) ?6 v4 L" j8 aHash地址过滤不是直接比较 MAC地址,而是计算目标 MAC地址的 CRC32值,取其高 6位作为索引去查询 Hash表寄存器中对应的值,来判断是否接收该数据帧。Hash地址过滤的方法稍微复杂,本文接下来将基于STM32H743Nucleo板,通过具体的例程介绍如何实现 Hash地址过滤。
1 {! T- c, |0 T" }: p
: K2 E, C9 ^% n' v; M
/ \# _1 }4 ^  s* d! hMAC 地址Hash 过滤
! X- b9 D% m& W* z" ^
) m$ W* L; T, u3 z3 |- Y/ L' N7 w过滤原理
3 C' E( o% {  R在 Hash地址过滤模式下,以太网 MAC通过一张 64位的 Hash表来进行过滤。这张表存储在两个 32位的寄存器中。STM32H743的寄存器 ETH_MACHT0R 保存着 Hash表的前 32位,ETH_MACHT1R中保存着 Hash表的后 32位值。/ a% D* }$ F* _0 H) ^. C' }; k
7 s5 T" c% n% j0 p, T% s' i( K5 n1 D
MAC接收到以太网帧后,会自动计算目标 MAC地址的 CRC值,然后用该 CRC值的高 6位,作为索引号去前面提到的 Hash表寄存器中查找对应位,如果该位的值是 1,则收到的以太网帧通过。否则就丢掉。例如,计算出的 CRC高6位是 0,则对应 ETH_MACHT0R的 bit0,如果该位是 1,则通过。
0 m& s! ^2 t; b8 A5 O& }8 R3 Z$ e  n2 k+ F
在初始化的时候,应该根据想要接收的目标 MAC地址,先设置好 ETH_MACHT0R和 ETH_MACHT1R寄存器的值。Hash地址过滤将 48位的 MAC地址,对应到 6位的 Hash值,肯定会出现多个MAC地址对应到一个 6位 Hash值的情况,所以这种过滤方式也被称作 imperfect过滤模式
5 r: m2 f! J) Y( ^' m' |) y
Hash值的计算方法, n) a5 z: f. `' d3 S2 v
Hash地址过滤模式,最关键的是如何计算6位的Hash值。在RM0433中介绍了 Hash的产生方法,具体如下:
" @4 {, S4 M; I3 a7 T; \1 q: Z& g8 h
4 j2 u4 Y1 Q/ k& [: a& ?. i  S1. 计算目标 MAC地址的 CRC32值。计算 CRC32的方法参见 IEEE802.3的第 3.2.8章中FCS的说明 。根据IEEE802.3中 CRC值的计算要求,和以太网帧中 MAC地址传输的顺序,MAC地址的 CRC值计算方法如下:
( R# V, l! X( \9 {9 t: z; O第一个 32位数据进行补码运算
; s* P4 m5 [. M+ ], W, C! ^& h输入的数据都进行按位反转顺序
- m% }+ o  L7 {+ G' V. q进行 CRC32计算,多项式为 0x4C11DB7
+ h4 I) D1 J; P. j- O9 T) K  B8 N- }对最终输出数据进行补码运算; {! k( U* q  P1 g# U5 c; X
2. 对第一步的计算值进行按位反转顺序. S! @& [( ~( z+ G) x
) _3 S, n* w! A) \; d# O8 o1 w
3. 取第二步计算值的高 6位  ?' _5 x& w! Y9 |4 v3 c" q) W
8 R0 \  }. p4 N$ O' \/ R, ?
然后就可以根据计算出来的 Hash值,去设置 ETH_MACHT0R和 ETH_MACHT1R寄存器了。+ L5 q* \* D# j3 {$ ?  D

; T8 x: L! _& l9 `MAC地址过滤的寄存器配置
/ m9 B" A( E& I# `7 {( h6 n8 r; h目标 MAC地址过滤的寄存器配置见下表:" Y/ b* i; l' N6 C: ]2 ]
微信图片_20210712124030.jpg
( E0 M9 d3 \1 b  @! N* d0 M' {. V% ~% q2 c9 K) U8 r" r
例程说明) V7 n0 w+ f6 G0 {7 ]5 a- X
下面我们将用一个例子来说明如何配置Hash地址过滤。' \( R& h* V3 F* Y
在该例程中,我们希望 STM32H743Nucleo板只接收广播,发往自己的单播 MAC地址的消息,以及两个特定多播MAC地址的消息。7 l$ e6 W  z3 Q- d  i( T
单播 MAC地址为:00:80:E1:00:00:00,
9 B% P0 @3 R: G多播 MAC地址为:01:0c:0d:01:01:03和 01: 00: 5e: a8: 00: 0a。
. k2 v$ X* z" ?例程中,我们需要做以下设置:
! n6 v/ a- b& d$ G1.  设置数据包过滤寄存器 ETH_MACPFR中相关位设置,使能单播perfect过滤,多播 Hash过滤,不屏蔽广播消息。5 b- e. Z! v5 S3 R: ]/ d& U
2.jpg " d! ]5 d5 x: T- y' g/ n
3 L- V- C9 `  V; r+ W
2.将单播地址设置到 ETH_MACA0HR和 ETH_MACA0LR中,并使能该地址。那么所有发往00:80:E1:00:00:00的单播数据包都能被收到,其他的单播数据包将被丢掉。
) f$ E+ Q" z( x
( Y2 x" g4 E5 S# \, j( c+ c8 h
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地址的多播消息,其他的多播消息都被丢掉。: E' l  \5 p0 \) {$ M. ^8 [5 I
7 V% X" z+ H7 ~; E" x  d
CRC外设初始化代码:
$ _8 b8 U4 r7 n9 F& Z# z: {+ Y 3.jpg % t% V# k# G/ }; R' G8 T4 X
计算并使能 HashMAC地址过滤的代码:
1 X6 d4 n: ~$ [5 s 4.jpg . Q- h1 Z" b7 D4 F% {8 K" X

5 d) a  Y. q; b  E: D7 P9 g6 b0 @2 Y运行结果将附件的例程烧录到H743Nucleo板,通过 XCAP连续发送下面的 6条消息。
+ h. l% D) S! Z1 }6 Q* j: u7 k 5.jpg 包括:4 J$ X7 [* t  g5 d9 z3 b' L5 W
两条单播消息,目标MAC地址分别是:00:80:E1:00:00:00和 02:00:00:00:00:00。$ Z$ R# z0 e* @& S! t$ D- i2 G
三条多播消息,目标 MAC地址分别是:01:0c:0d:01:01:03,01: 00: 5e: a8: 00:0a和 01:0c:0d:01:01:ff。
+ W* `* V* x' ^) w# `: g, |一条广播消息。
7 [  V1 c" Z/ ^/ F3 x2 [3 S. q6 n8 Q( Q从程序的打印信息里可以看到,H743Nucleo板接收到了其中的 4条消息,MAC地址没有设置的一条单播消息! I4 t+ Z9 z: E; @, c8 [
(02:00:00:00:00:00)和一条多播消息(01:0c:0d:01:01:ff)都被过滤掉了。
# b2 a( z1 S/ j7 Z0 \ 6.jpg 3 n* F8 ?, }  `: U; y* v. G

9 G& H3 _) Y6 g8 h  R8 N9 k) ]1 c, [& X

6 `3 k! U* y7 {8 b8 Y( ^% w# q: {9 u# B9 d5 U
赞 收藏 评论0 发布时间:2021-7-12 12:49

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版