Suponho que você queira encontrar o estado do link da NIC, não a condição física de ter um cabo conectado ao soquete. (isso pode ser impossível descobrir).
Em uma pesquisa rápida, acho que você já tem a resposta. Aumente a interface, espere encontrar um link, se houver um (isso pode levar alguns segundos) e, em seguida, verifique a saída de ethtool
ou carrier
e / ou operstate
em /sys/class/net/$NIC/
.
ifconfig somenic up
parece fazer essas duas chamadas ioctl
:
ioctl(4, SIOCGIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_BROADCAST|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
Ou seja, define IFF_UP
. Com base no aqui , definir isso é o que realmente faz com que o dispositivo seja inicializado:
Then it sets the
IFF_UP
bit indev->flag
by means ofioctl(SIOCSIFFLAGS)
(Socket I/O Control Set Interface Flags) to turn the interface on.The latter command (
ioctl(SIOCSIFFLAGS)
), though, calls the open method for the device.As far as the actual code is concerned, the driver has to perform many of the same tasks as the char and block drivers do. open requests any system resources it needs and tells the interface to come up;
Há comentários sobre o efeito semelhante no % driver doe1000e
:
/**
* e1000e_open - Called when a network interface is made active
* @netdev: network interface device structure
*
* Returns 0 on success, negative value on failure
* * The open entry point is called when a network interface is made
* active by the system (IFF_UP). At this point all resources needed
* for transmit and receive operations are allocated, the interrupt
* handler is registered with the OS, the watchdog timer is started,
* and the stack is notified that the interface is ready.
**/
int e1000e_open(struct net_device *netdev)
Isso implicaria que não há como encontrar significativamente o estado do link de uma placa de rede que não esteja em cima , já que o hardware nem seria inicializado.
É claro que é pelo menos teoricamente possível que alguns drivers se comportem de maneira diferente e inicializem o hardware antes que alguém defina IFF_UP
, mas isso ainda não ajudaria no caso geral.
Em uma máquina (com um e1000e
conectado a um switch Cisco), puxar a interface para baixo também faz com que o switch veja o link cair.
Em outra máquina (com alguma placa de rede Realtek incorporada), as alterações de baixo para baixo fazem com que o controle remoto seja desconectado por breves instantes, mas o switch vê o link e volta a funcionar. ( ethtool
mostra "no link" no lado do PC, no entanto.) Isso pode ou não ter algo a ver com a preparação para o Wake-on-LAN ou algo semelhante, mas eu realmente não faço ideia.