前言
網絡中傳遞著各種各樣的數據包,當設備連接到網絡后,為了減少對接收到的數據進行處理的負荷,就需要對設備接收到的數據包進行過濾。STM32MCU的以太網外設提供多種數據包過濾的模式。可以根據以太網幀的目標MAC 地址,源 MAC地址進行過濾,STM32H7系列還提供對 VLANtag和 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的產生方法,具體如下:
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地址的消息。
單播 MAC地址為:00E100:00,
多播 MAC地址為:010d01:03和 01: 00: 5e: a8: 00: 0a。
例程中,我們需要做以下設置:
1.設置數據包過濾寄存器 ETH_MACPFR中相關位設置,使能單播perfect過濾,多播 Hash過濾,不屏蔽廣播消息。
2.將單播地址設置到 ETH_MACA0HR和 ETH_MACA0LR中,并使能該地址。那么所有發往00E100:00的單播數據包都能被收到,其他的單播數據包將被丟掉。
3.設置 Hash過濾表寄存器。在初始化以太網外設時,利用 STM32H743的 CRC外設自動計算 MAC地址的 CRC32值,再得到對應的 Hash值,根據該值去初始化ETH_MACHT0R和 ETH_MACHT1R寄存器。H743Nucleo將可以接收發往 010d01:03和 01:00: 5e: a8: 00: 0a MAC地址的多播消息,其他的多播消息都被丟掉。
CRC外設初始化代碼:
計算并使能 HashMAC地址過濾的代碼:
運行結果
將附件的例程燒錄到H743Nucleo板,通過 XCAP連續發送下面的 6條消息。
包括:
兩條單播消息,目標MAC地址分別是:00E100:00和 020000:00。
三條多播消息,目標 MAC地址分別是:010d01:03,01: 00: 5e: a8: 00:0a和 010d01:ff。
一條廣播消息。
從程序的打印信息里可以看到,H743Nucleo板接收到了其中的 4條消息,MAC地址沒有設置的一條單播消息
(020000:00)和一條多播消息(010d01:ff)都被過濾掉了。
責任編輯:haq
-
以太網
+關注
關注
40文章
5419瀏覽量
171603 -
STM32
+關注
關注
2270文章
10895瀏覽量
355744 -
Mac
+關注
關注
0文章
1104瀏覽量
51458
原文標題:工程師筆記 | STM32 以太網MAC 地址Hash 過濾
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論