Есть устройства, работающие по Ethernet и обменивающиеся для работы пакетами UDP с компьютером управления. Пакеты микроскопические, не больше сотни байт. Пакеты посылаются редко. Даже не раз в минуту, реже.
Есть устройства с контроллером Ethernet на чипе W5100, есть на следующем поколении W5100S.
В локальной сети всё работает без проблем. Как угодно.
Как только возникает необходимость передавать пакеты между сетями возникает такая жопа: устройства на W5100 работают нормально, а W5100S не могут передать ответное сообщение обратно на комп.
Я не понимаю, в чем собственно проблема - в моих устройствах, или в маршрутизаторах. У нас используются CISCO, и я в них нихрена не понимаю.
Причем проблема вылазит как в локальном масштабе, в рамках объекта, так и в межрегиональном.
Я спокойно могу с компа в Питере пообщаться с устройством на W5100, которое работает на объекте в Карачаево-Черкесии. И наоборот, с компа в КЧР посмотреть что на устройстве в Питере.
А с W5100S обратные сообщения не идут. В сторону устройства все идет, оно даже выполняет команды.
В общем посоветуйте. Даже не в какую сторону копать... Чем копать? Может есть какие-то программы, которые показывают что в сети ходит?...
Больше всего вымораживает тот факт что W5100S выдает фейл при посылке UDP пакета. То есть у него там внутри срабатывает ошибка и поднимается флаг "таймаут".
Как вообще возможен таймаут при посылке UDP?...
Да, есть другое устройство. Мультипортовка MOXA, такая вся крутая и с вебмордой. Работает без проблем.
Когда устройство отвечает в другую подсеть, оно либо пытается ARP-иться на удалённый ip компьютера, либо не знает MAC шлюза, в итоге получает TIMEOUT.
Проверяется за 5 минут Wireshark'ом на компьютере. Смотри ARP. Если устройство спрашивает "who has ip компьютера", а не "who has ip gateway", значит оно шлёт мимо маршрутизатора.
Надо задать верный ip, маску и gateway на устройстве.
Посмотреть что ответы уходят через шлюз, а не напрямую на удалённый ip.
Ну и заработает всё.
Конечно, это таймаут не протокола, а таймаут попытки доставить кадр на канальном уровне (ARP / MAC).
То есть:
чип пытается отправить UDP
не может определить MAC-адрес получателя / не может отправить кадр через шлюз
после нескольких попыток поднимает флаг TIMEOUT
Всё. Секрет раскрыт.
EgolfНет, проблема оказалась в самом контроллере.
Это наверняка проблемы роутинга на L2.
Egolfпользовался tcpdump, благо второй комп на линуксе.
Проверяется за 5 минут Wireshark'ом на компьютере. Смотри ARP. Если устройство спрашивает "who has ip компьютера", а не "who has ip gateway", значит оно шлёт мимо маршрутизатора.
EgolfДа, именно так все и происходит.
То есть:
чип пытается отправить UDP
не может определить MAC-адрес получателя / не может отправить кадр через шлюз
после нескольких попыток поднимает флаг TIMEOUT
Работающее устройство шлет ARP на адрес шлюза.
Глючащее устройство в локалке шлет ARP правильно, а если запрос из подсети, то почему-то шлет запрос ARP на 0.0.0.0
Лекарство оказалось достаточно странным.
При инициализации W5100S нужно обязательно что-то записать в регистр количества
Egolfвот этих самых попыток.
после нескольких попыток
Причем совершенно не важно, что ты туда пишешь. 0х00, 0XFF или любое значение между ними приводят к тому что начинает работать правильно.
По дефолту количество попыток 0x08. Действительно шлет 8 запросов.
Но, поскольку в даташите написано что там по дефолту 8 - типа ты такой думаешь "да не буду я этот регистр инициализировать, меня устраивает дефолт".
Тем более что у старого W5100 в этом месте всё то же самое и он нормально работает.
Меня просто напрягло что 8 попыток, типа засирает экран tcpdump, я просто так (!!!) решил снизить количество попыток до 3, а оно взяло и заработало.
Просто повезло.
Но все равно спасибо за участие. Про wireshark не знал. Оно в XP будет работать?
Просто tcpdump в моей версии линуха уже было, никаких дополнительных телодвижений, просто запустить и разобраться с настройками.
Мистер_ПэБудет, но в старой версии.
Про wireshark не знал. Оно в XP будет работать?
Вот тут https://wiki.wireshark.org/Development/LifeCycle пишут что нужна версия 1.10.14
Качнуть можно здесь https://www.wireshark.org/down...n32-1.10.14.exe
А вообще имхо гораздо удобнее сделать загрузочный usb диск с убунтой, для (но не ограничиваясь) wireshark. Или виртуалку поднимать.
https://www.wireshark.org/download.html
Мистер_ПэАга. Я ж про него и пишу.
Нет, проблема оказалась в самом контроллере.
L2 - это Level 2, канальный уровень OSI, как раз MAC адреса роутит.
Мистер_Пэtcpdump за глаза хватает, он просто менее удобный (вкусовщина опять же).
Просто tcpdump в моей версии линуха уже было
EgolfО! Спасибо! Попробую глянуть что за зверь.
Вот тут wiki.wireshark.org пишут что нужна версия 1.10.14Качнуть можно здесь wireshark.org
Правда вылетает если тупо оставить включенным на захват трафика надолго. При вылете настройки не сохраняются 😞 Поэтому надо после установки настроек выйти и зайти, для страховки. И захватывать трафик короткими кусками.
В очередной раз 😊 победил проблему с непрохождением пакетов у W5100S.
Дело, оказывается, не столько в том что и куда записывать, а больше в том, КОГДА.
Устройство после запуска, вероятно, инициализируется. И этот процесс занимает достаточно заметное время.
Если записать установки прямо сразу - оно не работает вообще, поскольку записанные установки переписываются на дефолтные во время инициализации.
Если выдержать паузу и потом записывать настройки, то поведение устройства начинает зависеть от длительности паузы. Очевидно что какие-то регистры, которые необходимы для работы в локальной сети сохраняют значение, а те, что нужны для работы с маршрутизацией - либо полностью, либо частично перезаписываются т.к. процесс инициализации еще продолжается.
Если паузу увеличить - устройство начинает адекватно работать и при маршрутизации.
Фишка в том, что когда я добавляю в прошивку запись дополнительного регистра ДО блока записи адреса шлюза, запись адреса шлюза происходит несколько позже. Поэтому в прошлый раз появился некий положительный эффект от записи регистра количества повторных попыток. Это и сбило с толку.