реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC + Ethernet
0000h
сообщение Jul 22 2012, 21:02
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 20-05-09
Пользователь №: 49 325



Имею отладочную плату для микроконтроллера LPC1768, на которой в числе прочих разъёмов и кнопок имеется ethernet-розетка (в качестве PHY напаяна DP83848). Выкурил datasheet'ы и reference manual на указанный ARM камень и PHY, в итоге - запустил ethernet: приём, передача, с прерываниями и без, как угодно. Плату подключаю в домашнюю локалку через маршрутизатор (DIR-320 c DHCP, IP-адрес платы статический). Так вот, проблема в том, что при отправке UDP-пакета на IP-адрес платы виндовый драйвер, естественно не зная MAC-адрес платы сначала посылает в сеть ARP-запрос, который моя плата прекрасно ловит и отправляет ответ (мониторю с помощью WireShark). Затем по логике должен следовать исходящий UDP-пакет, но его нет! Хотя в программе, отправляющей UDP-пакет, функция sendto возвращает как и положено кол-во отправленных байтов! Но пакета нет - ни монитор, ни плата никак не реагируют!
Что за... angry.gif Смотрю ARP-кэш - там только MAC-адрес маршрутизатора. Руками в кэш прописываю IP и MAC платы. Повторяю отправку UDP-пакета. И вот тут-то уже UDP проскочил и в WireShark, и в плате.
Знающие люди, подскажите почему ответ на ARP-запрос с компа не записался в кэш и почему драйвер винды так подло шутит, возвращая положительный ответ, хотя на самом деле ничего не отправлял?
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Jul 22 2012, 21:56
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Проверяйте внимательно корректность ответного ARP пакета.
Драйвер винды не шутит. UDP в самом названии содержит ответ. UDP и ни один из ниже лежащих протоколов ничего знать не знает об успешности отправки пакета. Попробуйте сделать sendto() на любой немыслимый адрес:порт и она вернёт успешную отправку если никаких других ошибок не было.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 22 2012, 23:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Cosmojam @ Jul 23 2012, 00:56) *
Попробуйте сделать sendto() на любой немыслимый адрес:порт и она вернёт успешную отправку если никаких других ошибок не было.

Но пакет-то должен быть послал? А чтобы его послать нужен MAC, а значит перед UDP будет послан ARP. Разве нет?
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Jul 23 2012, 11:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Цитата(_Артём_ @ Jul 23 2012, 02:05) *
Но пакет-то должен быть послал? А чтобы его послать нужен MAC, а значит перед UDP будет послан ARP. Разве нет?

По логике да, но это фича UDP+ARP http://www.pcvr.nl/tcpip/udp_user.htm sendto(). Можно использовать виндовую функцию SendARP перед отправкой UDP чтобы убедиться в наличии адреса в ARP кэше. Но я так не пробовал делать, точнее не скажу.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
0000h
сообщение Jul 23 2012, 18:27
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 20-05-09
Пользователь №: 49 325



Спасибо за подсказки, проблема была в том, что я неверно формировал ответ на ARP-запрос (перепутал местами поля MAC,IP для Target и Source). Но в процессе исследований выяснилась ещё одна неприятная деталь. Оказалось, что регистр приёмника RxProduceIndex при приёме первого пакета не инкрементируется и прерывание не возникает, хотя принятый пакет в буфер дескриптора кладётся. Кто-нибудь с таким сталкивался?

Сообщение отредактировал 0000h - Jul 23 2012, 18:28
Go to the top of the page
 
+Quote Post
theBMV
сообщение Aug 24 2012, 09:43
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



Цитата(0000h @ Jul 23 2012, 22:27) *
Спасибо за подсказки, проблема была в том, что я неверно формировал ответ на ARP-запрос (перепутал местами поля MAC,IP для Target и Source). Но в процессе исследований выяснилась ещё одна неприятная деталь. Оказалось, что регистр приёмника RxProduceIndex при приёме первого пакета не инкрементируется и прерывание не возникает, хотя принятый пакет в буфер дескриптора кладётся. Кто-нибудь с таким сталкивался?

В ERRATA этот момент описан уже очень давно.
Go to the top of the page
 
+Quote Post
ibiza11
сообщение Jun 10 2013, 05:43
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304



Прошу прощения за некропостинг, но насколько я знаю, этот момент не описан. Описана проблема с TxConsumeIndex. Но не с RxProduceIndex.

Сообщение отредактировал ibiza11 - Jun 10 2013, 05:43
Go to the top of the page
 
+Quote Post
theBMV
сообщение Jun 11 2013, 07:38
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



Цитата(ibiza11 @ Jun 10 2013, 09:43) *
Прошу прощения за некропостинг, но насколько я знаю, этот момент не описан. Описана проблема с TxConsumeIndex. Но не с RxProduceIndex.


Да, ошибся, не посмотрел.
Так ведь инкрементировать Produce индексы - дело как раз таки обработчика, а не периферии.
Go to the top of the page
 
+Quote Post
ibiza11
сообщение Aug 6 2013, 12:53
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304



Опять неправда. DMA инкрементирует TxConsumeIndex и RxProduceIndex. Обработчик - TxProduceIndex и RxConsumeIndex
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016