Самый надежный способ проверить наличие подключенного клиента?

Самый надежный способ проверить наличие подключенного клиента?

У меня есть встроенная ОС Linux, разработанная с нуля с помощью Yocto. Она общается с клиентом Windows XP/7. Встроенная ОС запускает DHCP-сервер и выдает адрес клиенту. Проблема в том, что клиент «заблокирован» и блокирует многие стандартные порты и методы выполнения действий. Если встроенная система обнаруживает наличие клиента, мой скрипт запуска запускает сервер, который тестирует систему; в противном случае я выполняю kexec в другую ОС.Каков наилучший способ определить наличие клиента, подключенного через Ethernet, при запуске (в Linux), не увеличивая при этом значительное время загрузки системы?

Вот что я пробовал и что не сработало:

  1. Пакеты ICMP блокируются на стороне клиента, поэтому традиционный пинг не работает
  2. arping работает (так же как и nmap с использованием сканирования ARP), но клиенты Windows пытаются быть «умными» и дозваниваются, поэтому на фактическое установление соединения уходит 20–25 секунд, что неприемлемо; в идеале он должен обнаружить что-то за 5–10 секунд. Можно ли что-то настроить на стороне сервера, чтобы ускорить это? Он всегда сначала загружается в этот раздел, поэтому самое быстрое решение — это лучшее решение.
  3. ifplugd, ethtool, netplugd и проверка /sys/class/net/eth0/operstate и /sys/class/net/eth0/carrier не работают, поскольку порт Ethernet на встроенной системе подключен к внутреннему коммутатору, поэтому он всегда «включен» и «подключен» с точки зрения оборудования.
  4. Будущее решение, скорее всего, будет использовать Bonjour на стороне клиента и Avahi на сервере, чтобы мы могли реализовать протокол без установления соединения, но на реализацию этого потребуется время, и мне нужно временное решение, поскольку на одобрение любого программного обеспечения, которое мы добавляем на сторону клиента, уходит очень много времени.

Опять же, я ничего не могу сделать на стороне клиента, потому что эти устройства настроены другой компанией и заблокированы. Так что еще я могу попробовать на сервере, чтобы определить, присутствует ли клиент?

решение1

Итак, вы сказали, что есть внутренний коммутатор. Вы можете получить доступ к управлению этим коммутатором? Либо по I2C (встроенный коммутатор), либо по SNMP?

Вы утверждаете, что ваша встроенная ОС запускает DHCP-сервер. Если клиент делает DHCP-запрос, разве это не доказательство того, что клиент присутствует и доступен?

Я понятия не имею, что вы подразумеваете под "умным" и "вызовом". Если машина с Windows вообще собирается общаться по Ethernet, она должна отвечать на ARP. Пока что arping кажется лучшим вариантом.

Связанный контент