0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DWC_ether_qos的以太網(wǎng)驅(qū)動開發(fā)-包過濾

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-09-02 09:19 ? 次閱讀

一. 前言

以太網(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幀的過濾,所以重點介紹該方式的過濾。

圖片

三. 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)該是文檔錯誤,因為

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地址用單獨的使能位來使能。對于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)配置實際就是這樣的。

寄存器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地址完全一樣的包。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 驅(qū)動器
    +關(guān)注

    關(guān)注

    52

    文章

    8054

    瀏覽量

    145613
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18906

    瀏覽量

    300699
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5317

    瀏覽量

    170461
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5268

    瀏覽量

    119640
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    424

    瀏覽量

    19484
  • VLAN通信
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    5625
收藏 人收藏

    評論

    相關(guān)推薦

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MAC幀格式介紹

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MAC幀格式介紹 (qq.com) 一.前言 ? 在以太網(wǎng)
    的頭像 發(fā)表于 08-30 09:23 ?2070次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-MAC幀格式介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫與測試

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫與測試 一.前言
    的頭像 發(fā)表于 08-30 09:37 ?3440次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-MDIO<b class='flag-5'>驅(qū)動</b>編寫與測試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-描述符鏈表介紹

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 一.描述符概述 1.0 前言 對于DWC Ethernet QoS驅(qū)動的編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發(fā)表于 08-30 09:39 ?4149次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-描述符鏈表介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-數(shù)據(jù)流驗證過程

    轉(zhuǎn)自公眾號歡迎關(guān)注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-數(shù)據(jù)流驗證過程
    的頭像 發(fā)表于 08-31 08:41 ?1776次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-數(shù)據(jù)流驗證過程

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-收發(fā)驅(qū)動編寫與調(diào)試

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-收發(fā)驅(qū)動編寫與調(diào)試 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-05 08:47 ?2060次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-收發(fā)<b class='flag-5'>驅(qū)動</b>編寫與調(diào)試

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

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-無OS環(huán)境移植LWIP (qq.com) https://mp.weixin.qq.com/s
    的頭像 發(fā)表于 09-06 08:40 ?1417次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-無OS環(huán)境移植LWIP

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的內(nèi)存池介紹

    ,protocol控制塊,緩存等。在memp.c下實現(xiàn)。 LWIP的內(nèi)存池有兩種方式實現(xiàn),通過宏MEMP_MEM_MALLOC配置,默認(rèn)opt.h中配置為0. 配置為1使用mem_malloc
    的頭像 發(fā)表于 09-07 08:45 ?1491次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP的內(nèi)存池介紹

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

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP的堆管理介紹 (qq.com) https://mp.weixin.qq.com/s
    的頭像 發(fā)表于 09-08 08:40 ?1135次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP的堆管理介紹

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

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-RTOS環(huán)境移植LWIP與性能測試 (qq.com) https://mp.weixin.qq.com/s
    的頭像 發(fā)表于 09-11 11:20 ?1787次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-RTOS環(huán)境移植LWIP與性能測試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP在PC上進(jìn)行開發(fā)調(diào)試

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-LWIP在PC上進(jìn)行開發(fā)調(diào)試 (qq.com) https://mp
    的頭像 發(fā)表于 09-11 08:40 ?1798次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP在PC上進(jìn)行<b class='flag-5'>開發(fā)</b>調(diào)試

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

    TCP/IP通訊第一步需要先調(diào)通ARP,否則TCP/IP都不知道MAC地址要發(fā)給誰。這一篇來基于LWIP的ARP實現(xiàn)進(jìn)行相關(guān)的分析。
    的頭像 發(fā)表于 09-18 09:34 ?1629次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-LWIP的ARP模塊介紹

    設(shè)計軟件核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)手冊免費下載

    本文描述Synopsys設(shè)計軟件核心以太網(wǎng)服務(wù)質(zhì)量DWC以太網(wǎng)QoS核心5.10A。DWC以太網(wǎng)
    發(fā)表于 10-23 08:00 ?16次下載
    設(shè)計軟件核心<b class='flag-5'>以太網(wǎng)</b>服務(wù)質(zhì)量數(shù)據(jù)手冊免費下載

    DesignWare核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)本

      本文檔介紹Synopsys DesignWare核心以太網(wǎng)服務(wù)質(zhì)量(DWC_Ethernet_qos)核心,5.10a。DWC_Ethernet_qos實現(xiàn)了與MAC層相關(guān)的以太網(wǎng)
    發(fā)表于 03-31 15:11 ?3次下載

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-軟復(fù)位介紹與問題案例

    一般模塊都會有軟復(fù)位的功能,軟復(fù)位在驅(qū)動編寫中很重要。一般初始化時執(zhí)行軟復(fù)位使得模塊進(jìn)入確定的初始狀態(tài)以提高可靠性,異常時也可以重新初始化來恢復(fù),所以軟復(fù)位在驅(qū)動中一般是必須要做的動作。
    的頭像 發(fā)表于 09-02 09:17 ?1391次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-軟復(fù)位介紹與問題案例

    基于DWC_ether_qos以太網(wǎng)驅(qū)動開發(fā)-描述符格式介紹

    前面我們介紹了描述符鏈表的工作模式,重點是了解環(huán)形鏈表是如何環(huán)形的,以及相關(guān)的寄存器。驅(qū)動編寫就需要更進(jìn)一步,了解描述符的具體內(nèi)容,即4個描述符的每個字段的含義。
    的頭像 發(fā)表于 09-04 14:14 ?2146次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-描述符格式介紹