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

Группа: Участник
Сообщений: 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. Каково красивое решение?
|
|
|
|
|
 |
Ответов
|
Jul 24 2012, 09:36
|
Участник

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

|
иметь бы опыт или требования, наводящие на правильный путь, а то бы и пример сгодился альтернативный имеющемуся?) * "в соответствии с :" — это я про st.comтестирую запрос-ответ: CODE local socket = require('socket')
local client client, err = socket.udp() if err then error(err) end local lport = 22222 local laddress = "172.16.0.1" _, err = client:setsockname(laddress, lport) 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 payload = '' for i = 1, MAX_PAYLOAD_SIZE do payload = payload .. string.char(math.random(0, 0xFF)) end local n = 0 while true do --[[ --stalls local payload = '' for i = 1, MAX_PAYLOAD_SIZE do payload = payload .. string.char(math.random(0, 0xFF)) end ]] _, err = client:send(payload) -- never blocks if err then print(err) else n = n + 1 print(string.format('send # = %d', n)) end dgram, err = client:receive() if dgram then print(string.format('rcvd size = %d', #dgram)) else print(err) end end железка выдаёт в обменах/с (возвращает pbuf, который приняла без изменений): CODE 664.010620 663.129944 664.451843 664.231140 664.010620 663.790222 663.790222 664.231140 663.570007 663.570007 662.471008 662.690552 662.690552 663.790222 664.010620 663.790222 664.010620 664.231140 663.349915 663.570007 663.129944 663.129944 663.349915 664.010620 663.349915 663.570007 663.129944 663.349915 663.790222 664.010620 663.570007 659.630615 661.157043 664.451843 663.570007 663.129944 663.790222 664.451843 663.129944 663.570007 664.231140 664.451843 что-то около 8Mbit/s в каждую сторону. Для железки 168МГц — сносно? 1.3мс реакция (в Wireshark-е смотрел). У компа - 0.2мс рекация. Код 658.544617 0 658.111206 0 658.544617 0 658.544617 0 656.598816 0 655.307983 0 656.383301 0 654.878845 0 657.030212 0 656.383301 0 658.761536 0 — с закомментированной CHECKSUM_BY_HARDWARE в lwipopts.h Разница в 1%~. Действительно разницы нет HW или SW checksum.
Сообщение отредактировал eisufu - Jul 24 2012, 09:20
|
|
|
|
|
Jul 24 2012, 18:52
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(eisufu @ Jul 24 2012, 12:36)  что-то около 8Mbit/s в каждую сторону. Для железки 168МГц — сносно? Маловато будет. Сегодня закончил разработку драйвера для EMAC STM32Fxxx, с опциональной/отключаемой поддержкой аппаратных сумм - сам драйвер более 4 тыс строк, с использованием RTOS. На F207@120МГц результаты такие (поток в одну сторону, iperf-ом мерялось): С отключенными суммами (скорость указана в "полезных" байтах TCP-соединения, теоретический предел порядка 96 мбит/сек): - прием от PC - 95.7 мбит/сек, загрузка процессора 77 процентов (23 в IDLE остается еще) - передача на PC - 87.8 мб, загрузка процессора 59 процентов (41 в IDLE) С включенными аппаратными суммами: - прием от PC - 95.7 мбит/сек, загрузка процессора 55 процентов (45 в IDLE) - передача на PC - 88.4 мб, загрузка процессора 51 процентов (49 в IDLE) Цитата(eisufu @ Jul 24 2012, 12:36)  Разница в 1%~. Действительно разницы нет HW или SW checksum. Как показывают приведенные цифры - заметная разница вылазит только на относительно больших скоростях. Ваши потоки на порядок меньше, соответственно и разница тоже на порядок меньше (22 процента разделить на 10 - пару процентов и выходит). Справедливости ради надо заметить, что я обломался с написанием обработки специфических ошибок DMA передатчика и в обоих случаях (с суммами и без) контроллер работает в режиме Store-And-Forward, этим я объясняю недостижение передатчиком теоретического максимума в 96 мбит/сек.
|
|
|
|
|
Jul 24 2012, 19:00
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE (VslavX @ Jul 24 2012, 21:52)  Маловато будет. Сегодня закончил разработку драйвера для EMAC STM32Fxxx, с опциональной/отключаемой поддержкой аппаратных сумм - сам драйвер более 4 тыс строк, с использованием RTOS. На F207@120МГц результаты такие (поток в одну сторону, iperf-ом мерялось): С отключенными суммами (скорость указана в "полезных" байтах TCP-соединения, теоретический предел порядка 96 мбит/сек): - прием от PC - 95.7 мбит/сек, загрузка процессора 77 процентов (23 в IDLE остается еще) - передача на PC - 87.8 мб, загрузка процессора 59 процентов (41 в IDLE) С включенными аппаратными суммами: - прием от PC - 95.7 мбит/сек, загрузка процессора 55 процентов (45 в IDLE) - передача на PC - 88.4 мб, загрузка процессора 51 процентов (49 в IDLE) Я смотрю, зацепил я Вас в той теме со стеком. Цифры у Вас явно выше тогдашних, поздравляю
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 24 2012, 19:16
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Rst7 @ Jul 24 2012, 22:00)  Я смотрю, зацепил я Вас в той теме со стеком. Цифры у Вас явно выше тогдашних, поздравляю  Ну не то чтобы зацепили, но критично на свой код посмотреть заставили  Цитата(scifi @ Jul 24 2012, 22:04)  Если эти 100 Мбит на практике не нужны, то лучше направить свою энергию в более конструктивное русло. TCP/IP стек - это универсальный кубик, его можно применить в любом проекте, не ограничивая себя теми, где "эти 100 Мбит на практике не нужны". Например этот же "кубик" у меня стоит в проекте где и гигабита маловато.
|
|
|
|
Сообщений в этой теме
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 Утверждение не выполнялось в pbuf_free — нельзя пе... Jul 24 2012, 05:57 scifi Цитата(eisufu @ Jul 24 2012, 09:57) Утвер... Jul 24 2012, 06:14  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|