Könnte es sein, dass keine Verbindung erkannt wurde, bis die Verbindung konfiguriert wurde?

Könnte es sein, dass keine Verbindung erkannt wurde, bis die Verbindung konfiguriert wurde?

Könnte es sein, dass:

ethtool ethx | grep detected

zeigt „Keine Verbindung erkannt“ an, wenn Bond0 auf der Betriebssystemseite (Linux) noch nicht konfiguriert ist?

zeigt ethtool nicht einen physischen Zustand an?

Antwort1

Ethtool funktioniert nur mit physischen Ethernet-Adaptern. Das bedeutet, dass bond0, tun0 und alle anderen Netzwerkgeräte, die keine physischen Netzwerkgeräte sind, nicht mit ethtool funktionieren.

$ ethtool <eth?>

Zum Beispiel:

$ ethtool eth0

bietet:

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

Antwort2

Ich gehe davon aus, dass Sie den Verbindungsstatus der Netzwerkkarte herausfinden möchten und nicht den physischen Zustand eines in die Buchse eingesteckten Kabels. (Das lässt sich möglicherweise nicht herausfinden.)

Nach einer kurzen Suche glaube ich, dass Sie die Antwort bereits gefunden haben. Rufen Sie die Schnittstelle auf, warten Sie, bis ein Link gefunden wird, falls es einen gibt (das kann einige Sekunden dauern), und überprüfen Sie dann die Ausgabe von ethtooloder carrierund/oder operstatein /sys/class/net/$NIC/.

ifconfig somenic upscheint diese beiden ioctlAufrufe zu tätigen:

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

Das heißt, es setzt IFF_UP. Basierend aufHier, Einstellung, die tatsächlich zur Initialisierung des Geräts führt:

Anschließend setzt es mittels (Socket I/O Control Set Interface Flags) das IFF_UPBit , um die Schnittstelle einzuschalten.dev->flagioctl(SIOCSIFFLAGS)

Der letztere Befehl ( ioctl(SIOCSIFFLAGS)) ruft jedoch die Open-Methode für das Gerät auf.

Was den eigentlichen Code betrifft, muss der Treiber viele der gleichen Aufgaben ausführen wie die Zeichen- und Blocktreiber. Open fordert alle benötigten Systemressourcen an und weist die Schnittstelle an, zu erscheinen.

Ähnliche Kommentare gibt es ime1000eTreiberquelle:

/**
 * 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)  

Das würde bedeuten, dass es keine Möglichkeit gibt, den Verbindungsstatus einer Netzwerkkarte sinnvoll zu ermitteln, die nichthoch, da die Hardware nicht einmal initialisiert würde.


Natürlich ist es zumindest theoretisch möglich, dass sich einige Treiber anders verhalten und die Hardware initialisieren, bevor jemand einstellt IFF_UP, aber im Allgemeinen würde das immer noch nicht helfen.

verwandte Informationen