Estoy trabajando en multidifusión y encontré este hash en el código de Linux (ipmr.c). Según tengo entendido, el tamaño de la tabla hash es 64. Y MFC_HASH toma los 8 bits más altos de la dirección IP de destino y los 6 bits más altos de la dirección IP de origen. XOR tanto como AND con 63. Por lo tanto, el resultado está obligado a estar entre 0-63.
Encuentre el siguiente código para obtener más información.
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¿Qué tiene de especial este hachís? ¿Cómo es mejor que simplemente agregar las dos direcciones IP y hacer un módulo por 63? ¿O simplemente hacer un módulo en la dirección IP del grupo? Además, si quiero aumentar el tamaño de la tabla hash de 64 a 128, ¿es suficiente si cambio MFC_LINE a 128? ¿O necesito cambiar la cantidad de bits que usa MFC_HASH de group-ip y source-ip? ¿Puede ayudarme alguien, por favor? Mi máquina es big endian.
Gracias.
¿Cómo es mejor que simplemente agregar las dos direcciones IP y hacer un módulo por 63?
Si agregó dos direcciones IP y tomó el módulo 64 (debe ser 64, no 63), los bytes más altos se ignorarán, ya que son múltiplos de 0x40. La intención de este hash es diferenciar las direcciones en función de los bits de dirección más altos. Es por eso que primero los elimina y solo luego los coloca en el rango [0, 63].
Ejemplo:
un: 255.0.0.0
segundo: 54.0.0.0
(a + b) = 35.0.0.2 (despreciando el desbordamiento de int sin signo: el hardware descartará el bit más a la izquierda)
35.0.0.0 % 64 = 0 ( 35.0.0.0 = 889192448 = 13893632 * 64 + 0)