O cache vizinho no kernel do Linux não é tão simples.
Existem diferenças sutis entre uma entrada de cache do vizinho que está caindo do cache ou está sendo marcada como obsoleta / inválida. Em algum ponto entre base_reachable_time / 2 e 3 * base_reachable_time / 2, a entrada ainda estará no cache, mas será marcada com um estado de STALE. Você deve ser capaz de ver o estado com "ip -s vizinho show".
Quando no estado STALE, como mostrado acima, se eu fizer ping em 10.64.42.121, ele enviará o pacote para b8: 20: 00: 00: 00: 00 imediatamente. Um segundo ou mais tarde, ele geralmente enviará uma solicitação ARP para quem tem 10.64.42.121 para atualizar seu cache de volta para um estado REACHABLE. MAS, para tornar as coisas mais confusas, o kernel às vezes altera os valores de tempo limite com base no feedback positivo dos protocolos de nível mais alto. O que isto significa é que, se eu fizer ping em 10.64.42.121 e ele responder, o kernel pode não se incomodar em enviar um pedido ARP, porque ele assume que o pong significou que a entrada de cache do ARP é válida. Se a entrada estiver no estado STALE, ela também será atualizada por respostas não solicitadas do ARP que ela veja.
Agora, para a maioria dos casos, a entrada no estado STALE é tudo que você precisa se preocupar. Por que você precisa que a entrada seja removida do cache completamente? O kernel faz um grande esforço para não debater a memória apenas alterando o estado das entradas de cache, em vez de realmente removê-las e adicioná-las ao cache o tempo todo.
Se você realmente insistir que ele não só será marcado como STALE, mas será realmente removido do hashmap usado pelo cache vizinho, você deve tomar cuidado com algumas coisas. Primeiro, se a entrada não tiver sido usada e estiver obsoleta por gc_stale_time segundos, ela deve estar qualificada para remoção. Se gc_stale_time passar e marcar a entrada como ok para ser removida, ela será removida quando o coletor de lixo for executado (geralmente após gc_interval segundos).
Agora, o problema é que a entrada vizinha não será excluída se estiver sendo referenciada . A principal coisa que você vai ter problemas é a referência do ipv4 tabela de roteamento . Há muita coisa complicada na coleta de lixo, mas o importante a ser observado é que o coletor de lixo para o cache de rota expira as entradas a cada 5 minutos ( / proc / sys / net / ipv4 / route / gc_timeout segundos) em muitos kernels. Isto significa que a entrada vizinha terá que ser marcada como obsoleta (talvez 30 segundos, dependendo de base_reachable_time ), então 5 minutos terão que passar antes que o cache de rota pare de referenciar a entrada (se você estiver lucky), seguido por alguma combinação de gc_stale_time e gc_interval passando antes que ele seja realmente limpo (assim, no geral, algo entre 5-10 minutos passará).
Resumo: você pode tentar diminuir / proc / sys / net / ipv4 / route / gc_timeout para um valor menor, mas há muitas variáveis e é difícil controlá-las. Há um grande esforço para que as coisas funcionem bem, não removendo as entradas no cache muito cedo (mas apenas marcando-as como STALE ou até FAILED).