/net/ipmr.c中的MFC_HASH

我正在组播,并在linux代码(ipmr.c)中遇到这个散列。 据我所知,散列表的大小是64.而MFC_HASH的IP目的地址是最高的8位,源IP地址的高6位。 它与63进行异或运算,因此结果肯定在0-63之间。

请查找以下代码以获取更多信息。

struct mr_table { struct list_head list; possible_net_t net; u32 id; struct sock __rcu *mroute_sk; struct timer_list ipmr_expire_timer; struct list_head mfc_unres_queue; struct list_head mfc_cache_array[MFC_LINES]; ... ... } #define MFC_LINES 64 #ifdef __BIG_ENDIAN #define MFC_HASH(a,b) ((((a)>>24)^((b)>>26))&(MFC_LINES-1)) #else #define MFC_HASH(a,b) (((a)^((b)>>2))&(MFC_LINES-1)) #endif 

这个散列有什么特别之处? 如何比仅添加两个IP地址并以63进行模数更好呢?还是只对组IP地址进行模数? 另外,如果我想从64增加散列表大小到128,那么如果我把MFC_LINE改为128就足够了吗? 或者我需要改变MFC_HASH使用从group-ip和source-ip的位数? 有人可以帮忙吗? 我的机器是大端的。

谢谢。

如何比仅仅添加两个IP地址并以63进行模数更好呢?

如果你添加了两个IP地址,并取模64(它应该是64,而不是63),那么较高的字节将被忽略,因为它们是0x40的倍数。 这个散列的目的是根据最高地址位来区分地址。 这就是为什么它首先是他们,然后才放在[0,63]范围内。

例:

a:255.0.0.0

b:54.0.0.0

(a + b)= 35.0.0.2(忽略无符号整数溢出 – 硬件将丢弃最左边的位)

35.0.0.0%64 = 0(35.0.0.0 = 889192448 = 13893632 * 64 + 0)