Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

118
Visualizações
MFC_HASH en /net/ipmr.c

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.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

¿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)

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda