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

描述

一. 前言

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分