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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> LwIP факт отправки UDP пакета
scifi
сообщение Dec 9 2013, 17:33
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Real_Bastard @ Dec 9 2013, 19:33) *
очень не хочется...но возможно это будет самый простой вариант.

Да, забыл: весьма вероятно, что драйвер тупо игнорирует ошибку и не передаёт код наверх. Часто эти драйверы пишут левой ногой. Так что попробуйте в нём разобраться.
Go to the top of the page
 
+Quote Post
Real_Bastard
сообщение Dec 9 2013, 23:00
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 7-11-06
Из: Санкт-Петербург
Пользователь №: 22 041



Цитата(scifi @ Dec 9 2013, 21:33) *
весьма вероятно, что драйвер тупо игнорирует ошибку и не передаёт код наверх. Часто эти драйверы пишут левой ногой. Так что попробуйте в нём разобраться.

ОНО самое!!! Функция udp_send утыкается в функцию low_level_output() (порт STM32).
Цитата
/**
* This function should do the actual transmission of the packet.....
* @return ERR_OK if the packet could be sent
* an err_t value if the packet couldn't be sent
*
* @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to
* strange results. You might consider waiting for space in the DMA queue
* to become availale since the stack doesn't retry to send a packet
* dropped because of memory failure (except for the TCP timers).
*/

В общем ждать она не ждет, и всегда отсылает ОК.
Увеличил размер буфера до 1200 байт, чтоб мой килобайт влез, и не надо было разбивать его на части. low_level_output() научил для начала возвращать ошибку. Стало почти хорошо. пакеты теряются один раз из 6 000-10 000, но сразу по несколько. Итого на 100МБайт теряется 100-200К. Поток 93 Мбит\сек.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Dec 12 2013, 12:51
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Если это видео может как то сжимать его перед отправкой.
Go to the top of the page
 
+Quote Post
Real_Bastard
сообщение Dec 13 2013, 09:00
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 7-11-06
Из: Санкт-Петербург
Пользователь №: 22 041



Цитата(sergey sva @ Dec 12 2013, 16:51) *
Если это видео может как то сжимать его перед отправкой.

Да не. С исправленным драйвером вроде все ОК. около 90Мбит\с выдает без потерь.
Go to the top of the page
 
+Quote Post
TU-104
сообщение Apr 14 2016, 11:25
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Цитата(scifi @ Dec 9 2013, 12:57) *
Неправда. Я специально проследил порядок выполнения udp_send(). Он ведёт прямиком к netif->linkoutput, то есть непосредственно к функции отправки пакета драйвером. Естественно, при условии, что arp уже сделал свои дела. Понятно, что драйвер может буферизировать пакеты перед отправкой, но не обязательно. У меня, к примеру, не буферизирует, а сразу отправляет.

а всё-таки, только так? Вызвать udp_send и проверять по коду ошибки? Может, есть какой-то флаг готовности?
Посмотрел свой low_level_output, проверка есть: пытается распихать в пакет по буферам DMA и при невозможности возвращает ошибку. Конкретно в моём примере выделено 4 буфера размером 1524 байта. Значит, больше никак не узнать, только проверять есть ли место.
Может кто разбирался, еще вопросик: эти 4 буфера под 4 ЛЮБЫХ пакета? 4 пакета по 1500 байт, или 4 пакета по 100 байт...

Сообщение отредактировал TU-104 - Apr 14 2016, 12:34
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 14 2016, 13:16
Сообщение #21


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(TU-104 @ Apr 14 2016, 14:25) *
а всё-таки, только так?... эти 4 буфера под 4 ЛЮБЫХ пакета? 4 пакета по 1500 байт, или 4 пакета по 100 байт...


согласно RFC функция передачи юдп гарантирует отправку. Т.е. если вам вернули код ошибки ОК - то пакет гарантировано дошёл до трансформатора
Вашего передатчика. Так по стандарту.

Буфера - тут такое дело. По идее размеры резервирования прописываются в конфигураторе(как тут уже прозвучало). Т.е. зарезервируете 4 по 1000 = будет всего 4 кила.

С буферами в основном засада на приёме. Выделять память в драйвере - накладно очень. Но можно а) использовать заголовки ПДП старые
б) делать резервирование таких блоков - для драйвера.

(круглый)
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 14 2016, 13:21
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(kolobok0 @ Apr 14 2016, 16:16) *
согласно RFC функция передачи юдп гарантирует отправку. Т.е. если вам вернули код ошибки ОК - то пакет гарантировано дошёл до трансформатора
Вашего передатчика. Так по стандарту.

Ну-ну. Осталось понять, читал ли аффтар кода эти стандарты. Угадайте, каковы шансы? biggrin.gif
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 14 2016, 13:30
Сообщение #23


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(scifi @ Apr 14 2016, 16:21) *
..Осталось понять...


когда писал - хотел дать мысль, что реализация реализацией, но существует стандарт пользовательского(с точки зрения стэка) интерфейса.
А прочтёт если захочет по уму, от печки.

ну где то так
(круглый)
ЗЫ
Элемент иронии если только чуть-чуть sm.gif
Go to the top of the page
 
+Quote Post
TU-104
сообщение Apr 15 2016, 05:06
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Цитата(kolobok0 @ Apr 14 2016, 18:16) *
согласно RFC функция передачи юдп гарантирует отправку. Т.е. если вам вернули код ошибки ОК - то пакет гарантировано дошёл до трансформатора
Вашего передатчика. Так по стандарту.

Неее, никто такой гарантии не даст, что прям до трансформатора дошло. В примере lwip stm32 - дошло да DMA и всё, а там в MII. А там еще физика....

Цитата
Буфера - тут такое дело. По идее размеры резервирования прописываются в конфигураторе(как тут уже прозвучало). Т.е. зарезервируете 4 по 1000 = будет всего 4 кила.

Поотправлял пакеты, похоже, что там(всё в том же примере драйвера) на 4 кадра зарезервировано(не важно какого размера кадр).

Цитата
С буферами в основном засада на приёме. Выделять память в драйвере - накладно очень. Но можно а) использовать заголовки ПДП старые
б) делать резервирование таких блоков - для драйвера.

А что такое ПДП? На приёме в драйвере аналогично организовано 4 буфера, каждый на 1 кадр, максимальный размер ~1500.


Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 15 2016, 08:49
Сообщение #25


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(TU-104 @ Apr 15 2016, 08:06) *
... дошло да DMA и всё, а там в MII. А там еще физика....
...похоже, что там(всё в том же примере драйвера)...что такое ПДП? ...организовано 4 буфера...


речь идёт о стандарте. т.е. если управление вернулось в вызываемую программу - значит ушло гарантированно. либо ошибка на возврате.
перепишите "драйвер" (с учётом возврата ошибки и синхронизации вызова. если считаете, что вероятность сбоя высока), делоф то...
DMA = пдп (простите, старый советский слэнг в крови) sm.gif

если присмотритесь как устроено(STM32F4xx), то там выделяются заголовки описательные(которые ставятся в очередь dma) и сами буфера выделенные под это дело.
причём на приёме автоматически разруливается наполнение этих входных буферов поставленных в кольцо. И Вы при анализе выбираете только те, которые обозначены как
уже отработанные. По коду ошибки и состоянию флагов Вы имеете цепочку пакетов с полезными данными(либо один пакет - не суть). Вам требуется
заменить эти буфера - вот именно в этом месте Вам необходимо решать следующие задачи - тупо копировать данные, либо уменьшать объём
буферов на приёме, либо заменять на новые освободившиеся блоки памяти под буфера.
Лично сам тупо заменяю блоки памяти. А беру их из специальной очереди для драйвера. Заполненные буфера - так и уходят на верхний уровень.
т.е. нет операций копирования совсем. А заголовки так и остаются стоять в кольце (после обработки естественно флаги им выставляем правильные).

как то так - давно рисовал, по памяти сейчас изложил.
(круглый)

Сообщение отредактировал kolobok0 - Apr 15 2016, 08:52
Go to the top of the page
 
+Quote Post

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

 


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


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