(Eu escrevi a versão expandida desta função que drena os dados NETLINK, seguindo o impressionante trabalho de detetive de Sasha Pachev, encontrando que função interceptar. Fico feliz em ver que as pessoas acharam o código útil.)
Do outro segmento, vejo alguém usar "nm" para descobrir que existe um manipulador de retorno de chamada análogo para o OSX e você está tentando criar uma função adequada para substituí-lo. Eu entendo que o OSX não fornece uma interface NETLINK, então é muito improvável que a versão OSX do AnyConnect mantenha o controle sobre a tabela de roteamento da mesma maneira que o cliente Linux faz. Eu não sei qual mecanismo o OSX fornece para sinalizar para AnyConnect que uma mudança de roteamento aconteceu, mas como não é baseado em NETLINK, o código aqui para drenar a mensagem de netlink é inaplicável.
Ironicamente, o estilo de função stub original fornecido por Sasha provavelmente seria tudo o que você precisaria para impedir que ele substituísse suas rotas pelas suas próprias. Essa função parecia:
int __ZN25CInterfaceRouteMonitorMac20routeCallbackHandlerEv()
{
return 0;
}
No linux, essa função original levou a um alto uso da cpu, porque o evento NETLINK que acionou a chamada para o manipulador de retorno de chamada nunca seria limpo por esse código do-nothing. o mesmo efeito pode acontecer para o cliente OSX, onde qualquer evento que dispara esta função não está sendo limpo também. Mas se esta função é a função manipuladora correta para interceptar, e você é capaz de fazer sua própria biblioteca para sobrescrever essa função, e conseguir que a biblioteca seja carregada em vez da biblioteca real, pelo menos você a impedirá de redefinir a tabela de roteamento a cada vez que você tenta mudar você mesmo. Se você chegar tão longe, sacrificar alguma CPU pode valer a pena.
Boa sorte!