Может быть, что:
ethtool ethx | grep detected
показывает "ссылка не обнаружена", если bond0 еще не настроен на стороне ОС (Linux)?
разве ethtool не показывает физическое состояние?
Я предполагаю, что вы хотите узнать состояние соединения сетевой карты, а не физическое состояние подключения кабеля к розетке. (это может быть невозможно узнать.)
При быстром поиске, я думаю, у вас уже есть ответ. Поднимите интерфейс, подождите, пока он найдет ссылку, если она есть (это может занять несколько секунд), затем проверьте вывод ethtool
, или carrier
и / или operstate
в /sys/class/net/$NIC/
.
ifconfig somenic up
кажется, эти двое 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
. На основе Вот, настройка, которая фактически вызывает инициализацию устройства:
Затем он устанавливает
IFF_UP
укусилdev->flag
посредствомioctl(SIOCSIFFLAGS)
(Socket I / O Control Set Interface Flags), чтобы включить интерфейс.Последняя команда (
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)
Это означало бы, что нет никакого способа осмысленно найти состояние связи сетевой карты, которая не вверх, поскольку оборудование даже не будет инициализировано.
Конечно, по крайней мере теоретически возможно, что некоторые драйверы ведут себя по-другому и инициализируют оборудование до того, как кто-то установит IFF_UP
, но в общем случае это не поможет.
Ethtool будет работать только с физическими адаптерами Ethernet. Это означает, что 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