Será que nenhum link foi detectado até que o vínculo fosse configurado?

Será que nenhum link foi detectado até que o vínculo fosse configurado?

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 carriere/ou operstateem /sys/class/net/$NIC/.

ifconfig somenic upparece fazer estas duas ioctlchamadas:

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_UPbit dev->flagpor meio de ioctl(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 noe1000efonte 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.

informação relacionada