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

STM32 以太网MAC 地址Hash 过滤

[复制链接]
STMCU小助手 发布时间:2021-7-12 12:49
前言
8 }  D0 D& W$ ]9 z: G" m网络中传递着各种各样的数据包,当设备连接到网络后,为了减少对接收到的数据进行处理的负荷,就需要对设备接收到的数据包进行过滤。STM32MCU的以太网外设提供多种数据包过滤的模式。可以根据以太网帧的目标MAC  地址,源 MAC地址进行过滤,STM32H7系列还提供对 VLANtag和 IP地址,UDP/TCP端口的过滤。
4 R' _# s& Q, a2 P& Y# \   a# d0 V( S* |# t5 U& G7 k# i. }
拿 MAC地址过滤来说,SM32MCU支持:单播目标地址过滤,多播目标地址过滤,单播源地址过滤和广播地址过滤。单播目标地址过滤和多播目标地址过滤又分为:Perfect地址过滤和 Hash地址过滤。
: K6 U9 e0 F' L$ U9 Q" V: m! E" l+ D  n0 s: ~9 _) \  y
perfect地址过滤就是把接收到的以太网帧中的目标地址与 MAC地址寄存器中保存的地址进行比较,如果匹配,数据包就被接受,否则就被丢掉。还可以通过设置“反向过滤”,来翻转过滤的结果,接收到的以太网帧中的目标地址与MAC地址寄存器中保存的地址如果不匹配,数据包就被接收,否则就被丢掉。
) b/ S+ a  W! t+ D* _
/ R; u% K4 w' JHash地址过滤不是直接比较 MAC地址,而是计算目标 MAC地址的 CRC32值,取其高 6位作为索引去查询 Hash表寄存器中对应的值,来判断是否接收该数据帧。Hash地址过滤的方法稍微复杂,本文接下来将基于STM32H743Nucleo板,通过具体的例程介绍如何实现 Hash地址过滤。
* C  k5 g5 E9 l2 I% G
3 w, x4 }/ A1 G# D( |" a + i8 I6 N- o& m' H0 o" [  c* c5 ?
MAC 地址Hash 过滤
7 X, ?% E( ?5 f1 O  H' T
: \  z) U9 J  n9 q6 Y& V+ {0 z1 l过滤原理+ B4 u, ]* z5 r( u& a4 ]$ Z+ u( x
在 Hash地址过滤模式下,以太网 MAC通过一张 64位的 Hash表来进行过滤。这张表存储在两个 32位的寄存器中。STM32H743的寄存器 ETH_MACHT0R 保存着 Hash表的前 32位,ETH_MACHT1R中保存着 Hash表的后 32位值。
* c! q& @. N: x3 M8 ?
/ c. F3 r* e/ f% q9 YMAC接收到以太网帧后,会自动计算目标 MAC地址的 CRC值,然后用该 CRC值的高 6位,作为索引号去前面提到的 Hash表寄存器中查找对应位,如果该位的值是 1,则收到的以太网帧通过。否则就丢掉。例如,计算出的 CRC高6位是 0,则对应 ETH_MACHT0R的 bit0,如果该位是 1,则通过。- l' v4 w. r  x! F+ ]# {6 j: Z, e
6 H' ^) v3 m% N* a+ c/ k' K
在初始化的时候,应该根据想要接收的目标 MAC地址,先设置好 ETH_MACHT0R和 ETH_MACHT1R寄存器的值。Hash地址过滤将 48位的 MAC地址,对应到 6位的 Hash值,肯定会出现多个MAC地址对应到一个 6位 Hash值的情况,所以这种过滤方式也被称作 imperfect过滤模式
! z$ J0 V0 k: M6 X3 m
Hash值的计算方法7 E" {$ u. Y4 s  a. z' N
Hash地址过滤模式,最关键的是如何计算6位的Hash值。在RM0433中介绍了 Hash的产生方法,具体如下:
: z4 r% [9 @0 _% q, Y$ ^1 t3 S9 q. R% Y" ]" p# d
1. 计算目标 MAC地址的 CRC32值。计算 CRC32的方法参见 IEEE802.3的第 3.2.8章中FCS的说明 。根据IEEE802.3中 CRC值的计算要求,和以太网帧中 MAC地址传输的顺序,MAC地址的 CRC值计算方法如下:
) d3 ^! t% L8 j  o3 y  i/ ^第一个 32位数据进行补码运算1 x7 p. x0 S( N5 z+ ]5 R
输入的数据都进行按位反转顺序  O! a( x) f) ^/ Y0 T* s1 z5 ?, \
进行 CRC32计算,多项式为 0x4C11DB7
: y8 ]* r0 O) v1 h对最终输出数据进行补码运算
3 ]# }) ^2 ~5 e& E3 D' X2 x4 ?2. 对第一步的计算值进行按位反转顺序
' h7 z# k, v. ^7 o5 _, i
# v) q5 @7 m! ]# r3. 取第二步计算值的高 6位
  w/ w( X# z# F" J$ D: M9 R0 R) b: D/ e+ H# z, ^2 L6 r
然后就可以根据计算出来的 Hash值,去设置 ETH_MACHT0R和 ETH_MACHT1R寄存器了。- h( O7 h3 b1 R- q! J

" }: ?$ B9 O9 o7 }/ ~) j) L$ LMAC地址过滤的寄存器配置
1 J3 J8 g+ v, m目标 MAC地址过滤的寄存器配置见下表:, G  Y1 p+ ~6 \  Y$ b) \, s: e
微信图片_20210712124030.jpg
% w) ~- [- v0 W. U# \
& a% e- Q" h$ T例程说明3 z4 h6 Z& D+ x9 U6 |/ W+ @
下面我们将用一个例子来说明如何配置Hash地址过滤。9 z) p7 U0 t& V
在该例程中,我们希望 STM32H743Nucleo板只接收广播,发往自己的单播 MAC地址的消息,以及两个特定多播MAC地址的消息。) t7 S9 x" e: L0 V6 n  N
单播 MAC地址为:00:80:E1:00:00:00,  q& o8 Y" d+ V2 q, I: B! z
多播 MAC地址为:01:0c:0d:01:01:03和 01: 00: 5e: a8: 00: 0a。
- w) ?" O7 z7 o/ o+ L! R; E例程中,我们需要做以下设置:, {; Y2 q  X, E( L/ w1 R. v
1.  设置数据包过滤寄存器 ETH_MACPFR中相关位设置,使能单播perfect过滤,多播 Hash过滤,不屏蔽广播消息。
- h7 Y0 }% |6 W+ K: D4 E 2.jpg & o4 x$ x$ U" Z" M6 b& B; w
* C# L' a1 g% P2 Z
2.将单播地址设置到 ETH_MACA0HR和 ETH_MACA0LR中,并使能该地址。那么所有发往00:80:E1:00:00:00的单播数据包都能被收到,其他的单播数据包将被丢掉。
. O; B+ _1 q% T4 m" F: q, `
: {/ A0 a& A* x, d& v, w! V
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地址的多播消息,其他的多播消息都被丢掉。* s. V( b1 i( ~( Y- D# N

  F9 V! R5 [+ ~CRC外设初始化代码:
2 U7 A2 u$ k+ W) m$ g3 J 3.jpg
2 F& o8 o' f* _8 S$ h' g计算并使能 HashMAC地址过滤的代码:8 p, w/ K7 N" U; W9 H% q
4.jpg 3 O+ T& m5 H$ y* M

5 N: }% |" Q. w% o运行结果将附件的例程烧录到H743Nucleo板,通过 XCAP连续发送下面的 6条消息。
9 G% V7 s  C+ ]2 m4 G 5.jpg 包括:! B; ], D$ {/ G5 @6 M. L
两条单播消息,目标MAC地址分别是:00:80:E1:00:00:00和 02:00:00:00:00:00。
" G" Q/ v. e1 s- \: E4 s1 k$ N三条多播消息,目标 MAC地址分别是:01:0c:0d:01:01:03,01: 00: 5e: a8: 00:0a和 01:0c:0d:01:01:ff。
  L# {# j% k- u+ B8 z0 R' Y一条广播消息。
/ b! v3 y: w1 A) i8 T, b& k4 O从程序的打印信息里可以看到,H743Nucleo板接收到了其中的 4条消息,MAC地址没有设置的一条单播消息
: A# H5 @( A" x0 S) A(02:00:00:00:00:00)和一条多播消息(01:0c:0d:01:01:ff)都被过滤掉了。
5 l( |- O  z9 A 6.jpg
! W: M9 R/ z. ]6 ^3 F8 P2 t3 J3 u  i8 y

5 U2 A- k1 c$ L# a6 Q4 G7 \
5 z/ v- E9 Z) v% T. q! [2 s' X% q7 j, \' g: e1 J; c8 ~
收藏 评论0 发布时间:2021-7-12 12:49

举报

0个回答

所属标签

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