|
LwIP факт отправки UDP пакета |
|
|
|
Dec 9 2013, 00:10
|
Участник

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

|
Отсылаю больщой объем данных по UDP. Пакетами по 1000 байт. Не могу понять, как определить, готов стек к приему нового пакета или нет. Сейчас похоже слишком часто вызываю udp_send() и поэтому каждый второй пакет не доходит. Задержка помогает, но не всегда. Код while (1) { /* check if any packet received */ if (ETH_CheckFrameReceived()) { /* process received ethernet packet */ LwIP_Pkt_Handle(); } /* handle periodic timers for LwIP */ LwIP_Periodic_Handle(LocalTime); get_new_data(data); //получаю данные //delay(); //Задержка /* allocate pbuf from pool*/ p = pbuf_alloc(PBUF_TRANSPORT, 1000, PBUF_POOL); if (p != NULL ) { /* copy data to pbuf */ pbuf_take(p, (char*) data, 1000); /* send udp data */ udp_send(upcb, p); /* free pbuf */ pbuf_free(p); } }
|
|
|
|
|
 |
Ответов
|
Dec 9 2013, 07:57
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Golikov A. @ Dec 9 2013, 10:33)  факта отсылки пакета нет и быть не может. Неправда. Я специально проследил порядок выполнения udp_send(). Он ведёт прямиком к netif->linkoutput, то есть непосредственно к функции отправки пакета драйвером. Естественно, при условии, что arp уже сделал свои дела. Понятно, что драйвер может буферизировать пакеты перед отправкой, но не обязательно. У меня, к примеру, не буферизирует, а сразу отправляет.
|
|
|
|
|
Apr 14 2016, 11:25
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 14 2016, 13:16
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(TU-104 @ Apr 14 2016, 14:25)  а всё-таки, только так?... эти 4 буфера под 4 ЛЮБЫХ пакета? 4 пакета по 1500 байт, или 4 пакета по 100 байт... согласно RFC функция передачи юдп гарантирует отправку. Т.е. если вам вернули код ошибки ОК - то пакет гарантировано дошёл до трансформатора Вашего передатчика. Так по стандарту. Буфера - тут такое дело. По идее размеры резервирования прописываются в конфигураторе(как тут уже прозвучало). Т.е. зарезервируете 4 по 1000 = будет всего 4 кила. С буферами в основном засада на приёме. Выделять память в драйвере - накладно очень. Но можно а) использовать заголовки ПДП старые б) делать резервирование таких блоков - для драйвера. (круглый)
|
|
|
|
|
Apr 14 2016, 13:30
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(scifi @ Apr 14 2016, 16:21)  ..Осталось понять... когда писал - хотел дать мысль, что реализация реализацией, но существует стандарт пользовательского(с точки зрения стэка) интерфейса. А прочтёт если захочет по уму, от печки. ну где то так (круглый) ЗЫ Элемент иронии если только чуть-чуть
|
|
|
|
Сообщений в этой теме
Real_Bastard LwIP факт отправки UDP пакета Dec 9 2013, 00:10 scifi Я бы проверял возвращаемое значение функции udp_se... Dec 9 2013, 06:07    TU-104 Цитата(kolobok0 @ Apr 14 2016, 18:16) сог... Apr 15 2016, 05:06     kolobok0 Цитата(TU-104 @ Apr 15 2016, 08:06) ... Apr 15 2016, 08:49 Real_Bastard Цитата(scifi @ Dec 9 2013, 10:07) Я бы пр... Dec 9 2013, 08:53 megajohn "буферизируются или нет", это называются... Dec 9 2013, 09:38 Real_Bastard Ну приемное приложение у меня самописное и корявое... Dec 9 2013, 09:53 Golikov A. Цитата(Real_Bastard @ Dec 9 2013, 13:53) ... Dec 9 2013, 10:26 Golikov A. блокирующий и не блокирующий - это разве не к опер... Dec 9 2013, 09:56 megajohn [quote name='Golikov A.' date='Dec 9 2... Dec 9 2013, 10:14 Real_Bastard Цитата(megajohn @ Dec 9 2013, 14:14) ... Dec 9 2013, 11:05 megajohn Цитата(Real_Bastard @ Dec 9 2013, 15:05) ... Dec 9 2013, 12:04 Golikov A. то есть задача стоит как ограничить свои данные на... Dec 9 2013, 13:00 scifi Цитата(megajohn @ Dec 9 2013, 13:38) ... Dec 9 2013, 14:15 Real_Bastard Запустил шарк. 45 000 пакетов принято. А счетчик п... Dec 9 2013, 15:33 scifi Цитата(Real_Bastard @ Dec 9 2013, 19:33) ... Dec 9 2013, 17:33 Real_Bastard Цитата(scifi @ Dec 9 2013, 21:33) весьма ... Dec 9 2013, 23:00 sergey sva Если это видео может как то сжимать его перед отпр... Dec 12 2013, 12:51 Real_Bastard Цитата(sergey sva @ Dec 12 2013, 16:51) Е... Dec 13 2013, 09:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|