一. 前言
以太网上数据非常多,如果所有数据都接收交给软件去处理软件负载会非常重,所以一般只需要接收发给自己的数据即可,过滤掉不必要的数据,这样软件只处理自己需要的数据,软件负担更小更高效,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文章
8149浏览量
145942 -
嵌入式
+关注
关注
5067文章
19008浏览量
302890 -
以太网
+关注
关注
40文章
5371浏览量
171024 -
寄存器
+关注
关注
31文章
5308浏览量
119975 -
过滤器
+关注
关注
1文章
427浏览量
19549 -
VLAN通信
+关注
关注
0文章
18浏览量
5629
发布评论请先 登录
相关推荐
评论