Перейти к содержанию
    

Информация из UDP пакетов не доходит до программного приложения

Здравствуйте. Помогите решить возникшую проблему.

 

Дано.

Есть система, в которой устройство подключено к ПК по сети Gigabit Ethernet с обменом информацией по протоколу UDP.

Схема соединения узлов системы имеет вид: устройство[МК <=> MAC-контроллер (самописный контроллер на ПЛИС Cyclone III) <=> МС физического уровня (Marvell 88E1111)] <=> ПО на ПК (встроенная сетевая карта Realtek PCIe GBE RTL8168B/8111B, ОС Windows XP).

Упрощенно алгоритм обмена информацией содержит следующие шаги:

  • Шаг 1. ПО настраивает устройство некоторым количеством команд.
  • Шаг 2. Далее ПО посылает команду «Запрос данных».
  • Шаг 3. После получения команды «Запрос данных» МК выдает блок сообщений: сообщение «Заголовок» (UDP пакет с размером полезных данных 32 байта) и следом 4-е сообщения «Данные[1] – [4]» (UDP пакеты с размером полезных данных 1032 байта). Интервалы времени между сообщениями от МК около 10 мкс.
  • Шаг 4. ПО на ПК анализирует принятые сообщения и выдает либо команду «Правильный приём», либо «Повторить сообщение №N».

    Также на этом шаге ПО следит за таймером, и если в течение одной секунды не набран полный блок сообщений, то происходит принудительная подача команды «Повторить сообщение №N».

  • Шаг 5. Затем ПО посылает снова команду «Запрос данных» и т. д. шаги 2 – 4 по кругу. Интервалы времени между командами «Запрос данных» при правильном приеме сообщений около 1,5 мс.

Проблема.

Имеет место ситуация, когда до ПО на ПК не доходит последнее сообщение (причем всегда именно последнее) от устройства, т. е. сообщение «Данные[4]», что приводит к срабатыванию таймаута на прием блока сообщений и к подаче от ПК команды «Повторить сообщение №N».

В этой ситуации, недошедшее сообщение также не видно и в сниффере (Wireshark), хотя по осциллографу на цепи TxCtl, между ПЛИС и МС физического уровня, наблюдается верная временная диаграмма, состоящая из 5-и передач в сеть. Более того, после команды «Повторить сообщение №N», на цепи TxCtl наблюдается только один импульс соответствующий передаче одного пакета в сеть, а в ПО доходит и «старый» недошедший пакет и «новый» переспрошенный пакет. В сниффере же наблюдаем следующую картину:

  • 1. пакет в ПК: сообщение «Данные[3]» (последний правильно пришедший пакет)
  • 2. пакет из ПК: команда «Повторить сообщение №4» (пакет из ПК по таймауту через 1 с после последнего пакета)
  • 3. пакет в ПК: сообщение «Данные[4]» (недошедший до ПО и сниффера пакет, из-за которого была подана команда «Повторить сообщение»)
  • 4. пакет в ПК: сообщение «Данные[4]» (сообщение, которое было выдано устройством в ответ на команду «Повторить сообщение»).
Т. е. получаем ситуацию, когда из устройства сетевые пакеты уходят, а до ПО и сниффера в ПК не доходят.

 

Подозрения.

Как будто в сетевой карте на ПК есть буфер с заданным уровнем заполнения и, если этот уровень не превышен, то пакеты из сетевой карты не уходят в приложения.

 

Вопрос.

Что посоветуете в данной ситуации? Причем менять сетевую карту, ОС или стандартный сетевой драйвер очень не желательно.

 

Заранее спасибо за любую помощь.

 

P.S. В этой системе сам я отвечаю за устройство, и с программной частью на ПК в плане работы с сетью не знаком. На вопросы связанные с ПО, смогу ответить после консультации с нашим программистом.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В роутере настраивается маршрутизация на еще один порт. К нему подключается еще один компьютер с тем-же снифером для НЕЗАВИСИМОГО контроля. Ну а дальше - либо он видит эти фреймы, либо нет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...в сетевой карте на ПК есть буфер с заданным уровнем заполнения...

 

1) не в сетевой карте а в софте

2) не буффер а тайм-аут

3) не на ПК, а на обеих концах в сетевых стэках

4) данный тайм-аут надо скинуть в ноль.(что то туплю, заклинило - с ходу название не вспомнил...лезть в склады кода лень, простите)

 

(круглый)

PS

Правда там явно не секунда а меньше. Посему предложу проверить срез откуда начинается отсчёт тайм-аута. Прежде чем лезть далее...

PS PS

Параметр SO_RCVTIMEO для блокирующего сокета, в млск. Везде обзывается одинаково - т.е. и под форточками и под (как пример) lwip он есть.

Изменено пользователем kolobok0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

лезть в склады кода лень, простите)

Таки лучше залезте, ибо таймаутов в UDP/IP стеке просто нет по причине их нахреннненужности.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...таймаутов в UDP/IP стеке просто нет....

 

да, пакетная передача. накопления нет. согласен. поспешил похоже.

 

значит остаётся начать с самого простого - откуда идёт замер интервала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уточню последовательность пакетов во времени.

Последовательность пакетов на ПК в сниффере:

[(1) передан один пакет] – [(2) принято ЧЕТЫРЕ пакета] – [(3) таймаут 1 с] – [(4) передан один пакет] – [(5) принято ДВА пакета].

Последовательность пакетов в устройстве:

[(1) принят один пакет] – [(2) передано ПЯТЬ пакетов] – [(3) пауза 1 с] – [(4) принят один пакет] – [(5) передан ОДИН пакет].

 

Причем если в ПО отключить таймаут на прием сообщений, т. е. ждать сообщения бесконечно долго, то недошедший пакет рано или поздно появится в сниффере при какой-нибудь активности по сети со стороны ПК, например, при отправке пакета по протоколу Browser Protocol (раз в 11 мин), который в устройстве отбрасывается на стороне МАС-контроллера, или при ping-е IP-адреса отличного от адреса устройства.

 

-------------------------------

...откуда идёт замер интервала.

О каком интервале идет речь?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В роутере настраивается маршрутизация на еще один порт. К нему подключается еще один компьютер с тем-же снифером для НЕЗАВИСИМОГО контроля. Ну а дальше - либо он видит эти фреймы, либо нет.

 

Если судить по описанию проблемы (см. на упражнения с осциллографом и последующий приём пропавшего фрейма после запроса повторной передачи), фреймы таки нормально долетают.

Скорее всего, в софте где-то ловко накосячено или стандартные "дрова" не совсем стандартно работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...О каком интервале идет речь?

 

об этом:

Также на этом шаге ПО следит за таймером, и если в течение одной секунды не набран полный блок сообщений, то происходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

об этом:

Неведомо откуда и о чем вырванная цитата :(. Таймаутов в UDP нет совсем. Единственно, что на интимном уровне фреймы с данными более 508 байт могут резаться и собираться обратно.

тут да, тайматуты в каком-то виде могут/будут присутствовать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неведомо откуда...

 

если прочитать первое сообщение TC

•Шаг 4. ПО на ПК анализирует принятые сообщения и выдает либо команду «Правильный приём», либо «Повторить сообщение №N».

Также на этом шаге ПО следит за таймером, и если в течение одной секунды не набран полный блок сообщений, то происходит принудительная подача команды «Повторить сообщение №N».

 

то станет понятно о чём речь.

 

Ваша фраза

Таймаутов в UDP нет совсем

это флуд чистой воды. Причём тут UDP если идёт речь о логике работы программы TC?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то станет понятно о чём речь.

Настоятельно рекомендую Вам перечитать написаное Автором и ОБА своих ответа про таймауты, а не бросатся словами "флуд".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настоятельно...

 

То, что я говорил про настройки - я уже написал выше, читайте пост номер 5.

 

Вы не ответили на конкретно поставленный вопрос (см. пост номер 11).

Ответ будет или вы уйдёте от ответа?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы не ответили на конкретно поставленный вопрос (см. пост номер 11).

Ответ будет или вы уйдёте от ответа?

Читаем Автора:

Причем если в ПО отключить таймаут на прием сообщений, т. е. ждать сообщения бесконечно долго, то недошедший пакет рано или поздно появится в сниффере при какой-нибудь активности по сети со стороны ПК

Что Вам, простите, в написанном Автром про таймаут непонятно, что Вы решили посоветовать автору следующее:

значит остаётся начать с самого простого - откуда идёт замер интервала.

А мне заявить:

это флуд чистой воды. Причём тут UDP если идёт речь о логике работы программы TC?

Можете не отвечать, поверьте, так будет лучше.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Что посоветуете в данной ситуации?...

 

Вы пишете следующее:

 

мк посылает в плисину данные, эти данные выплёвываются в сеть, приходят к сетевой карточки писюка и далее уже получается то, что Вы описали.

Вы контролируете прохождение активности между мк и плисиной. те-ли данные пробегают между ними - не известно. убедиться можно если

проконтролировать эти данные внутри мк на нижнем уровне сетевого стэка. Либо зацепив анализатором между мк и плисиной.

 

пакет доходит, но с существенной задержкой. Т.е. мест где бы он "хранился" - всего три. мк, плисина, карточка писюка.

если предположить, что данные между мк и плисиной корректны, то вам необходимо проконтролировать корректность данных между

писюком и плисиной. Отсюда Вы поймёте в какую сторону копать.

 

(круглый)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...