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

 
 
 
Reply to this topicStart new topic
> LwIP, UDP, udp send ready?
Sagittarius
сообщение Aug 3 2018, 15:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Здравствуйте.

Проблемка, не могу найти как сдеалть. Микроконтроллер периодически (раз в 1с) посылает UDP пакет, все работает. Но надо за один раз посылать порядка 20 разных отдельных пакетов. Буфер для формирования пакетов один. Как определить что предыдущий пакет уже отправлен и можно формировать и отправлять следующий? Определить что именно отправлен, обработан модулем Eth и выдан в линию связи (а не принят адресатом).

Спасибо.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 3 2018, 16:16
Сообщение #2


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

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



Цитата(Sagittarius @ Aug 3 2018, 18:32) *
...UDP пакет...Как определить что предыдущий пакет уже отправлен и можно формировать и отправлять следующий? Определить что именно отправлен, обработан модулем Eth и выдан в линию связи (а не принят адресатом)....


По определению.
Если изернет стэк это не делает - меняйте(правьте) нафик стэк.

UDP - гарантирует ОТПРАВКУ пакета. Т.е. если вам вернулось управление после вызова функции send - то пакет 200% ушёл в сеть.


(круглый)
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 3 2018, 17:11
Сообщение #3


Гуру
******

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



Цитата(kolobok0 @ Aug 3 2018, 19:16) *
UDP - гарантирует ОТПРАВКУ пакета. Т.е. если вам вернулось управление после вызова функции send - то пакет 200% ушёл в сеть.

Там бывает буферизация, если ARP ещё не выяснил MAC. В общем, надо нырять в стек и смотреть. Самому сейчас лень.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 5 2018, 14:48
Сообщение #4


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

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



Цитата(scifi @ Aug 3 2018, 20:11) *
Там бывает буферизация...


вот это в правильной реализации не должно быть по определению. если мы отдали уже управление на вызове с уровня программы, забуфферизировали и успешно грохнулись(ну или не разрешился MAC адрес) - то это собственно нарушение контракта UDP интерфейса для юзверов.


(круглый)
ЗЫ
с ходу в рфс ничего конкретного не нашёл...может смотрел не дотошно - хз...
Go to the top of the page
 
+Quote Post
segment
сообщение Aug 5 2018, 16:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



А какая разница — потеряли пакет в стеке или в сети? Без подтверждения доставки это одно и то же.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 5 2018, 17:22
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(kolobok0 @ Aug 5 2018, 17:48) *
вот это в правильной реализации не должно быть по определению...

Это с чего бы это не должно быть? Еще как должно быть, даже обязано быть. По UART когда отправляем, тоже данные буферизуем (по-хорошему). Чем Ethernet-то отличается? Тем более когда разговор о UDP. Если следовать Вашей логике, функция отправки не должна отдавать управление до тех пор, пока фрейм не будет отправлен. Тогда уж жуткие тормоза и околонулевая скорость потока гарантирована.

Цитата
UDP - гарантирует ОТПРАВКУ пакета.

И ничего оно не гарантирует. Если места в буфере будет недостаточно - никакой отправки не произойдет, а если учесть, что разговор идет о LwIP, функция udp_sendto() вернет ошибку.

Сообщение отредактировал Arlleex - Aug 5 2018, 17:23
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 7 2018, 09:46
Сообщение #7


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

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



Цитата(Arlleex @ Aug 5 2018, 20:22) *
...По UART когда отправляем...Чем Ethernet-то отличается? ...следовать Вашей логике...И ничего оно не гарантирует....вернет ошибку.


1) юарт - не определяет протокол, формат и взаимодействие по нему. Вы можете сами выбирать разрядность, чётность, и т.д.. А уж по формату фрэйма - вообще что угодно и как угодно.
UDP определён в конкретном документе. Если Вы изобразите нечто отличное от этого определения - то это уже будет не UDP...увы и ах... В этом собственно и отличие.
2) Это не моя логика. Это есть такая фигня как RFC768 (из разряда, а мужики то и не знали)...
3) В RFC написано... This protocol provides a procedure for application programs to send messages to other programs with a minimum of protocol mechanism. Это из описания собственно. сэнд мэссэдж - собственно передача сообщения. ПЕРЕДАЧА. Не буфферезирование, а ПЕРЕДАЧА. Конечно-же можно как угодно трактовать слово "сенд".... но вот так вот написано само определение.
4) Про обработку ошибочных ситуаций не было речи - не теряйте фокус... Естественно речь идёт об успешном ответе при передачи UDP. Так вот, если стэк протокола ответит OK и при этом забуфферизирует данные и не разрешит MAC адресацию то собственно это уже будет не совсем UDP (по описанию)...

как то так
(круглый)
Go to the top of the page
 
+Quote Post
TU-104
сообщение Aug 7 2018, 11:56
Сообщение #8


Участник
*

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



Автор вообще пользу из этого пустого спора вынесет?
Цитата
Буфер для формирования пакетов один.

Буфер один, а в LwIP же динамически память выделяется (в моем по крайней мере так) для каждого отправляемого/получаемого пакета
Код
psend = pbuf_alloc(PBUF_TRANSPORT, UDP_ANS_MAX, PBUF_POOL);  // выделяем
pbuf_take(psend, UDP_ANS, UDP_ANS_MAX);  // copy data to pbuf
udp_connect(upcb_echo, addr, port);//UDP_CLIENT_PORT_MON);  // отправляем на этот порт
[b]err = udp_send[/b](upcb_echo, psend);
pbuf_free(psend);  // free pbuf /

а дальше
udp_sendto -> udp_sendto_if-> ip_output_if-> ip_output_if_opt-> (netif->output)
там уже где-то Low_level_output(..) где копируется в ДМА буфера.
Можно отследить эту ошибку "err =", но это только гарантия того, что данные передали для ОТПРАВКИ. А дальше они уже улетят так же (как говорили выше) как в UART

Сообщение отредактировал TU-104 - Aug 7 2018, 12:02
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Aug 13 2018, 14:25
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(TU-104 @ Aug 7 2018, 14:56) *
Автор вообще пользу из этого пустого спора вынесет?


автор забыл про отпуск перед написанием вопроса и ушел туда но уже вернулся :-)

Вопрос именно про конкретную реализацию а не про сферический в вакууме RFC. Что сейчас наблюдается: используя udp_sendto раз в секунду посылается 28 пакетов. Пробовал как подряд в цикле так и с паузой 20-200 мс. Но глюк один и тот же. Иногда последний пакет из пачки задерживается и приходит как первый при начале посылок за следующую секунду. Задержка именно в LwIP, смотрел траффик по Wireshark. Так что где то внутри буферизация есть и возврат из udp_send не означает физическую отправку пакета. Собственно вопрос тот же, как правильно отправлять последовательность пакетов по UDP используя LwIP?

Спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 02:40
Рейтинг@Mail.ru


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