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

 
 
> lwIP PPP netif и Ethernet netif HW/SW checksum, проблемы с аппаратным расчётом контрольной суммы
eisufu
сообщение Jul 23 2012, 05:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 29-06-10
Пользователь №: 58 196



Создаю два интерфейса - один Ethernet (STM32F4x7 Ethernet controller настроен на hardware checksum), другой - PPP over serial. lwIP в lwipopts.h имеет настройки того, как будет считаться контрольная сумма: аппаратно или программно. Конечно, для PPP железо не считает контрольную сумму, интерфейс-то — "виртуальный". Попробовал следующее: везде в коде lwIP, где встречаются CHECKSUM_GEN_* (IP, TCP, UDP, ICMP) добавить код
Код
#if CHECKSUM_GEN_*
  <code>
#else
if ((netif->flags | NETIF_FLAG_POINTTOPOINT) != 0) {
  тот же самый <code>
}
#endif

но сгодилось это лишь для ICMP, TCP уже такое не позволит, так как в функции, содержащие код:
Код
#if CHECKSUM_GEN_*
  <code>
#endif
не передаётся netif *, для которого формируется пакет TCP. Да и вообще пришёл к выводу, что контрольную сумму надо считать централизованно для PPP (на камне есть периферия, которая быстро считает CRC), а для остальных netif - в зависимости от дефайнов CHECKSUM_GEN_*, зависящих от CHECKSUM_BY_HARDWARE.
Масса исходников — сходу не могу понять, где это "узкое место" где проходят все пакеты для каждого из IP, TCP, UDP, ICMP. Каково красивое решение?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
eisufu
сообщение Jul 24 2012, 05:57
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 29-06-10
Пользователь №: 58 196



Утверждение не выполнялось в pbuf_free — нельзя передавать NULL аргументом, а вызывалась pbuf_free из ethernetif.c:ethernetif_input, которая изменена в соответствии с :
CODE
void ethernetif_input( void * pvParameters )
{
struct pbuf *p;

for( ;; )
{

if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
{
GET_NEXT_FRAGMENT:
p = low_level_input( s_pxNetIf );
if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
{
if (p != NULL) {
pbuf_free(p);
p = NULL;
}
}
else
{
xSemaphoreTake(s_xSemaphore, 0);
goto GET_NEXT_FRAGMENT;
}
}
}
}

от себя добавил только строку "if (p != NULL) {" стабильно держит напор скрипта (Lua):
CODE
local socket = require('socket')

local client
client, err = socket.udp()
if err then
error(err)
end
local rport = 22222
local raddress = "172.16.0.100"
_, err = client:setpeername(raddress, rport)
if err then
error(err)
end
local MAX_PAYLOAD_SIZE = 1472
local payload = string.rep('@', MAX_PAYLOAD_SIZE)
local n = 0
while true do
_, err = client:send(payload) -- never blocks
if err then
print(err)
else
n = n + 1
print(string.format('%d', n))
end
end

кстати
Код
cat /dev/random | nc -u 172.16.0.100 22222

не работает как надо, так как UDP датаграммы с payload больше 1472 - фрагментируются (и не успевают собраться). Нагрузка на процессор была ~54%. Теперь выдаёт >>90% c CHECKSUM_BY_HARDWARE:
Код
udpTestTask             2530110         7%
counterTask             26552           <1%
IDLE            1871340         5%
blinkTask               319             <1%
tcpip_thread            13769936                38%
Eth_if          17729671                49%
Tmr Svc         24              <1%
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 24 2012, 06:14
Сообщение #3


Гуру
******

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



Цитата(eisufu @ Jul 24 2012, 09:57) *
Утверждение не выполнялось в pbuf_free — нельзя передавать NULL аргументом, а вызывалась pbuf_free из ethernetif.c:ethernetif_input, которая изменена в соответствии с ...

Как и следовало ожидать: накосячил пейсатель драйвера. Кто автор? Пошлите ему лучики благодарности.
Кстати, весьма вероятно, что этот драйвер - не более чем демонстрация, и серьёзно не тестировался. Легко могут быть и другие баги.

Update:
Кстати, я недавно написал свой драйвер для STM32 Ethernet MAC и uIP. Получилось всего 200 строк. Для lwip должно быть аналогично. Возможно, проще отказаться от чужого драйвера и сделать свой.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- eisufu   lwIP PPP netif и Ethernet netif HW/SW checksum   Jul 23 2012, 05:14
- - scifi   Насколько я понимаю, надо эмулировать поведение ап...   Jul 23 2012, 06:13
- - eisufu   Получается, что стоит отказаться от аппаратного ра...   Jul 23 2012, 06:26
|- - scifi   Цитата(eisufu @ Jul 23 2012, 10:26) Получ...   Jul 23 2012, 06:47
- - eisufu   Просто в эту железку (потом будет STM32F417) ещё S...   Jul 23 2012, 07:12
|- - scifi   Цитата(eisufu @ Jul 23 2012, 11:12) Прост...   Jul 23 2012, 07:18
- - eisufu   У железки аппаратная поддержка SSL. Померю загрузк...   Jul 23 2012, 07:48
|- - scifi   Цитата(eisufu @ Jul 23 2012, 11:48) Помер...   Jul 23 2012, 07:58
- - eisufu   Сделал диспетчер задач (собственно, оформил FreeRT...   Jul 23 2012, 11:47
|- - scifi   Цитата(eisufu @ Jul 23 2012, 15:47) Мало ...   Jul 23 2012, 11:56
- - eisufu   Ладно). Что-то я видать совсем обнаглел. Буду погр...   Jul 23 2012, 12:38
- - eisufu   иметь бы опыт или требования, наводящие на правиль...   Jul 24 2012, 09:36
|- - VslavX   Цитата(eisufu @ Jul 24 2012, 12:36) что-т...   Jul 24 2012, 18:52
|- - Rst7   QUOTE (VslavX @ Jul 24 2012, 21:52) Малов...   Jul 24 2012, 19:00
||- - VslavX   Цитата(Rst7 @ Jul 24 2012, 22:00) Я смотр...   Jul 24 2012, 19:16
|- - scifi   Цитата(VslavX @ Jul 24 2012, 22:52) Сегод...   Jul 24 2012, 19:04
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 00:52) iperf...   Jul 25 2012, 04:35
|- - VslavX   Цитата(eisufu @ Jul 25 2012, 07:35) Сложн...   Jul 25 2012, 04:43
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 10:43) Реали...   Jul 25 2012, 05:52
|- - VslavX   Цитата(eisufu @ Jul 25 2012, 08:52) Какие...   Jul 25 2012, 07:46
|- - eisufu   Цитата(VslavX @ Jul 25 2012, 13:46) решил...   Jul 25 2012, 09:52
- - scifi   По скорости ничего не смогу посоветовать, так как ...   Jul 24 2012, 09:58
- - eisufu   Спасибо   Jul 24 2012, 13:18
- - Rst7   QUOTE но критично на свой код посмотреть заставили...   Jul 24 2012, 19:18


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:10
Рейтинг@Mail.ru


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