|
Самый быстрый и самый маленький TCP-стек., По просьбам трудящихся. |
|
|
|
Jul 27 2011, 10:57
|

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

|
Итак, по просьбам трудящихся выкладываю порт своего стека на LPC1768, выдранный из текущего проекта, над которым щас тружусь.
NikeE_CM3.zip ( 350.37 килобайт )
Кол-во скачиваний: 563
Собирается IAR'ом 6.20.3 (вроде крайний на текущий момент), за подправить для GCC - даже не просите. В качестве PHY используется KSZ8041TL, что, в общем, не принципиально - править, если что, файл emac.c Тактовая проца в проекте - 100МГц, кварц - 20МГц, менять - функция InitPLL в файле hardware_init.c Так же для генерации 50МГц REFCLK используется сам процессор через модуль CLKOUT. Кому не надо, в файле hardware_init.c необходимо убрать CODE //Нужно если 50МГц для RMII генерируется процом PINSEL3 |= (0x01UL<<22); //CLKOUT on P1.27 CLKOUTCFG=0x00000110; //CLKOUT 100MHz/2=50MHz used for RMII Стек поддерживает TCP (и серверные, и клиентские сокеты), ICMP. Очень не долго прикрутить UDP. Поддерживается Fast Retransmit на передачу. На прием - сделаю чуть позже (если, конечно, понадобится). Архитектура стека - callback по событиям из низкоприоритетного прерывания (используется модуль RIT как таймер, необходимый для TCP и заодно происходит Wakeup этого потока при поступлении пакетов - через прерывание от EMAC, которые должно быть высокоприоритетным (но при этом очень короткое, TODO - управление Flow Control)). Сам стек - network.c. По умолчанию IP-адрес - 192.168.0.100. Есть вебинтерфейс, даже с поддержкой ajax - можно поставить галочку Update Graphics и повеселиться (естественно, с браузером, который понимает HTML5 - Опера, Хром, Тормозилла - все годится). Кнопки "<<" и ">>" тоже можно понажимать. Для создания и отображения этих данных копать show_data.c и HTMLsource/http_root_level3. Еще там случайно md5-авторизация в вебсервере сделана
Эмулятор EEPROM в проекте не прикручен, так что на страничке конфигурации настройки стека не сохраняются. Когда у себя в проекте прикручу, сюда сделаю порт. На порту 2000 висит отдаватель файла со случайными числами размером 100 мегабайт - это для теста скорости. В папочке GetData лежит проект забирателя для большого брата (собирать C++ Builder'ом). Ну вот теперь, собственно, за скорость. По TCP - 90Мбит/с.
На этом, кстати, предлагаю закончить спор о максимально достижимой скорости по TCP. Ну размеры вообще не угадываются - 3.7кБ собственно стек, вебсервер - 3.5кБ. Ах да, там еще странички пакуются, но это осталось с версии для AVR, можно честно выбросить. Собственно, примеры использования можно смотреть в rx_tcp_dump.c (тупой отправлятель данных) и http_server.c (веб-сервер, там берегите мозг). Ну и на посошок - лицензии. От это все - GPL, так что пользуйтесь. На все вопросы постараюсь ответить тут. Добавлено 29 июня 2011г: http://electronix.ru/forum/index.php?s=&am...st&p=956930 - ревизия 1315.Добавлено 30 июля 2011г: http://electronix.ru/forum/index.php?s=&am...st&p=957213 - ревизия 1318.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
 |
Ответов
|
Jul 28 2011, 11:27
|

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

|
Кстати, о максимальной пропускной способности. Имеем максимальный пакет 1518 байт с полезной TCP-нагрузкой 1460 байт. Плюс 96 бит IFG. Итого максимальная скорость в битах в секунду по полезной нагрузке равна 95424836. И те, кто заявляет больше (например - 98 у AlexandrY  ) привирают. QUOTE Ну я понял Вас так - что когда надо читать данные с MMC в сокет, то вызывается колбек, на MMC посылается команда чтения сектора, и управление возвращается в стек. Потом некто в фоне прокручивает протокол MMC по SPI и по готовности снова пытаеся начать передачу в сокет. То есть - SPI занят, MMC готова давать данные, осталось только получить передающий буфер сети. А тут засада - идет передача по другому сокету, например, и все - аппаратный ресурс SPI+MMC тупо простаивает, потому как нет буфера. Буфер появится как только освободится предыдущий. А точнее, предыдущий передается, текущий - создается. Так что никаких задержек не будет. Если, конечно, вторая задача вменяема и не генерирует данные секундами. QUOTE C MMC есть еще засада - SDHC карты отдают сектора только целиком, поэтому если REGENERATE будет невыравнен (а он в 99% невыравнен) по границе сектора Это надуманная проблема. Свести выравнивание к границе сектора - цена одного пакета. Так что никакого геморроя. QUOTE Где тут "дульный компенсатор" который регулирует поток входящих данных? Крутите окно заранее. В принципе, можно и небольшой буфер использовать, только без фанатизма. Вообще грамотный выбор окна и MTU - залог успеха при ограниченных объемах ОЗУ. Кстати, а дайте-ка описание SDHC протокола карт, попробую сделать пример реализации - все одно в хозяйстве пригодится. QUOTE Эту работу можно вынести в отдельные .c/.h файлы так, что генерируемый код останется почти таким же самым - то есть основная идея "сплавить стек в единый кусок" не пострадает, а вот портируемость и читабельность сильно возрастет. Соответственно ценен будет для большего количества людей. Я попробую. Хотя, честно говоря, особо не вижу смысла. Стек сей - не для бездумного ^C^V в свой проект. Сначала надо подумать, потом сделать.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 28 2011, 13:03
|

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

|
Цитата(Rst7 @ Jul 28 2011, 14:27)  Буфер появится как только освободится предыдущий. А точнее, предыдущий передается, текущий - создается. Так что никаких задержек не будет. Если, конечно, вторая задача вменяема и не генерирует данные секундами. Буфер-то в стеке появится, но будет отдан другому сокету, например. И пока это другой сокет не прекратит передачу - MMC будет стоять. Цитата(Rst7 @ Jul 28 2011, 14:27)  Крутите окно заранее. В принципе, можно и небольшой буфер использовать, только без фанатизма. Вообще грамотный выбор окна и MTU - залог успеха при ограниченных объемах ОЗУ. Что значит крутить окно заранее? Это вообще не задача приложения - крутить окно. Вы на примере, пожалуйста, прокомментируйте - нужно писать входящий поток из сокета в MMC, просто - последовательно по секторам, без всякой файловой системы. Как это предполагается сделать и где тут "крутить окно"? Скорость ММС ну пусть будет 512байт/мс. А сети - пусть 10Кбайт/мс. Цитата(Rst7 @ Jul 28 2011, 14:27)  Это надуманная проблема. Свести выравнивание к границе сектора - цена одного пакета. Так что никакого геморроя. Это не надуманная проблема, это следствие необходимости удовлетворять REGENERATE по произвольной границе при отсутствии буфера. И допустим, слать выравнено по границе сектора еще можно (вообще дикость, ну и мы ж за пропускную бьемся, да? 1460 - наше фсе  ), а как это вы заставите удаленный хост подтверждать прием четко по границе сектора? То есть - в любой момент может прийти REGENERATE типа "а дайте-ка мне вот 5 байт из этого сектора и далее". Цитата(Rst7 @ Jul 28 2011, 14:27)  Кстати, а дайте-ка описание SDHC протокола карт, попробую сделать пример реализации - все одно в хозяйстве пригодится. В закромах есть. Цитата(Rst7 @ Jul 28 2011, 14:27)  Я попробую. Хотя, честно говоря, особо не вижу смысла. Стек сей - не для бездумного ^C^V в свой проект. Сначала надо подумать, потом сделать. Это Ваша оценка ценности этого модуля. Еще паре-тройке-десятке человек на форуме интересно обсудить теоретические вопросы. А "трудящимся", по "просьбе" которых это выложено, ценны именно читабельность и портабельность. Цитата(AlexandrY @ Jul 28 2011, 15:51)  В настоящей стековой архитектуре обработка на каждом этапе идет на близких данных, эффективнее используется кэш или буфер данных. Тут вроде бы проблем с таким нету - и данные заголовка влезут в кеш и сам код обработчика тоже влезет в кеш (насчет вот колбеков вопрос открыт, правда). Но хранить MAC-адрес удаленного хоста в TCP-сокете - это готично  . А если нету вообще снизу MAC-адреса (кстати, а как тут с примитивной маршрутизацией - хотя бы на gw, есть такое?), например PPP вместо эзернета? А если несколько интерфейсов, один с эзернетом, другой с PPP, куда бедному TCP-сокету податься?
|
|
|
|
|
Jul 28 2011, 14:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072

|
Цитата(VslavX @ Jul 28 2011, 16:03)  Но хранить MAC-адрес удаленного хоста в TCP-сокете - это готично  . А если нету вообще снизу MAC-адреса (кстати, а как тут с примитивной маршрутизацией - хотя бы на gw, есть такое?), например PPP вместо эзернета? А если несколько интерфейсов, один с эзернетом, другой с PPP, куда бедному TCP-сокету податься?  Возможно я не прав, но реализация протокола от Rst7 заточена под вполне конкретное применение. Это позволяет выжать максимум скорости для данной реализации. Отсюда и MAC, и коллбэки, и не совсем четко разнесенная по уровням обработка. Но если устройство соответствует ТЗ, то это абсолютно не важно.
|
|
|
|
|
Jul 28 2011, 14:33
|

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

|
Цитата(halfdoom @ Jul 28 2011, 17:24)  Возможно я не прав, но реализация протокола от Rst7 заточена под вполне конкретное применение. Это позволяет выжать максимум скорости для данной реализации. Отсюда и MAC, и коллбэки, и не совсем четко разнесенная по уровням обработка. Но если устройство соответствует ТЗ, то это абсолютно не важно. А никто и не спорит - именно "заточенная" реализация, при соблюдении ряда условий и ограничений вполне имеет право на жизнь. А обсуждение - оно на то, если кто будет применять - чтобы сразу осознавал, на что подписывается. Цитата(Rst7 @ Jul 28 2011, 17:25)  А как еще? Именно так. Только бояться не надо, ничего сложного. Угу, для Вас несложно, для меня несложно, а для человека, незнакомого с протоколом TCP - вполне себе может быть проблемой.
|
|
|
|
Сообщений в этой теме
Rst7 Самый быстрый и самый маленький TCP-стек. Jul 27 2011, 10:57 andrewlekar Эмуляцию EEPROM уже хочется глянуть. У меня своя е... Jul 27 2011, 11:09 Rst7 QUOTE Эмуляцию EEPROM уже хочется глянуть.
А что,... Jul 27 2011, 11:45 prottoss А че он самый быстрый то? С чем сравнивалось?
У мя... Jul 27 2011, 12:33 VslavX Цитата(prottoss @ Jul 27 2011, 15:33) А ч... Jul 27 2011, 14:54  blackfin Цитата(VslavX @ Jul 27 2011, 18:54) А вот... Jul 27 2011, 15:36   VslavX Цитата(blackfin @ Jul 27 2011, 18:36) Мож... Jul 27 2011, 17:08    blackfin Цитата(VslavX @ Jul 27 2011, 21:08) Я вот... Jul 27 2011, 17:16 Rst7 QUOTE А че он самый быстрый то? С чем сравнивалось... Jul 27 2011, 12:40 prottoss Цитата(Rst7 @ Jul 27 2011, 18:40) А Вы за... Jul 27 2011, 12:50 Rst7 QUOTE А сколько занимает памяти TCP-сокет кстати?
... Jul 27 2011, 13:07 prottoss Цитата(Rst7 @ Jul 27 2011, 19:07) Давайте... Jul 27 2011, 13:20 Rst7 QUOTE Хорошо. Постараюсь причесать до понедельника... Jul 27 2011, 13:24 prottoss Цитата(Rst7 @ Jul 27 2011, 19:24) Так а п... Jul 27 2011, 13:55 prottoss Цитата(Rst7 @ Jul 27 2011, 19:24) Так а п... Jul 28 2011, 08:03 scifi Интересная штука. Эх, причесать бы код и абстрагир... Jul 27 2011, 14:01 prottoss Цитата(scifi @ Jul 27 2011, 20:01) Эх, пр... Jul 27 2011, 14:13 zltigo QUOTE (scifi @ Jul 27 2011, 16:01) Эх, пр... Jul 27 2011, 14:28 Rst7 QUOTE Эх, причесать бы код и абстрагировать от жел... Jul 27 2011, 14:27 prottoss Цитата(Rst7 @ Jul 27 2011, 20:27) Так - п... Jul 27 2011, 15:09 Rst7 QUOTE Судя по скорости работы с конкретным железом... Jul 27 2011, 14:48 Rst7 QUOTE Может быть, обсудим методику тестирования пр... Jul 27 2011, 15:08 Rst7 QUOTE Чего там оно просит?
В windows/drivers/etc/... Jul 27 2011, 15:23 Rst7 QUOTE Я вот жду LPC18xx - у него EMAC продвинутый,... Jul 27 2011, 18:24 VslavX Цитата(Rst7 @ Jul 27 2011, 21:24) Однако ... Jul 27 2011, 20:57 Rst7 QUOTE Можно, например, Ethereal'ом протестиров... Jul 27 2011, 20:34 blackfin Цитата(Rst7 @ Jul 28 2011, 00:34) Только ... Jul 28 2011, 04:15 Rst7 QUOTE Ну, допустим, не в два, а чуть больше чем в ... Jul 27 2011, 21:28 VslavX Цитата(Rst7 @ Jul 28 2011, 00:28) Имеем з... Jul 28 2011, 06:08 halfdoom Цитата(Rst7 @ Jul 27 2011, 13:57) Ну вот ... Jul 28 2011, 04:04 andrewlekar ЦитатаА что, собственно стек не интересен?
Не особ... Jul 28 2011, 04:19 Rst7 QUOTE Их никто и не складывает. Данные идут в одно... Jul 28 2011, 06:39 VslavX Цитата(Rst7 @ Jul 28 2011, 09:39) А оно-т... Jul 28 2011, 07:36 Rst7 Подумал про передачу данных, например, с MMC. Да, ... Jul 28 2011, 07:48 VslavX Цитата(Rst7 @ Jul 28 2011, 10:39) прерыва... Jul 28 2011, 07:56 Rst7 QUOTE Угу, а если стек занят (ну по другому сокету... Jul 28 2011, 08:14 VslavX Цитата(Rst7 @ Jul 28 2011, 11:14) Почему?... Jul 28 2011, 10:53 AlexandrY Цитата(Rst7 @ Jul 27 2011, 13:57) Итак, п... Jul 28 2011, 10:08 Rst7 QUOTE и вижу вы даже не пытались оптимизировать ра... Jul 28 2011, 10:30 AlexandrY Цитата(Rst7 @ Jul 28 2011, 13:30) Именно ... Jul 28 2011, 12:51 Rst7 QUOTE Что значит крутить окно заранее? Это вообще ... Jul 28 2011, 13:33 VslavX Цитата(Rst7 @ Jul 28 2011, 16:33) Для так... Jul 28 2011, 14:10 Rst7 QUOTE Угу, и еще залезли в s->win и сделали его... Jul 28 2011, 14:25 Rst7 QUOTE а для человека, незнакомого с протоколом TCP... Jul 28 2011, 14:52 blackfin Цитата(Rst7 @ Jul 28 2011, 18:52) Более т... Jul 28 2011, 15:18  zltigo QUOTE (blackfin @ Jul 28 2011, 18:18) Ага... Jul 28 2011, 17:32   blackfin Цитата(zltigo @ Jul 28 2011, 21:32) При э... Jul 28 2011, 18:31    zltigo QUOTE (blackfin @ Jul 28 2011, 21:31) и и... Jul 28 2011, 18:50     VslavX Цитата(zltigo @ Jul 28 2011, 21:50) Прими... Jul 28 2011, 19:08      zltigo QUOTE (VslavX @ Jul 28 2011, 22:08) А что... Jul 28 2011, 19:19       VslavX Цитата(zltigo @ Jul 28 2011, 22:19) Там д... Jul 28 2011, 19:32        zltigo QUOTE (VslavX @ Jul 28 2011, 22:32) И что... Jul 28 2011, 19:43 Rst7 QUOTE Ага, вот тут и встает наш Главный холиварный... Jul 28 2011, 16:13 VslavX Цитата(Rst7 @ Jul 28 2011, 19:13) Да поро... Jul 28 2011, 17:56 yakub_EZ IAR 6.21.1.2846 и common components 6.3.3.1990. П... Jul 28 2011, 16:18 Rst7 QUOTE При компиляции просит revision.c, где его вз... Jul 28 2011, 16:36 Rst7 QUOTE ИМХО, как раз LPC17xx неудачно выбран для ил... Jul 28 2011, 19:23 VslavX Цитата(Rst7 @ Jul 28 2011, 22:23) конечно... Jul 28 2011, 19:45 Rst7 QUOTE и похоже таки со 100% загрузкой ядра (раз 92... Jul 28 2011, 20:04 VslavX Цитата(Rst7 @ Jul 28 2011, 23:04) Ну я по... Jul 28 2011, 20:20 VslavX Цитата(Rst7 @ Jul 28 2011, 23:04) А вот т... Jul 28 2011, 20:36 Rst7 QUOTE Хм, а разве он их генерирует, а не просто бе... Jul 28 2011, 20:28 VslavX Цитата(Rst7 @ Jul 28 2011, 23:28) Распако... Jul 28 2011, 20:44 aaarrr Цитата(Rst7 @ Jul 29 2011, 00:28) Да ладн... Jul 28 2011, 22:06 Rst7 QUOTE Это для пакета в 1460 байт? Примерно 1 такт ... Jul 28 2011, 20:43 Rst7 QUOTE А что - на PIO получится 25МГц выдать?
Ну п... Jul 28 2011, 20:55 Rst7 ЦитатаА еще придется CRC16 считать для каждой из ч... Jul 29 2011, 06:59 Rst7 QUOTE Не стоит овчинка выделки - сделать можно, но... Jul 29 2011, 08:18 Rst7 Сделал правильный отправлятель пакетов (без тупого... Jul 29 2011, 10:00 RA3WUM Rst7
Сколько данный стек занимает RAM? В LPC1114 ... Jul 29 2011, 15:28 Rst7 QUOTE Сколько данный стек занимает RAM? В LPC1114 ... Jul 29 2011, 19:02 RA3WUM Цитата(Rst7 @ Jul 29 2011, 23:02) Или как... Jul 29 2011, 19:26 Rst7 QUOTE Соответсвенно скорость порядка 96-192 кБит/с... Jul 29 2011, 19:41 RA3WUM Цитата(Rst7 @ Jul 29 2011, 23:41) Источни... Jul 29 2011, 19:59 Rst7 QUOTE Если не ошибаюсь на вашем стеке уже делали и... Jul 29 2011, 20:36 RA3WUM Цитата(Rst7 @ Jul 30 2011, 00:36) Да. Но ... Jul 29 2011, 20:57 Rst7 QUOTE Но в моём случае что есть под рукой, от того... Jul 29 2011, 21:37 RA3WUM Цитата(Rst7 @ Jul 30 2011, 01:37) VS1053 ... Jul 30 2011, 11:56 Rst7 Поигрался с dummynet, подправил некоторые неточнос... Jul 30 2011, 08:57 VslavX Небольшой апдейт про "Машу"
Включил клю... Jul 30 2011, 12:32 prottoss Цитата(VslavX @ Jul 30 2011, 18:32) Небол... Jul 30 2011, 12:39  VslavX Цитата(prottoss @ Jul 30 2011, 15:39) Дак... Jul 30 2011, 12:53   prottoss Цитата(VslavX @ Jul 30 2011, 18:53) Почем... Jul 30 2011, 13:03 Rst7 QUOTE Имхо, вполне приличный результат для полноце... Jul 30 2011, 12:56 VslavX Цитата(Rst7 @ Jul 30 2011, 15:56) Ага, из... Jul 30 2011, 13:08 Rst7 QUOTE Где на LPC17 взять такой реальный поток данн... Jul 30 2011, 13:04 Rst7 QUOTE Так что проигрыш всего 10 процентов скорости... Jul 30 2011, 13:13 VslavX Цитата(Rst7 @ Jul 30 2011, 16:13) Проигры... Jul 30 2011, 13:29 Rst7 QUOTE а еще Out-of-Order Segments и Selective ACK
... Jul 30 2011, 13:39 VslavX Цитата(Rst7 @ Jul 30 2011, 16:39) Я с одн... Jul 30 2011, 14:10 Rst7 QUOTE хотя, если тут перейти на RTOS, то это свою ... Jul 30 2011, 14:39 zltigo QUOTE (Rst7 @ Jul 30 2011, 16:39) Не пора... Jul 30 2011, 15:10 VslavX Цитата(Rst7 @ Jul 30 2011, 17:39) Не пора... Jul 30 2011, 15:21 Rst7 QUOTE Написание и использование RTOS (кстати, ои о... Jul 30 2011, 15:21 VslavX Цитата(Rst7 @ Jul 30 2011, 18:21) Да я не... Jul 30 2011, 15:38 Rst7 QUOTE Угу, все именно так. Поэтому malloc/free у м... Jul 30 2011, 15:34
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|