
それは次のことでしょうか:
ethtool ethx | grep detected
OS (Linux) 側で bond0 がまだ設定されていない場合、「リンクが検出されませんでした」と表示されますか?
ethtool は物理的な状態を表示しませんか?
答え1
Ethtool は物理イーサネット アダプタに対してのみ機能します。つまり、bond0、tun0、および物理ネットワーク デバイスではないその他のネットワーク デバイスは ethtool では機能しません。
$ ethtool <eth?>
例えば:
$ ethtool eth0
提供:
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
答え2
ソケットにケーブルが差し込まれた物理的な状態ではなく、NIC のリンク状態を調べたいのだと思います (調べるのは不可能かもしれません)。
ちょっと検索してみると、すでに答えが見つかるのではないかと思います。インターフェースを起動し、リンクが見つかるまで待ちます。リンクがあれば (数秒かかる場合があります)、 、ethtool
またはcarrier
および/または のoperstate
出力を確認します/sys/class/net/$NIC/
。
ifconfig somenic up
次の 2 つの呼び出しを行うようです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
つまり、 を設定しますIFF_UP
。ここ実際にデバイスを初期化する設定は次のとおりです。
次に、 (ソケット I/O 制御インターフェイス フラグの設定)を使用して
IFF_UP
ビットを設定し、インターフェイスをオンにします。dev->flag
ioctl(SIOCSIFFLAGS)
ただし、後者のコマンド (
ioctl(SIOCSIFFLAGS)
) は、デバイスの open メソッドを呼び出します。実際のコードに関する限り、ドライバーは char ドライバーや block ドライバーと同じタスクの多くを実行する必要があります。open は必要なシステム リソースを要求し、インターフェイスを起動するように指示します。
同様のコメントはe1000e
ドライバーソース:
/**
* 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)
つまり、NICのリンク状態を意味のある方法で見つける方法はないということです。上ハードウェアが初期化されないためです。
もちろん、一部のドライバーが異なる動作をして、誰かが設定する前にハードウェアを初期化することは少なくとも理論的には可能ですがIFF_UP
、それでも一般的なケースでは役に立ちません。