Como posso ter certeza de que a eth1 obterá o endereço IPv6 do fe80 imediatamente na inicialização, mesmo que não esteja fisicamente conectado?

3

Estou trabalhando em um dispositivo Linux embedded-x86 que executa o Debian (Linux 3.8.13). Este dispositivo tem duas portas Ethernet, eth0 e eth1.

Se eu inicializar este dispositivo com apenas eth0 conectado a um switch, e ssh nele para fazer um 'ifconfig', eu recebo este:

root@msli-DCP-11234772:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:1c:ab:00:0a:60
          inet6 addr: fe80::21c:abff:fe00:a60/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5659 errors:0 dropped:4102 overruns:0 frame:0
          TX packets:1071 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1313254 (1.2 MiB)  TX bytes:224889 (219.6 KiB)
          Interrupt:16 Memory:fc500000-fc520000

eth1      Link encap:Ethernet  HWaddr 00:1c:ab:00:0a:61
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:17 Memory:fc520000-fc540000

Note que eth0 tem um "inet6 addr" atribuído a ele, enquanto eth1 não.

Se / quando eu conectar a eth1 em um switch de rede, uma linha "inet6 addr" aparecerá na saída do ifconfig naquele momento (e permanecerá presente mesmo se eu desconectar o cabo Ethernet da eth1 novamente).

Portanto, parece que o Linux não se incomoda em associar um dispositivo Ethernet ao seu endereço IPv6 até a primeira vez que o dispositivo Ethernet está realmente conectado a algo.

Esse tipo de trabalho, mas eu tenho alguns programas que devem enviar pacotes IPv6 multicast de ambas as portas o tempo todo, e eles não podem fazer isso em uma porta que não tenha um endereço IPv6 atribuído para isso.

Então, o que eu gostaria de fazer é encontrar uma maneira de forçar o Linux a associar o endereço IPv6 auto-atribuído (isto é, fe80 :: blah, onde blah é derivado do endereço MAC no chip Ethernet) durante a inicialização, em vez de esperar até que a porta Ethernet esteja realmente conectada. Existe uma maneira de fazer isso?

(A vantagem seria que meus programas pudessem apenas varrer a lista de dispositivos de rede durante o lançamento e usá-los - atualmente eles precisam configurar um socket AF_NETLINK para serem notificados das mudanças de configuração de rede, o que funciona mas é mais complicado do que eu gostaria, e também um pouco lento para reagir)

    
por Jeremy Friesner 09.05.2014 / 23:02

2 respostas

2

ifconfig não mostra informações suficientes aqui. A chave geral é se o link estiver ativo. iproute2 ip addr mostrará o status de nível inferior, bem como o tempo de vida dos endereços, conforme aplicável.

Os endereços locais de links só devem estar presentes se o próprio link estiver ativo. Nenhum link, nenhum endereço. Há também um monte de outros casos em que ele não aparecerá, como subinterfaces no conjunto ligado (grupo / equipe / mestre etc, dependendo da escolha das palavras que você deseja usar)

O comportamento que você observou de um endereço de link local não ser removido depois que um cabo foi removido. Eu acho que está errado, ele deveria ter sido removido quando nada mais estava sendo usado e o contador da vida útil expira, e eu suspeito que ele tenha sido corrigido em novos kernels (não estou em condições de testar agora).

Além disso, você se importa se é o kernel ou o espaço do usuário que cria o endereço fe80:: ? Se isso não importa, você pode criá-lo no userspace, e o kernel não o removerá.

    
por 19.03.2017 / 05:44
0

Como as interfaces são configuradas em /etc/network/interfaces ? Eu suponho que eles estão configurados para allow-hotplug , o que ativa a interface quando um link é detectado. Tente alterá-lo para auto , para que sua configuração se pareça com:

auto eth0
iface eth0 ....
    ....

auto eth1
iface eth1 ....
    ....
    
por 10.05.2014 / 08:29