
Será que:
ethtool ethx | grep detected
mostra "nenhum link detectado" se o bond0 ainda não estiver configurado no lado do sistema operacional (linux)?
o ethtool não está mostrando um estado físico?
Responder1
Ethtool só funcionará em adaptadores Ethernet físicos. Isso significa que bond0, tun0 e qualquer outro dispositivo de rede que não seja um dispositivo de rede física não funcionarão com ethtool.
$ ethtool <eth?>
Por exemplo:
$ ethtool eth0
fornece:
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000001 (1)
Link detected: yes
Responder2
Presumo 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 de descobrir.)
Em uma pesquisa rápida, acho que você já tem a resposta. Abra a interface, espere encontrar um link, se houver (isso pode levar alguns segundos), e verifique a saída de ethtool
, ou carrier
e/ou operstate
em /sys/class/net/$NIC/
.
ifconfig somenic up
parece fazer estas duas ioctl
chamadas:
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, ele define IFF_UP
. Baseado emaqui, essa configuração é o que realmente faz com que o dispositivo seja inicializado:
Em seguida, ele define o
IFF_UP
bitdev->flag
por meio deioctl(SIOCSIFFLAGS)
(Socket I/O Control Set Interface Flags) para ligar a interface.O último comando (
ioctl(SIOCSIFFLAGS)
), porém, chama o método open para o dispositivo.No que diz respeito ao código real, o driver precisa executar muitas das mesmas tarefas que os drivers char e block. open solicita quaisquer recursos do sistema necessários e informa a interface para ativar;
Há comentários sobre o efeito semelhante noe1000e
fonte do driver:
/**
* 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 de forma significativa o estado do link de uma NIC que não sejaacima, 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 configure IFF_UP
, mas isso ainda não ajudaria no caso geral.