0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC_ether_qos的以太网驱动开发-包过滤

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-09-02 09:19 次阅读

一. 前言

以太网上数据非常多,如果所有数据都接收交给软件去处理软件负载会非常重,所以一般只需要接收发给自己的数据即可,过滤掉不必要的数据,这样软件只处理自己需要的数据,软件负担更小更高效,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字节MAC地址的对应字节,对应位为1则不比较对应字节。

低位对应最后面的字节。寄存器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还是会更新过滤是否通过的状态),设置为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都接收,甚至状态位都清除Rx Status Word

此模式可以作为监控模式,接收所有数据。

4.1 单播目的地址过滤

HUC[1]设置为0

MacAddr1到MacAddr127地址用单独的使能位来使能。对于MacAddr1到MacAddr31地址,可以通过在寄存器中设置相应的掩码字节控制位,在与相应的接收DA字节进行比较时屏蔽指定字节。允许对DA进行组地址筛选。MacAddr32到MacAddr127地址没有掩码控制,并且将MAC地址的所有6字节与接收到的DA/SA的6字节进行比较

在哈希过滤模式下(当设置了HUC位时),MAC使用64位哈希表对单播地址执行不完美的过滤。对于哈希过滤,MAC使用接收到的目的地地址的高6位CRC来索引哈希表的内容。值00000选择所选寄存器的位0,值11111选择哈希表寄存器的位63。如果对应的比特(由6比特CRC指示)被设置为1,则单播分组被认为已经通过了哈希滤波器;否则,数据包被认为未通过哈希过滤器

4.2 多播放目的地址过滤

PM[4]设置为1否则由HMC决定多播的接收。

将多播地址与编程的MAC目的地地址寄存器(1-31)进行比较。还支持组地址筛选

在哈希过滤模式下,MAC使用64位哈希表执行不完美过滤。MAC使用接收到的多播地址的高6位CRC来索引哈希表的内容。值000000选择所选寄存器的位0,值111111选择哈希表寄存器的位63。如果对应的比特被设置为1,则多播分组被认为已经通过了哈希过滤器。否则,数据包被认为未通过哈希过滤器

4.3 哈希或完美地址筛选

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的组过滤。通过屏蔽地址的一个或多个字节来过滤一组地址。如果MAC_Packet_filter寄存器的SAF位置位,则MAC丢弃未通过SA过滤器的数据包。否则,SA过滤器的结果作为接收状态字中的状态位给出(Table 2-16 Receive Status at the MAC Interface)。当SAF位被设置时,SA滤波器和DA滤波器结果被“与”以决定是否需要接收。这意味着,如果任何一个过滤器失败,数据包都会被丢弃。只有当数据包按顺序通过两个过滤器时,才会将数据包转发给应用程序

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地址即可,

低字节先发送如下对应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回环测试。

测试广播地址能收到

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地址完全一样的包。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    52

    文章

    8081

    浏览量

    145753
  • 嵌入式
    +关注

    关注

    5056

    文章

    18955

    浏览量

    301677
  • 以太网
    +关注

    关注

    40

    文章

    5334

    浏览量

    170710
  • 寄存器
    +关注

    关注

    31

    文章

    5284

    浏览量

    119773
  • 过滤器
    +关注

    关注

    1

    文章

    425

    浏览量

    19506
  • VLAN通信
    +关注

    关注

    0

    文章

    18

    浏览量

    5626
收藏 人收藏

    评论

    相关推荐

    基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-MAC帧格式介绍 (qq.com) 一.前言   在以太网
    的头像 发表于 08-30 09:23 2157次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MAC帧格式介绍

    基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-MDIO驱动编写与测试 一.前言
    的头像 发表于 08-30 09:37 3540次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-MDIO<b class='flag-5'>驱动</b>编写与测试

    基于DWC_ether_qos以太网驱动开发-描述符链表介绍

    本文转自公众号欢迎关注 一.描述符概述 1.0 前言 对于DWC Ethernet QoS驱动的编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list
    的头像 发表于 08-30 09:39 4266次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-描述符链表介绍

    基于DWC_ether_qos以太网驱动开发-数据流验证过程

    转自公众号欢迎关注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太网驱动开发-数据流验证过程
    的头像 发表于 08-31 08:41 1842次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据流验证过程

    基于DWC_ether_qos以太网驱动开发-收发驱动编写与调试

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-收发驱动编写与调试 (qq.com) https://mp.wei
    的头像 发表于 09-05 08:47 2150次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-收发<b class='flag-5'>驱动</b>编写与调试

    基于DWC_ether_qos以太网驱动开发-无OS环境移植LWIP

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-无OS环境移植LWIP (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-06 08:40 1454次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-无OS环境移植LWIP

    基于DWC_ether_qos以太网驱动开发-LWIP的内存池介绍

    ,protocol控制块,缓存等。在memp.c下实现。 LWIP的内存池有两种方式实现,通过宏MEMP_MEM_MALLOC配置,默认opt.h中配置为0. 配置为1使用mem_malloc
    的头像 发表于 09-07 08:45 1571次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的内存池介绍

    基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP的堆管理介绍 (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-08 08:40 1171次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的堆管理介绍

    基于DWC_ether_qos以太网驱动开发-RTOS环境移植LWIP与性能测试

    本文转自公众号,欢迎关注 基于DWC_ether_qos以太网驱动开发-RTOS环境移植LWIP与性能测试 (qq.com) https://mp.weixin.qq.com/s
    的头像 发表于 09-11 11:20 1854次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-RTOS环境移植LWIP与性能测试

    基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发调试

    本文转自公众号欢迎关注 基于DWC_ether_qos以太网驱动开发-LWIP在PC上进行开发调试 (qq.com) https://mp
    的头像 发表于 09-11 08:40 1844次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP在PC上进行<b class='flag-5'>开发</b>调试

    基于DWC_ether_qos以太网驱动开发-LWIP的ARP模块介绍

    TCP/IP通讯第一步需要先调通ARP,否则TCP/IP都不知道MAC地址要发给谁。这一篇来基于LWIP的ARP实现进行相关的分析。
    的头像 发表于 09-18 09:34 1692次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-LWIP的ARP模块介绍

    设计软件核心以太网服务质量数据手册免费下载

    本文描述Synopsys设计软件核心以太网服务质量DWC以太网QoS核心5.10A。DWC以太网
    发表于 10-23 08:00 16次下载
    设计软件核心<b class='flag-5'>以太网</b>服务质量数据手册免费下载

    DesignWare核心以太网服务质量数据本

      本文档介绍Synopsys DesignWare核心以太网服务质量(DWC_Ethernet_qos)核心,5.10a。DWC_Ethernet_qos实现了与MAC层相关的以太网
    发表于 03-31 15:11 3次下载

    基于DWC_ether_qos以太网驱动开发-软复位介绍与问题案例

    一般模块都会有软复位的功能,软复位在驱动编写中很重要。一般初始化时执行软复位使得模块进入确定的初始状态以提高可靠性,异常时也可以重新初始化来恢复,所以软复位在驱动中一般是必须要做的动作。
    的头像 发表于 09-02 09:17 1463次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-软复位介绍与问题案例

    基于DWC_ether_qos以太网驱动开发-描述符格式介绍

    前面我们介绍了描述符链表的工作模式,重点是了解环形链表是如何环形的,以及相关的寄存器。驱动编写就需要更进一步,了解描述符的具体内容,即4个描述符的每个字段的含义。
    的头像 发表于 09-04 14:14 2252次阅读
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太网</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-描述符格式介绍