一. 前言
以太網上數據非常多,如果所有數據都接收交給軟件去處理軟件負載會非常重,所以一般只需要接收發(fā)給自己的數據即可,過濾掉不必要的數據,這樣軟件只處理自己需要的數據,軟件負擔更小更高效,CAN等總線也有類似的硬件過濾機制,意義基本類似。這就需要用到過濾功能,一般接收廣播地址,和目的是本MAC地址的包即可。
參考手冊9 Packet Filtering。
二.包過濾的序列
過程如下
先進行第二層即數據鏈路層MAC幀的過濾(根據MAC幀的MAC源地址目的地址)
然后進行第二層VLAN過濾
然后進行第三層網絡層的IP包的過濾(根據IP報的IP源地址目的地址)
最后進行第四層傳輸層TCP/UDP包的過濾(根據TCP/UDP報的源和目的端口)
最基本的是MAC幀的過濾,所以重點介紹該方式的過濾。
三. MAC幀過濾介紹
3.1 MAC地址寄存器
MAC_HW_Feature0 寄存器(偏移0x11c)的位ADDMACADRSEL[22:18]可以查詢啟用的附加的1~31的MAC地址寄存器的個數
位MACADR64SEL[24]為1表示啟用附加的64~127共64個MAC地址寄存器
位MACADR32SEL[23]為1表示啟用附加的32~63共32個MAC地址寄存器
我這里的配置是
(gdb) x /1xw 0x0116011C
0x116011c: 0x1a0d1122
(gdb)
[24]= 0
[23]= 0
[22:18] = 00011 = 3
所以只有額外的3個MAC地址寄存器,一共4個0是總是有的。
對應的寄存器為
MAC_Address(#i)_High31_1 i=1 i<=3-1=2 高16位
MAC_Address(#i)_Low31_1 低32位
這里
MACADR64SEL和MACADR32SEL都為0所以沒有3263,64127的寄存器。
該寄存器需要軟件初始化時配置
注如下表達式中DWC_EQOS_ADD_MAC_ADDR_REG-1應該不需要-1,應該是文檔錯誤,因為
DWC_EQOS_ADD_MAC_ADDR_REG****即表示個數,0總是存在的所以從1開始,n個就是1到n,比如這里為3就是1~3,3個額外的,還有0共4個。
MAC_Address(#i)_High31_1 (for i = 1; i <= DWC_EQOS_ADD_MAC_ADDR_REG-1)
(0x0008*i)+0x0300
AE[31]=1 使能該地址作為過濾 寄存器0只讀始終是使能的
SA[30]=0 使用寄存器值[47:0]和接收包的DA比對,相同則接收;=1 使用寄存器值[47:0]和接收包的SA比對,相同則接收。 寄存器0沒有。
MBC[29:24] 6個bit分別對應6字節(jié)MAC地址的對應字節(jié),對應位為1則不比較對應字節(jié)。
低位對應最后面的字節(jié)。寄存器0沒有。
DCS[x:16] 匹配的數據將路由到該DMA通道去,對于單DMA則保留。
ADDRHI[15:0] MAC地址的高16位
MAC_Address(#i)_Low31_1 (for i = 1; i <= DWC_EQOS_ADD_MAC_ADDR_REG-1)
ADDRLO[31:0] MAC地址的低32位。
如下可以看到0已經配置了,后面還有3個1~3(從初始值0xFFFFFFFF可以看出)
3.2地址過濾Hash表
地址過濾Hash表的使能可以通過寄存器
MAC_HW_Feature1(0x120) 的位HASHTBLSZ[25:24]查詢
00 無Hash表
01:64
10:128
11:256
我這里的值是
(gdb) x /1xw 0x01160120
0x1160120: 0x00000944
(gdb)
[25:24]=00,即沒有使能Hash表。
四. 過濾模式配置
4.0 過濾模式配置寄存器
MAC_Packet_Filter寄存器0x08
控制過濾模式
RA[31] 設置為1表示接收所有的包(但是Rx Status Word還是會更新過濾是否通過的狀態(tài)),設置為0則根據過濾結果控制是否接收。
調試階段可以設置為1,以便進行接收測試。
DNTU[21] 設置為1,MAC會丟棄非TCP或UDP 的 IP數據包。必須IPFE時才有效。
IPFE[20] 設置為1使能3層 4層過濾。
VTFE[16] 設置為1使能VLAN Tag過濾
HPF[10] 設置為1使能Hash或者Perfert過濾(即寄存器匹配)
SAF[9] 設置為1使能源地址過濾
SAIF[8] 設置為1 源地址過濾反邏輯,即匹配的丟棄,不匹配的接收。
PCF[7:6]
00:MAC過濾掉所有控制數據包
01: MAC接收除了Pause包外的所有控制包,哪怕是地址匹配失敗
10 MAC接收所有控制包,哪怕是地址匹配失敗
11: MAC接收所有通過地址過濾的控制包
DBF[5]: 設置為1不接收廣播包
PM[4]: 設置為1接收所有多播包,即MAC地址的第一個bit為1.
設置為0則由HMC決定。
DAIF[3]: 設置為1則DA匹配之后反邏輯接收,即匹配的不接收。
HMC[2]: 設置為1DA 多播地址根據Hash匹配,否則使用寄存器匹配
HUC[1]: 設置為1DA 單播地址根據Hash匹配,否則使用寄存器匹配
PR[0]: 設置為1則不匹配SA DA都接收,甚至狀態(tài)位都清除Rx Status Word
此模式可以作為監(jiān)控模式,接收所有數據。
4.1 單播目的地址過濾
HUC[1]設置為0
MacAddr1到MacAddr127地址用單獨的使能位來使能。對于MacAddr1到MacAddr31地址,可以通過在寄存器中設置相應的掩碼字節(jié)控制位,在與相應的接收DA字節(jié)進行比較時屏蔽指定字節(jié)。允許對DA進行組地址篩選。MacAddr32到MacAddr127地址沒有掩碼控制,并且將MAC地址的所有6字節(jié)與接收到的DA/SA的6字節(jié)進行比較
在哈希過濾模式下(當設置了HUC位時),MAC使用64位哈希表對單播地址執(zhí)行不完美的過濾。對于哈希過濾,MAC使用接收到的目的地地址的高6位CRC來索引哈希表的內容。值00000選擇所選寄存器的位0,值11111選擇哈希表寄存器的位63。如果對應的比特(由6比特CRC指示)被設置為1,則單播分組被認為已經通過了哈希濾波器;否則,數據包被認為未通過哈希過濾器
4.2 多播放目的地址過濾
PM[4]設置為1否則由HMC決定多播的接收。
將多播地址與編程的MAC目的地地址寄存器(1-31)進行比較。還支持組地址篩選
在哈希過濾模式下,MAC使用64位哈希表執(zhí)行不完美過濾。MAC使用接收到的多播地址的高6位CRC來索引哈希表的內容。值000000選擇所選寄存器的位0,值111111選擇哈希表寄存器的位63。如果對應的比特被設置為1,則多播分組被認為已經通過了哈希過濾器。否則,數據包被認為未通過哈希過濾器
4.3 哈?;蛲昝赖刂泛Y選
HPF[10]配置是使用哈希還是完美地址(寄存器匹配)過濾模式
配合HUC HMC配置多播和單播是使用哈希還是完美地址過濾模式
這適用于單播和多播數據包。如果HPF位被重置,則只有一個濾波器(Hash或Perfect)被應用于接收到的數據包。
4.4廣播過濾
默認情況下,MAC不過濾任何廣播數據包。設置MAC_Packet_Filter寄存器中的DBF位為1不接收廣播包。
4.5 單播源地址過濾
MAC地址寄存器的Bit 30設置為1比較SA否則比較DA。
MAC還支持SA的組過濾。通過屏蔽地址的一個或多個字節(jié)來過濾一組地址。如果MAC_Packet_filter寄存器的SAF位置位,則MAC丟棄未通過SA過濾器的數據包。否則,SA過濾器的結果作為接收狀態(tài)字中的狀態(tài)位給出(Table 2-16 Receive Status at the MAC Interface)。當SAF位被設置時,SA濾波器和DA濾波器結果被“與”以決定是否需要接收。這意味著,如果任何一個過濾器失敗,數據包都會被丟棄。只有當數據包按順序通過兩個過濾器時,才會將數據包轉發(fā)給應用程序
4.6 反邏輯
對于DA和SA過濾,可以通過設置MAC_Packet_filter寄存器的DAIF和SAIF位,在最終輸出時反轉過濾器匹配結果。
DAIF位適用于單播和多播DA數據包。單播或多播目的地地址篩選器的結果在此模式中反轉。類似地,當SAIF比特被設置時,單播SA濾波器的結果被反轉。
五. 其他層級過濾
還有以下過濾,用時可以參考手冊
VLAN過濾
擴展Rx VLAN過濾和路由
擴展Rx VLAN篩選和路由
六. 過濾測試
按照一般的配置DA匹配,接收目的地址DA是本設備MAC地址的包和廣播包。
MAC的默認配置實際就是這樣的。
寄存器0總是使能的,DA匹配,只需要填入本設備MAC地址即可,
低字節(jié)先發(fā)送如下對應FCF29FE93C18的MAC地址。
MAC_Address0_High,MAC_Address0_Low
(gdb) x /20xw 0x01160300
0x1160300: 0x8000183c 0xe99ff2fc 0x0000ffff 0xffffffff
0x1160310: 0x0000ffff 0xffffffff 0x0000ffff 0xffffffff
0x1160320: 0x00000000 0x00000000 0x00000000 0x00000000
0x1160330: 0x00000000 0x00000000 0x00000000 0x00000000
0x1160340: 0x00000000 0x00000000 0x00000000 0x00000000
使能廣播包
(gdb) x /1xw 0x01160008
0x1160008: 0x00000000
(gdb)
使用MAC回環(huán)測試。
測試廣播地址能收到
tx_buffer[0]=0xFF;
tx_buffer[1]=0xFF;
tx_buffer[2]=0xFF;
tx_buffer[3]=0xFF;
tx_buffer[4]=0xFF;
tx_buffer[5]=0xFF;
測試目的地址匹配能收到
tx_buffer[0]=0xFC;
tx_buffer[1]=0xF2;
tx_buffer[2]=0x9F;
tx_buffer[3]=0xE9;
tx_buffer[4]=0x3C;
tx_buffer[5]=0x18;
測試非廣播地址非目的地址匹配不能收到
tx_buffer[0]=0xFC;
tx_buffer[1]=0xF2;
tx_buffer[2]=0x9F;
tx_buffer[3]=0xE9;
tx_buffer[4]=0x3C;
tx_buffer[5]=0x19;
以上說明過濾符合預期。
七. 總結
MAC支持的過濾多種多樣,支持多個層級的過濾,最通常的就是接收廣播地址和DA是和本設備MAC地址完全一樣的包。
-
驅動器
+關注
關注
54文章
8481瀏覽量
148561 -
嵌入式
+關注
關注
5125文章
19438瀏覽量
313051 -
以太網
+關注
關注
40文章
5547瀏覽量
174185 -
寄存器
+關注
關注
31文章
5401瀏覽量
122775 -
過濾器
+關注
關注
1文章
436瀏覽量
20076 -
VLAN通信
+關注
關注
0文章
18瀏覽量
5702
發(fā)布評論請先 登錄
相關推薦
基于DWC_ether_qos的以太網驅動開發(fā)-MAC幀格式介紹

基于DWC_ether_qos的以太網驅動開發(fā)-描述符鏈表介紹

基于DWC_ether_qos的以太網驅動開發(fā)-數據流驗證過程

基于DWC_ether_qos的以太網驅動開發(fā)-收發(fā)驅動編寫與調試

基于DWC_ether_qos的以太網驅動開發(fā)-無OS環(huán)境移植LWIP

基于DWC_ether_qos的以太網驅動開發(fā)-LWIP的內存池介紹

基于DWC_ether_qos的以太網驅動開發(fā)-LWIP的堆管理介紹

基于DWC_ether_qos的以太網驅動開發(fā)-RTOS環(huán)境移植LWIP與性能測試

基于DWC_ether_qos的以太網驅動開發(fā)-LWIP在PC上進行開發(fā)調試

基于DWC_ether_qos的以太網驅動開發(fā)-LWIP的ARP模塊介紹

DesignWare核心以太網服務質量數據本
基于DWC_ether_qos的以太網驅動開發(fā)-軟復位介紹與問題案例

基于DWC_ether_qos的以太網驅動開發(fā)-描述符格式介紹

評論