Назад | Перейти на главную страницу

Может быть, ссылка не обнаружена, пока связь не настроена?

Может быть, что:

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