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

 
 
> 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
Ответов
scifi
сообщение Jul 24 2012, 09:58
Сообщение #2


Гуру
******

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



По скорости ничего не смогу посоветовать, так как мне разгонять стек никогда не приходилось.
Посмотрел на код драйвера: это какой-то ад. 2700 строк там, где и в 270 можно уложиться.
Прикладываю свой драйвер для uIP. Пара пояснений:
- Для приёма статически выделен набор буферов (32 штуки по 256 байт). В lwip принято выделять их динамически из специального пула. Соответственно, код будет несколько сложнее, так как будет учитывать возможность исчерпания памяти. Дело в том, что в lwip принятые пакеты будут сидеть в этих буферах до тех пор, пока приложение, обрабатывающее принятые данные, не освободит эти буферы. Я делал драйвер для ColdFire, где это как раз реализовано.
- Принятый пакет копируется из вышеупомянутых буферов в единый буфер пакета (есть такой в uIP). В lwip буферы с принятыми данными передаются наверх без копирования (zero-copy receive). Опять же, можете подсмотреть в драйвере для ColdFire.
- Отправка сделана из единого буфера пакета. Если использовать такой подход в lwip, то нужно иметь статически выделенный буфер и перед отправкой копировать туда содержимое пакета из цепочки pbuf. На самом деле можно сделать zero-copy transmit (должно работать быстрее, но это несколько сложнее).
- Драйвер ждёт окончания отправки пакета. При интенсивном обмене так можно потерять кучу процессорного времени. Можно реализовать схему без ожидания, но это несколько сложнее.
- Как всё это хозяйство подружить с ОСью (семафоры и т.д.), я не знаю, так как мне это не было нужно.
Прикрепленные файлы
Прикрепленный файл  stm32eth.txt ( 4.84 килобайт ) Кол-во скачиваний: 268
 
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   Утверждение не выполнялось в pbuf_free — нельзя пе...   Jul 24 2012, 05:57
|- - scifi   Цитата(eisufu @ Jul 24 2012, 09:57) Утвер...   Jul 24 2012, 06:14
- - 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
- - eisufu   Спасибо   Jul 24 2012, 13:18
- - Rst7   QUOTE но критично на свой код посмотреть заставили...   Jul 24 2012, 19:18


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

 


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


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