一. 前言
以太網(wǎng)上數(shù)據(jù)非常多,如果所有數(shù)據(jù)都接收交給軟件去處理軟件負(fù)載會非常重,所以一般只需要接收發(fā)給自己的數(shù)據(jù)即可,過濾掉不必要的數(shù)據(jù),這樣軟件只處理自己需要的數(shù)據(jù),軟件負(fù)擔(dān)更小更高效,CAN等總線也有類似的硬件過濾機(jī)制,意義基本類似。這就需要用到過濾功能,一般接收廣播地址,和目的是本MAC地址的包即可。
參考手冊9 Packet Filtering。
二.包過濾的序列
過程如下
先進(jìn)行第二層即數(shù)據(jù)鏈路層MAC幀的過濾(根據(jù)MAC幀的MAC源地址目的地址)
然后進(jìn)行第二層VLAN過濾
然后進(jìn)行第三層網(wǎng)絡(luò)層的IP包的過濾(根據(jù)IP報的IP源地址目的地址)
最后進(jìn)行第四層傳輸層TCP/UDP包的過濾(根據(jù)TCP/UDP報的源和目的端口)
最基本的是MAC幀的過濾,所以重點(diǎn)介紹該方式的過濾。
三. MAC幀過濾介紹
3.1 MAC地址寄存器
MAC_HW_Feature0 寄存器(偏移0x11c)的位ADDMACADRSEL[22:18]可以查詢啟用的附加的1~31的MAC地址寄存器的個數(shù)
位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是總是有的。
對應(yīng)的寄存器為
MAC_Address(#i)_High31_1 i=1 i<=3-1=2 高16位
MAC_Address(#i)_Low31_1 低32位
這里
MACADR64SEL和MACADR32SEL都為0所以沒有3263,64127的寄存器。
該寄存器需要軟件初始化時配置
注如下表達(dá)式中DWC_EQOS_ADD_MAC_ADDR_REG-1應(yīng)該不需要-1,應(yīng)該是文檔錯誤,因?yàn)?/strong>
DWC_EQOS_ADD_MAC_ADDR_REG****即表示個數(shù),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分別對應(yīng)6字節(jié)MAC地址的對應(yīng)字節(jié),對應(yīng)位為1則不比較對應(yīng)字節(jié)。
低位對應(yīng)最后面的字節(jié)。寄存器0沒有。
DCS[x:16] 匹配的數(shù)據(jù)將路由到該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已經(jīng)配置了,后面還有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] 設(shè)置為1表示接收所有的包(但是Rx Status Word還是會更新過濾是否通過的狀態(tài)),設(shè)置為0則根據(jù)過濾結(jié)果控制是否接收。
調(diào)試階段可以設(shè)置為1,以便進(jìn)行接收測試。
DNTU[21] 設(shè)置為1,MAC會丟棄非TCP或UDP 的 IP數(shù)據(jù)包。必須IPFE時才有效。
IPFE[20] 設(shè)置為1使能3層 4層過濾。
VTFE[16] 設(shè)置為1使能VLAN Tag過濾
HPF[10] 設(shè)置為1使能Hash或者Perfert過濾(即寄存器匹配)
SAF[9] 設(shè)置為1使能源地址過濾
SAIF[8] 設(shè)置為1 源地址過濾反邏輯,即匹配的丟棄,不匹配的接收。
PCF[7:6]
00:MAC過濾掉所有控制數(shù)據(jù)包
01: MAC接收除了Pause包外的所有控制包,哪怕是地址匹配失敗
10 MAC接收所有控制包,哪怕是地址匹配失敗
11: MAC接收所有通過地址過濾的控制包
DBF[5]: 設(shè)置為1不接收廣播包
PM[4]: 設(shè)置為1接收所有多播包,即MAC地址的第一個bit為1.
設(shè)置為0則由HMC決定。
DAIF[3]: 設(shè)置為1則DA匹配之后反邏輯接收,即匹配的不接收。
HMC[2]: 設(shè)置為1DA 多播地址根據(jù)Hash匹配,否則使用寄存器匹配
HUC[1]: 設(shè)置為1DA 單播地址根據(jù)Hash匹配,否則使用寄存器匹配
PR[0]: 設(shè)置為1則不匹配SA DA都接收,甚至狀態(tài)位都清除Rx Status Word
此模式可以作為監(jiān)控模式,接收所有數(shù)據(jù)。
4.1 單播目的地址過濾
HUC[1]設(shè)置為0
MacAddr1到MacAddr127地址用單獨(dú)的使能位來使能。對于MacAddr1到MacAddr31地址,可以通過在寄存器中設(shè)置相應(yīng)的掩碼字節(jié)控制位,在與相應(yīng)的接收DA字節(jié)進(jìn)行比較時屏蔽指定字節(jié)。允許對DA進(jìn)行組地址篩選。MacAddr32到MacAddr127地址沒有掩碼控制,并且將MAC地址的所有6字節(jié)與接收到的DA/SA的6字節(jié)進(jìn)行比較
在哈希過濾模式下(當(dāng)設(shè)置了HUC位時),MAC使用64位哈希表對單播地址執(zhí)行不完美的過濾。對于哈希過濾,MAC使用接收到的目的地地址的高6位CRC來索引哈希表的內(nèi)容。值00000選擇所選寄存器的位0,值11111選擇哈希表寄存器的位63。如果對應(yīng)的比特(由6比特CRC指示)被設(shè)置為1,則單播分組被認(rèn)為已經(jīng)通過了哈希濾波器;否則,數(shù)據(jù)包被認(rèn)為未通過哈希過濾器
4.2 多播放目的地址過濾
PM[4]設(shè)置為1否則由HMC決定多播的接收。
將多播地址與編程的MAC目的地地址寄存器(1-31)進(jìn)行比較。還支持組地址篩選
在哈希過濾模式下,MAC使用64位哈希表執(zhí)行不完美過濾。MAC使用接收到的多播地址的高6位CRC來索引哈希表的內(nèi)容。值000000選擇所選寄存器的位0,值111111選擇哈希表寄存器的位63。如果對應(yīng)的比特被設(shè)置為1,則多播分組被認(rèn)為已經(jīng)通過了哈希過濾器。否則,數(shù)據(jù)包被認(rèn)為未通過哈希過濾器
4.3 哈希或完美地址篩選
HPF[10]配置是使用哈希還是完美地址(寄存器匹配)過濾模式
配合HUC HMC配置多播和單播是使用哈希還是完美地址過濾模式
這適用于單播和多播數(shù)據(jù)包。如果HPF位被重置,則只有一個濾波器(Hash或Perfect)被應(yīng)用于接收到的數(shù)據(jù)包。
4.4廣播過濾
默認(rèn)情況下,MAC不過濾任何廣播數(shù)據(jù)包。設(shè)置MAC_Packet_Filter寄存器中的DBF位為1不接收廣播包。
4.5 單播源地址過濾
MAC地址寄存器的Bit 30設(shè)置為1比較SA否則比較DA。
MAC還支持SA的組過濾。通過屏蔽地址的一個或多個字節(jié)來過濾一組地址。如果MAC_Packet_filter寄存器的SAF位置位,則MAC丟棄未通過SA過濾器的數(shù)據(jù)包。否則,SA過濾器的結(jié)果作為接收狀態(tài)字中的狀態(tài)位給出(Table 2-16 Receive Status at the MAC Interface)。當(dāng)SAF位被設(shè)置時,SA濾波器和DA濾波器結(jié)果被“與”以決定是否需要接收。這意味著,如果任何一個過濾器失敗,數(shù)據(jù)包都會被丟棄。只有當(dāng)數(shù)據(jù)包按順序通過兩個過濾器時,才會將數(shù)據(jù)包轉(zhuǎn)發(fā)給應(yīng)用程序
4.6 反邏輯
對于DA和SA過濾,可以通過設(shè)置MAC_Packet_filter寄存器的DAIF和SAIF位,在最終輸出時反轉(zhuǎn)過濾器匹配結(jié)果。
DAIF位適用于單播和多播DA數(shù)據(jù)包。單播或多播目的地地址篩選器的結(jié)果在此模式中反轉(zhuǎn)。類似地,當(dāng)SAIF比特被設(shè)置時,單播SA濾波器的結(jié)果被反轉(zhuǎn)。
五. 其他層級過濾
還有以下過濾,用時可以參考手冊
VLAN過濾
擴(kuò)展Rx VLAN過濾和路由
擴(kuò)展Rx VLAN篩選和路由
六. 過濾測試
按照一般的配置DA匹配,接收目的地址DA是本設(shè)備MAC地址的包和廣播包。
MAC的默認(rèn)配置實(shí)際就是這樣的。
寄存器0總是使能的,DA匹配,只需要填入本設(shè)備MAC地址即可,
低字節(jié)先發(fā)送如下對應(yīng)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;
以上說明過濾符合預(yù)期。
七. 總結(jié)
MAC支持的過濾多種多樣,支持多個層級的過濾,最通常的就是接收廣播地址和DA是和本設(shè)備MAC地址完全一樣的包。
-
驅(qū)動器
+關(guān)注
關(guān)注
52文章
8226瀏覽量
146251 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304793 -
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5419瀏覽量
171594 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120229 -
過濾器
+關(guān)注
關(guān)注
1文章
428瀏覽量
19593 -
VLAN通信
+關(guān)注
關(guān)注
0文章
18瀏覽量
5635
發(fā)布評論請先 登錄
相關(guān)推薦
評論