以下一家之言,未必准确!
STM32 MAC
multicast 过滤有
/** @defgroup ETH_Multicast_Frames_Filter ETH Multicast Frames Filter
* @{
*/
#define ETH_MULTICASTFRAMESFILTER_PERFECTHASHTABLE 0x00000404U
#define ETH_MULTICASTFRAMESFILTER_HASHTABLE 0x00000004U
#define ETH_MULTICASTFRAMESFILTER_PERFECT 0x00000000U
#define ETH_MULTICASTFRAMESFILTER_NONE 0x00000010U
NONE 是不过滤 来了就收,perfect统统不收,
那么哈希过滤是啥?大概查了一下:
https://www.stmcu.org.cn/faq/index/detail/id-6961,
问:
组播过滤ETH->MACHTHR的设置
答:64位的HASH列表可以用来进行成组的地址过滤。进行HASH过滤时,帧的目的地址输入CRC逻辑,并取CRC值的高6位检索HASH列表。32位的CRC计算多项式如下,详见第27.5.3节:MAC帧的接收。 G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 这个CRC值的最高位(MSB)决定使用哪个寄存器(Hash列表高寄存器或者Hash列表低寄存器),剩下的5位决定检查寄存器里的哪一位。HASH值为0b00000的对应选中寄存器的位0,HASH值为0b11111的对应选中寄存器的位31。 例如,输入帧的目的地址是0x1F52 419C B6AF(MII接口最先接收到的字节是0x1F),则计算出的CRC值高6位是0x2C,因此用HTH的位12进行HASH过滤。如果输入帧的目的地址是0xA00A 9800 0045,则算出的HASH值是0x07,用HTL的位7来进行HASH过滤。 如果HASH寄存器对应的位是’1’,则MAC就接受这个帧;否则,MAC就丢弃这个帧。如果ETH_MACFFR寄存器的PAM位(通过全部多播帧)为’1’,那么无论HASH过滤结果如何,MAC接受所有的多播帧。回答者:安 回答时间:2013-07-17
本博主个人建议是大部分场合用NONE,,对于高负载靠算法处理。这样通用性好一点,否则经常需要手算这个哈希值。