ARP(7) | Manual do Programador Linux | ARP(7) |
arp - módulo de kernel para ARP em Linux.
Este módulo de protocolo de kernel implementa o Protocolo de Resolução de Endereços (Address Resolution Protocol) definido na RFC 826. Ele é usado para converter o endereço de hardware da camada 2 para endereços do protocolo IPv4 em redes diretamente conectadas. Normalmente o usuário não interage diretamente com este módulo, exceto para configurá-lo; em vez disso, ele provê um serviço para outros protocolos no kernel.
Um processo de usuário pode receber pacotes ARP através do uso de sockets do tipo packet(7). Há também um mecanisco de gerenciamento do cache ARP no espaço de usuário, através do uso de sockets do tipo netlink(7). A tabela ARP também pode ser controlada via ioctl (2) ou qualquer socket do tipo PF_INET
O módulo ARP matém um cache de mapeamento entre endereços de hardware e endereços de protocolo. O cache tem um tamanho limitado pois há uma "coleta de lixo" entre entradas mais antigas e usadas com menos freqüência. Entradas que são marcadas como permanentes nunca são apagadas pelo coletor de lixo. O cache pode ser manipulado diretamente pelo uso de ioctls, e seu comportamento pode ser ajustado pelos sysctls definidos abaixo.
Quando não há feedback positiva para um mapeamento existente depois de um certo tempo (veja os sysctls abaixo), uma entrada de cache vizinha é considerada travada. Para enviar dados para o destino novamente, o ARP primeiro tenta pedir ao daemon arp local um endereço MAC atualizado por app_solicit vezes. Se falhar, e um endereço MAC antigo é conhecido, um teste de unicast é enviado ucast_solicit vezes. Se falhar também, ele fará um broadcast de um novo pedido de ARP na rede. Pedidos são enviados apenas quando há dado enfileirado para envio.
O Linux acrescentará automaticamete uma entrada não permanente de arp proxy quando receber um pedido de um endereço para encaminhamento, e o arp proxy é habilitado na interface de recepção. Quando houver uma rota rejeitada para o destino, nenhuma entrada de arp proxy é acrescentada.
Esses ioctls são disponíveis em todos os sockets PF_INET Eles pegam um ponteiro para um struct arpreq como parâmetro.
struct arpreq { struct sockaddr arp_pa; /* endereço de protocolo */ struct sockaddr arp_ha; /* endereço de hardware */ int arp_flags; /* flags */ struct sockaddr arp_netmask; /* máscara de rede do endereço de protocolo */ char arp_dev[16]; };
SIOCSARP, SIOCDARP e SIOCGARP respectivamente seta, deleta e obtém um mapeamento ARP. Setar e deletar mapas ARP são operações privilegiadas e só podem ser realizadas por um processo com a capabilidade CAP_NET_ADMIN ou com um UID efetivo igual a 0.
arp_pa deve ser um socket AF_INET e arp_ha deve ter o mesmo tipo que o dispositivo especificado em arp_dev. arp_dev é uma string terminada em zero que nomeia um dispositivo.
arp_flags | |
flag | significado |
ATF_COM | Busca completada |
ATF_PERM | Mantém entrada |
ATF_PUBL | Publica entrada |
ATF_USETRAILERS | Trailers requeridos |
ATF_NETMASK | Usa uma máscara de rede |
ATF_DONTPUB | Não responde |
Se o flag ATF_NETMASK é selecionado, então arp_netmask deveria ser válido. O Linux 2.2 não suporta entradas entradas ARP de rede proxy, então deveria ser setado para 0xffffffff, ou 0 para remover uma entrada de proxy arp existente. ATF_USETRAILERS é obsoleto e não deveria ser usado.
O ARP suporta uma interface de sysctl para configurar parâmetros em uma base global ou por interface. Os sysctls podem ser acessados por leitura ou escrita dos arquivos /proc/sys/net/ipv4/neigh/*/* ou com a interface sysctl(2) /proc/sys/net/ipv4/neigh/. A configuração no diretório `default' é usada por todos os dispositivos recém-criados. A menos que se especifique o contrário, sysctls relacionados a tempo são especificados em segundos.
Algumas configurações de temporização são específicos em jiffies, que são relacionados com a arquitetura. No Alpha, um jiffy é 1/1024 segundo, em muitas outras arquiteturas é 1/100s.
Não há maneira de sinalizar feedback positivo a partir do espaço do usuário. Isto significa que protocolos orientados a conexão implementados no espaço de usuário gerarão um tráfego ARP excessivo, porque ndisc retestará regularmente o endereço MAC. O mesmo problema se aplica para a implementação do NFS no kernel.
Esta página de manual busca tanto a funcionalidade específica para IPv4 quanto a compartilhada entre IPv4 e IPv6.
O struct arpreq mudou no Linux 2.0 para incluir o membro arp_dev e os números de ioctl mudaram ao mesmo tempo. O suporte aos ioctls antigos foi tirado do Linux 2.2.
O suporte a entradas de arp proxy para redes (máscara de rede diferente de 0xffffffff) foi eliminado no Linux 2.2. Ele é substituído pela configuração automática pelo kernel do arp proxy para todos os hosts alcancáveis em outras interfaces (quando o repasse e o arp proxy estiverem habilitados para a interface).
RFC826 para uma descrição do ARP.
RFC2461 para uma descrição da descoberta de vizinhos IPv6 e os
algoritmos-base usados.
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L. Fassone Canova <lonelywolf@blv.com.br> (revisão)
3/06/1999 | Página do Manual do Linux |