¿Cómo puedo asegurarme de que eth1 obtenga su dirección IPv6 fe80 inmediatamente al inicio, incluso si no está conectado físicamente?

¿Cómo puedo asegurarme de que eth1 obtenga su dirección IPv6 fe80 inmediatamente al inicio, incluso si no está conectado físicamente?

Estoy trabajando en un dispositivo Linux x86 integrado que ejecuta Debian (Linux 3.8.13). Este dispositivo tiene dos puertos Ethernet, eth0 y eth1.

Si inicio este dispositivo solo con eth0 conectado a un conmutador, lo entro por ssh y hago un 'ifconfig', obtengo esto:

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

Tenga en cuenta que eth0 tiene una "dirección inet6" asignada, mientras que eth1 no.

Si/cuando conecto eth1 a un conmutador de red, aparecerá una línea "inet6 addr" en la salida de ifconfig en ese momento (y permanecerá presente incluso si desconecto el cable Ethernet de eth1 nuevamente).

Entonces parece que Linux no se molesta en asociar un dispositivo Ethernet con su dirección IPv6 hasta la primera vez que ese dispositivo Ethernet está realmente conectado a algo.

Eso funciona, pero tengo algunos programas que se supone que envían paquetes de multidifusión IPv6 desde ambos puertos en todo momento, y no pueden hacerlo en un puerto que no tiene una dirección IPv6 asignada.

Entonces, lo que me gustaría hacer es encontrar una manera de obligar a Linux a asociar la dirección IPv6 autoasignada del dispositivo (es decir, fe80::blah, donde blah se deriva de la dirección MAC en el chip Ethernet) durante el inicio, en lugar de esperar. hasta que el puerto Ethernet esté realmente conectado. ¿Hay una manera de hacer eso?

(La ventaja sería que mis programas podrían simplemente escanear la lista de dispositivos de red durante el inicio y usarlos; actualmente tienen que configurar un socket AF_NETLINK para recibir notificaciones de los cambios en la configuración de la red, lo cual funciona pero es más complicado. de lo que me gustaría y también un poco lento para reaccionar)

Respuesta1

ifconfigNo le muestra suficiente información aquí. La clave general es si elenlacedepende. iproute2's ip addrmostrará el estado del nivel inferior, así como la vida útil de las direcciones, según corresponda.

Se supone que las direcciones de enlace local solo están presentes si el enlace en sí está activo. Sin enlace, sin dirección. También hay muchos otros casos en los que no aparecerá, como subinterfaces en un conjunto vinculado (grupo/equipo/maestro, etc., dependiendo de la elección de palabras que desee utilizar).

Creo que el comportamiento que observó de una dirección de enlace local que no se elimina después de quitar un cable es un error, debería haberse eliminado cuando nada más la estaba usando y el contador de vida útil expira, y sospecho que se ha solucionado en kernels más nuevos. (No estoy en condiciones de realizar la prueba en este momento).

Más allá de eso, ¿le importa si es el núcleo o el espacio de usuario el que crea la fe80::dirección? Si no importa, puede crearlo desde el espacio de usuario y el kernel no lo eliminará.

Respuesta2

¿Cómo se configuran las interfaces en /etc/network/interfaces? Supongo que están configurados para allow-hotplughabilitar la interfaz cuando se detecta un enlace. Intente cambiarlo para autoque su configuración se vea así:

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

auto eth1
iface eth1 ....
    ....

información relacionada