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

如何逐步使用vRealize Automation REST API来部署蓝图
平安城市建设进入全新阶段,智能化视频监控发展迅猛
怎样减少排针
iphone8什么时候上市?iphone8最新消息:苹果iphone8十周年之际或推出AR眼镜等惊喜
扫描陕西省健康码和身份证核验就用远景达健康码核验终端
基于DWC_ether_qos的以太网驱动开发-包过滤
通过采用STM32芯片与MCU实现智能电机保护器的设计
美国网络谣言:口罩含有5G天线,被跟踪还会引发癌症
互联汽车中远程信息技术硬件的四个设计注意事项
机器视觉边缘检测算法步骤
realme Buds Air真无线耳机将于2020年1月7日正式发布
新型的送货机器人怎样才能工作好
Cuk 拓扑电源原理及工作过程解析
.NET8性能优化之线程
前瞻6G趋势 三大运营商扬帆创新征途
如何基于 ES6 的 JavaScript 进行 TensorFlow.js 的开发
日本研究人员开发出一个由LED芯片构成的可植入式装置,可有效地治疗肿瘤
加速传感器ADXL150特性及其精度影响因素
可编程语音芯片IVR1061应用电路图
时刻继电器的类型与构造原理简析