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

 
 
> Вышла предварительная версия TN NET TCP/IP stack
yuri_t
сообщение Aug 13 2009, 09:47
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



TN NET TCP/IP написан для процессоров с размером RAM >= 32 KBytes и с размером FLASH >= 128 KBytes ( NXP © LPC23xx/LPC17XX, Atmel © AT91SAM7X, Luminary Micro © LM3S6xx/LM3S8xx/LM3S9xx, Freescale © MCF5223X и других аналогичных MCU).

TN NET TCP/IP stack базируется на industry-standard BSD TCP/IP stack. В качестве API используются BSD sockets. TN NET TCP/IP stack использует TNKernel ОСРВ для обеспечения действительно мультизадачной и реентерантной работы.

B предварительную версию (0.8) не включены TCP и DHCP протоколы.

www.tnkernel.com
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 56)
zltigo
сообщение Aug 13 2009, 13:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(yuri_t @ Aug 13 2009, 11:47) *
TN NET TCP/IP stack базируется на industry-standard BSD TCP/IP stack.

О! Т.е. Действительно максимально портировали BSD исходники? Или просто, типа, в приглядку писали?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 13 2009, 13:44
Сообщение #3


Йа моск ;)
******

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



Цитата
Вышла предварительная версия TN NET TCP/IP stack


Цитата
B предварительную версию (0.8) не включены TCP и DHCP протоколы.


biggrin.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Aug 13 2009, 14:50
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



- по поводу портирования BSD

Идея была использовать BSD stack по максимуму, добавляя/изменяя только те части, которые не помещаются в 32kbyte RAM/128 kbyte ROM.

В частности, весь TCP/UDP/IP/ARP взят с минимальными изменениями из BSD Lite 4.4/OpenBSD/NetBSD. Изменения коснулись тех мест, которые не требуются и/или не помещаются в MCU типа LPCxx (например, не требуется перехода из kernel space в user space и обратно)

BTW, TCP stack будет выложен в ближайшее время.

IMHO, написать stack c нуля (начитавшись разнообразных RFC) конечно можно, но такой продукт, во-первых, будет
ничем не лучше BSD, во-вторых, потребует многолетнего тестирования для выявления всяких obscure bugs. Кстати,
такими проблемами страдают многие коммерческие реализации TCP/IP именно из-за ограниченной для маленьких
компаний возможности тестирования.

С другой стороны, если не устраивать революций в BSD Lite 4.4 TCP/IP, a изменить только незначительные/
второстепенные части, то можно всего за несколько итераций получить надежно работающий stack. Так поступила,
например, компания InterNiche в своем продукте NicheLite (и Microsoft (!) в WinSock2)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 13 2009, 15:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(yuri_t @ Aug 13 2009, 16:50) *
IMHO, написать stack c нуля (начитавшись разнообразных RFC) конечно можно, но....

Ну я к этому и не призывал smile.gif.
Цитата
С другой стороны, если не устраивать революций в BSD Lite 4.4 TCP/IP, a....

Вот именно этот путь мне очень привлекателен.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Aug 26 2009, 10:36
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



TN NET обновилась до версии 0.8.3.

TN NET TCP IP/ stack версии 0.8.3 включает TCP/UDP/IP/ICMP/ARP протоколы.

www.tnkernel.com
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2009, 10:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(yuri_t @ Aug 26 2009, 12:36) *
TN NET TCP IP/ stack версии 0.8.3 включает TCP/UDP/IP/ICMP/ARP протоколы.

Отлично! Правда я так и не нашел времени вдумчиво посмотреть sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 14 2009, 06:00
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



TN NET TCP/IP stack обновился до версии 0.8.5.

Добавлен пример "Embedded Web server".

TN NET TCP/IP stack версии 0.8.5 представляется достаточно зрелым для использования/тестирования
в реальных проектах.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Oct 1 2009, 12:24
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Вышла версии 0.9 TN NET TCP/IP stack.

Добавлен DHCP client.

Просьба ко всем, кто использует (пробует) TN NET TCP/IP stack - присылайте,
пожалуйста, ваши замечания и предложения на yuri@tnkernel.com.
Go to the top of the page
 
+Quote Post
sim732
сообщение Mar 28 2010, 19:22
Сообщение #10





Группа: Участник
Сообщений: 3
Регистрация: 13-11-09
Пользователь №: 53 607



Цитата(yuri_t @ Oct 1 2009, 14:24) *
Вышла версии 0.9 TN NET TCP/IP stack.

Добавлен DHCP client.

Просьба ко всем, кто использует (пробует) TN NET TCP/IP stack - присылайте,
пожалуйста, ваши замечания и предложения на yuri@tnkernel.com.


Здравствуйте Юрий. Пытаюсь использовать Ваш TCP/IP stack с TN kernel в одном проекте
и столкнулся с такой проблемой. Есть задача, которая с одной стороны работает с клиентом
на host PC по tcp/ip, а сдругой стороны с двумя очередями. Если задача читает сокет, то она
естественно засыпает при отсутствии сообщений от клиента. Но тогда она может прозевать
сообщение из очереди. Есть ли в Вашей реализации стека что-либо такое (типа select), что
может сообщать о событии появления сообщения через сокет до вызова функции s_recv ?

Сообщение отредактировал sim732 - Mar 28 2010, 19:24
Go to the top of the page
 
+Quote Post
sim732
сообщение Mar 30 2010, 20:02
Сообщение #11





Группа: Участник
Сообщений: 3
Регистрация: 13-11-09
Пользователь №: 53 607



Почитал tn-net-sockets.pdf. Оказывается в Вашей реализации сокет можно перевести
в неблокирующий режим. Не очень хорошее решение моей проблемы (напрасно будет тратится
процессорное время), но все же лучше, чем ничего. Использую предоставленную функцию s_ioctl().
Сокет переводиться в неблокирующий режим не хочет. Смотрю исходные тексты и вижу, что
в функции tcp_s_recv() проверка состояния so->so_state на SS_NBIO вообще отсутствует. Т.е. в этой
версии tcp/ip стека(0.9) перевести открытый сокет в неблокирующее состояние нельзя.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Mar 31 2010, 18:00
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Ф-ция 'select' создавалась для классических аппликаций - где нет multithreading и все происходит
внутри одной ф-ции main(). Для малоформатных RTOS типа TNKernel 'select' "тяжеловат", да и в
общем-то и не нужен (IMHO).

В случае TNKernel/TN NET и использовании TCP sockets, task, в которой производится s_recv(), должна
только принимать по s_recv() и не в коем случае не ждать какие-то другие события, очереди etc.
Другие события, очереди etc. дожны ждать ДРУГИЕ task(s).
Результат приема должен посылаться в ДРУГУЮ task (c помощью tn_queue например).
При этом блокирующий прием работает естественным образом, а неблокирующий прием
не нужен вообще (поэтому он и не реализован).
Код
void task_rx_socket_A_func(void * par)
{

   for(;;)
   {
      rc = s_recv(g_s, (unsigned char*)g_rx_buf, RX_BUF_SIZE, 0);
      if(rc < 0) //-- SOCKET_ERROR
      {
      }
      else if(rc == 0) // closed by peer
      {
      }
      else //-- got some data
      {
          //--processing data, obtained by the s_recv(), or send it to another task
      }
    //-----
   }
}
Go to the top of the page
 
+Quote Post
sim732
сообщение Apr 1 2010, 08:39
Сообщение #13





Группа: Участник
Сообщений: 3
Регистрация: 13-11-09
Пользователь №: 53 607



Цитата(yuri_t @ Mar 31 2010, 21:00) *
В случае TNKernel/TN NET и использовании TCP sockets, task, в которой производится s_recv(), должна
только принимать по s_recv() и не в коем случае не ждать какие-то другие события, очереди etc.
Другие события, очереди etc. дожны ждать ДРУГИЕ task(s).
Результат приема должен посылаться в ДРУГУЮ task (c помощью tn_queue например).
При этом блокирующий прием работает естественным образом, а неблокирующий прием
не нужен вообще (поэтому он и не реализован).


Спасибо Юрий за комментарий. Я так и поступил. Хотя и добавил пару строк в
tn_tcp_send.c для того, чтобы было соответствие с документацией.
Код
      if(m)
         break;
      else
      {
        if(so->so_state & SS_NBIO)
        {
           splx(tnet, sm);
           return -EWOULDBLOCK;
        }
        else
        {
           splx(tnet, sm);
           tn_net_wait(&so->so_rcv.sb_sem);
        }
      }

Спасибо еще раз за Вашу работу. Отличная RTOS и стиль написания очень
ясный.
Go to the top of the page
 
+Quote Post
LightElf
сообщение May 25 2010, 09:27
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



Изучаю сорцы. Возникли несколько вопросов:
1) Можно ли вызывать s_send и s_recv одновременно из разных потоков для одного и того же сокета? То есть один поток ждет прихода данных из сокета, а второй - в сокет пишет.
2) Может в силу лености ума не очень понимаю взаимодействие стека с ethernet контроллером. Нет ли какого-нибудь porting guide или это с моей стороны совсем уж наглость smile.gif?
3) Правильно ли я понимаю, что в порте TNKernel под Coldfire прерывания обрабатываются на стеке текущего процесса?
Go to the top of the page
 
+Quote Post
yuri_t
сообщение May 25 2010, 17:59
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(LightElf @ May 25 2010, 12:27) *
Изучаю сорцы. Возникли несколько вопросов:
1) Можно ли вызывать s_send и s_recv одновременно из разных потоков для одного и того же сокета? То есть один поток ждет прихода данных из сокета, а второй - в сокет пишет.


Можно

Цитата
2) Может в силу лености ума не очень понимаю взаимодействие стека с ethernet контроллером. Нет ли какого-нибудь porting guide или это с моей стороны совсем уж наглость smile.gif?


На какой процессор собрались портировать ?
Go to the top of the page
 
+Quote Post
LightElf
сообщение May 25 2010, 18:23
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



Цитата(yuri_t @ May 25 2010, 21:59) *
Можно


Здоровско!

Цитата(yuri_t @ May 25 2010, 21:59) *
На какой процессор собрались портировать ?


Два процессора - LM3S6965 и MCF52236.
Go to the top of the page
 
+Quote Post
shista
сообщение Jun 4 2010, 20:32
Сообщение #17





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



Во время разработки своего проекта столкнулся со следующей проблемой:
На одном сокете UDP происходит приём запроса через s_recvfrom, а затем отправка ответа через s_sendto. Так вот, после получения запроса данные в полях sin_addr.s__addr и sin_port структуры sockaddr__in указывающей на отправителя запроса содержатся в перевёрнутом виде (в intel формате). Перед отправкой данных порядок байтов данных полей приходится переворачивать.
В для устранения данной ситуации недрах стека в функции udp_s_recvfrom модифицировал код:
Код
//       sin->sin_port         = ntohs(ui->ui_sport);
//       sin->sin_addr.s__addr = ntohl(ui->ui_src.s__addr);
         sin->sin_port         = ui->ui_sport;
         sin->sin_addr.s__addr = ui->ui_src.s__addr;

Всё заработало.

Вопрос: корректна ли данная модификация или необходимо лезть глубже? Или вообще ничего модифицировать не надо, а так и должно быть?
Контроллер lpc2368.

Сильно не пинайте - это мои первые потуги в сетевом программировании, сетевым программированием я раньше не занимался, а на изучение исходного кода к сожалению нет времени.
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 17 2010, 15:19
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Добрый день.
Есть устройство, работающее по TCP с Win хостом.
Проблема в следующем: при активном подключении, если на устройстве сделать аппаратный RESET, оно как и положено в оставшийся открытым с точки зрения Win хоста сокет шлет RST. Но Win при этом продолжает делать посылки\перепослыки не воспринимая RST и не сообщая на верх об ошибке. Это приводит к тому, что реальное отключение приложения от сокета происходит только через минуту, что в моем случае неприемлемо. Есть ли какие нибудь варианты решить эту проблему? На устройстве стек TN_NET. На картинке суть проблемы.
Всем заранее спасибо.

Сообщение отредактировал grinux - Sep 17 2010, 15:23
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 20 2010, 17:07
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Сравнил работу устройства с Wiznet(правое окно), такой проблемы не обнаружил. Отличия только в дополнительном ARP запросе со стороны TN_NET, а также в том, что в пакете от Wiznet ack number отличен от нуля. Пробовал и в TN_NET вставлять ненулевой ack, но безрезультатно. Возможно дело в предварительном ARP запросе, но чтобы это отключить, нужно порядком поковыряться в исходниках.

Сообщение отредактировал grinux - Sep 20 2010, 17:10
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 21 2010, 10:41
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



С Linux ситуация аналогичная, RST не воспринимает.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 21 2010, 12:49
Сообщение #21


Йа моск ;)
******

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



Перенес в топик посты из соседней темы по просьбе топикстартера.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 21 2010, 14:03
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(Rst7 @ Sep 21 2010, 16:49) *
Перенес в топик посты из соседней темы по просьбе топикстартера.


По совету Rst7 выкладываю фалы дампов.
Дампы иллюстрируют следующую последовательность действий: установить телнет сессию, перезагрузить устройство, послать символ с клавиатуры в окно терминала установленной до перезагрузки устрйоства телнет сессии.

Прикрепленные файлы
Прикрепленный файл  rst_dump.zip ( 4.56 килобайт ) Кол-во скачиваний: 25
 
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 21 2010, 14:44
Сообщение #23


Йа моск ;)
******

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



Секундочку, а почему контрольная сумма TCP для пакетов c RST некорректна?

В стеке забыли вызвать считатель контрольной суммы при отсылке пакета с RST?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 21 2010, 15:54
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(Rst7 @ Sep 21 2010, 18:44) *
Секундочку, а почему контрольная сумма TCP для пакетов c RST некорректна?

В стеке забыли вызвать считатель контрольной суммы при отсылке пакета с RST?


Стек не трогал, только экспериментировал с ненулевым ack в пакете с RST.
Проверка КС для TCP была отключена в настройках WS, сейчас включил и увидел это у себя cranky.gif
Сейчас буду смотреть, что там с подсчетом КС.

Ошибка в функции tcp_respond(). Калькуляция КС TCP делалась по всему IP пакету (закомментировано), скопировал правильный вызов из tcp_output(). Все заработало.

Код
   //th->th_sum = in_cksum(m, tlen);
   th->th_sum = in4_cksum(m,
                          IPPROTO_TCP,  //-- to force calc TCP pseudo header
                          sizeof(struct ip),   //-- off; see above
                          m->m_tlen - sizeof(struct ip)); //-- len = TCP header + data


Спасибо Дмитрию.

Сообщение отредактировал grinux - Sep 21 2010, 14:59
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 21 2010, 16:50
Сообщение #25


Йа моск ;)
******

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



QUOTE
Ошибка в функции tcp_respond()


Если это у авторов стека, напишите им гневное письмо с люлЯми багрепорт wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 22 2010, 11:33
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Большое спасибо Григорию, Дмитрию и вообше всем пользователям TN NET
за найденные (и, главное, исправленные) ошибки !!!
К сожалению, мои возможности тестирования (и, следовательно, улучшения) TN NET очень ограничены.
Поэтому большая просьба ко всем пользователям TN NET - пишите, пожалуйста, обо всех проблемах и
найденных багах(в любой форме - через e-mail конференции, на e-mail yuri at tnkernel.com, задавая вопросы в конференции etc.) .
Go to the top of the page
 
+Quote Post
grinux
сообщение Sep 24 2010, 17:12
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Юрий, вы не планируете в ближайшее время расширения функционала TN_NET? Например в части PPP протокола.
Что, на ваш взгляд можно взять как заготовку, как вы взяли BSD стек, для последующей интеграции с TN_NET\TnKernel?
Из открытых исходников я просматривал PPP для lwIP, который сделан на основе pppd из Linux, а также реализацию из Ethernut. Последняя весьма стройна и использует похожую идеологию пулов памяти.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 25 2010, 16:13
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Что бы написать PPP, нужен соответствующий реальный (в смысле не учебно-выдуманный) проект, например,
взаимодействие с каким нибудь wireless модемом. Пока такого проекта у меня не предвидится.
В планах - перенос TN NET на процессоры STM32 и Luminary, но пока, к сожалению, нет на это времени.
Go to the top of the page
 
+Quote Post
_NB
сообщение Sep 27 2010, 13:11
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 92
Регистрация: 22-06-05
Из: Украина, г.Боярка
Пользователь №: 6 238



Цитата(yuri_t @ Sep 22 2010, 14:33) *
Большое спасибо Григорию, Дмитрию и вообше всем пользователям TN NET
за найденные (и, главное, исправленные) ошибки !!!
К сожалению, мои возможности тестирования (и, следовательно, улучшения) TN NET очень ограничены.

Есть небольшое пожелание - обновите, с учетом исправленых ошибок, версию на сайте.
Go to the top of the page
 
+Quote Post
Bender
сообщение Sep 30 2010, 08:56
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(yuri_t @ Sep 22 2010, 15:33) *
... Поэтому большая просьба ко всем пользователям TN NET - пишите, пожалуйста, обо всех проблемах и
найденных багах(в любой форме - через e-mail конференции, на e-mail yuri at tnkernel.com, задавая вопросы в конференции etc.) .


Заметил, что ARP запросы идут со случайным МАС отправителя. Так и должно быть?
Поправить просто:
в функции arp_request() добавить строку

CODE
eh = mtod(mb, struct ether_header *);
ea = (struct ether_arp *)(mb->m_data + sizeof(struct ether_header));

bzero((unsigned char *)ea, sizeof (*ea));
bcopy((unsigned char *)etherbroadcastaddr, (unsigned char *)eh->ether_dhost, MAC_SIZE);
bcopy((unsigned char *)&ni->hw_addr, (unsigned char *)eh->ether_shost, MAC_SIZE); //add


Результат:
Прикрепленное изображение

Go to the top of the page
 
+Quote Post
Bender
сообщение Oct 13 2010, 10:38
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(yuri_t @ Mar 31 2010, 22:00) *
Ф-ция 'select' создавалась для классических аппликаций - где нет multithreading и все происходит
внутри одной ф-ции main(). Для малоформатных RTOS типа TNKernel 'select' "тяжеловат", да и в
общем-то и не нужен (IMHO).

В случае TNKernel/TN NET и использовании TCP sockets, task, в которой производится s_recv(), должна
только принимать по s_recv() и не в коем случае не ждать какие-то другие события, очереди etc.
Другие события, очереди etc. дожны ждать ДРУГИЕ task(s).
Результат приема должен посылаться в ДРУГУЮ task (c помощью tn_queue например).
При этом блокирующий прием работает естественным образом, а неблокирующий прием
не нужен вообще (поэтому он и не реализован).


Мне нужно принимать данные по TCP от нескольких устройств (>10), интервалы посылок разные. Придется создавать задачи по количеству устройств, выделять буфера и стеки под них - некрасиво. ИМХО применив неблокирющий прием можно обойтись одной задачей.
Go to the top of the page
 
+Quote Post
grinux
сообщение Oct 13 2010, 10:55
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(Bender @ Oct 13 2010, 14:38) *
Мне нужно принимать данные по TCP от нескольких устройств (>10), интервалы посылок разные. Придется создавать задачи по количеству устройств, выделять буфера и стеки под них - некрасиво. ИМХО применив неблокирющий прием можно обойтись одной задачей.


Спрашивал у автора на эту тему в прошлом году, т.к. это позволяло в моем случае сэкономить пару задач и соответственно бесценной ОЗУ.
Думаю, не сложно это самостоятельно реализовать.

Сообщение отредактировал grinux - Oct 13 2010, 10:56
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Oct 13 2010, 15:34
Сообщение #33


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Работа с >10 одновременно открытых TCP connections - это, IMHO, в любом случае многовато для CPU с памятью ~32KB unsure.gif
Go to the top of the page
 
+Quote Post
LightElf
сообщение Oct 13 2010, 16:44
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (yuri_t @ Oct 13 2010, 19:34) *
Работа с >10 одновременно открытых TCP connections - это, IMHO, в любом случае многовато для CPU с памятью ~32KB unsure.gif


Хм. А как связано количество одновременных соединений с объемом ОЗУ? Я почему-то думал, что вопрос скорее в объеме данных (и соответственно в размере и количестве буферов). Если изредка (раз в минуту например) передается по 10-20 байт, то почему бы и нет? ИМХО вполне типичная задача для всяческих датчиков и т.п.
Go to the top of the page
 
+Quote Post
Bender
сообщение Oct 13 2010, 18:52
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(LightElf @ Oct 13 2010, 20:44) *
Хм. А как связано количество одновременных соединений с объемом ОЗУ? Я почему-то думал, что вопрос скорее в объеме данных (и соответственно в размере и количестве буферов). Если изредка (раз в минуту например) передается по 10-20 байт, то почему бы и нет? ИМХО вполне типичная задача для всяческих датчиков и т.п.


Да-да, именно так и есть, небольшие порции данных раз за 1-10 секунд
Go to the top of the page
 
+Quote Post
LightElf
сообщение Oct 14 2010, 13:10
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (Bender @ Oct 13 2010, 22:52) *
Да-да, именно так и есть, небольшие порции данных раз за 1-10 секунд

BTW, часто от изучения сорцов разных "мелких" TCP/IP стеков остается ощущение, что стеки оные заточены в первую голову на всякие HTTP и FTP серверы, а не на реальные применения. Типо "бутлодер с поддержкой HTTP PUT для обновления прошивки". Убил бы smile.gif
Даже uIP на что мелкий, и то к делу приспособить не удалось из-за проблем с delayed acknowledge.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Oct 14 2010, 13:50
Сообщение #37


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Каждое ТСР соединение требует приличного (опять-таки, для прс с малым кол-вом ОЗУ) объема ОЗУ для внутренних
нужд.

Если надо принимать/передавать малые объемы данных и не часто, то ТСР не нужен - UDP прекрасно справится.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Oct 14 2010, 14:24
Сообщение #38


embarrassed systems engineer
*****

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



Цитата(yuri_t @ Oct 14 2010, 16:50) *
Каждое ТСР соединение требует приличного (опять-таки, для прс с малым кол-вом ОЗУ) объема ОЗУ для внутренних
нужд.

Порядка 200 байт на саму структуру TCP сокета (по-максимуму - с поддержкой keepalive, адаптивном MTU и селективным ACK) + собственно буфера данных на прием и передачу (от 1 байта каждый) + буфера out-of-order сегментов (на что можно забить) + буфера сборщика фрагментов (при использовании TCP также можно на них забить). ИМХО - вполне скромненько.
Go to the top of the page
 
+Quote Post
grinux
сообщение Oct 14 2010, 15:49
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Подскажите, как использовать новый MAC адрес без полной переинициализации стека?
C IP и прочим разобрался, - закрываю все сокеты, далее net_iface1_set_addresses().
Если там же менять MAC (ni->hw_adr) то ICMP и ARP продолжает работать, а все остальное нет.
Go to the top of the page
 
+Quote Post
Bender
сообщение Oct 14 2010, 18:18
Сообщение #40


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Хорошо, еще такой вопрос - прибор "отвалился" - что делать, ведь выйти по таймауту невозможно? вечное ожидание?

Сообщение отредактировал Bender - Oct 14 2010, 18:18
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Oct 14 2010, 18:42
Сообщение #41


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(grinux @ Oct 14 2010, 18:49) *
Подскажите, как использовать новый MAC адрес без полной переинициализации стека?
C IP и прочим разобрался, - закрываю все сокеты, далее net_iface1_set_addresses().
Если там же менять MAC (ni->hw_adr) то ICMP и ARP продолжает работать, а все остальное нет.


Честно говоря, никогда бы не подумал, что потребуется "на лету" менять MAC... Зачем это Вам нужно ?


Цитата(Bender @ Oct 14 2010, 21:18) *
Хорошо, еще такой вопрос - прибор "отвалился" - что делать, ведь выйти по таймауту невозможно? вечное ожидание?


Я не понял - Вы говорите о TCP соединении?
Go to the top of the page
 
+Quote Post
Bender
сообщение Oct 15 2010, 05:07
Сообщение #42


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(yuri_t @ Oct 14 2010, 22:42) *
Я не понял - Вы говорите о TCP соединении?

да, о нем.
Я конечно пока "чайник", до этого пользовался только UDP.
Но вот что делать в случае, если все задачи уже ждут сообщений, и вот с одним из клиентом теряется связь. Нового клиента, вместо потерянного уже слушать некому.
Так?
Go to the top of the page
 
+Quote Post
DL36
сообщение Oct 15 2010, 06:38
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Очень простая реализация только передачи по UDP, может кому то надо.
Go to the top of the page
 
+Quote Post
grinux
сообщение Oct 15 2010, 07:13
Сообщение #44


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(yuri_t @ Oct 14 2010, 22:42) *
Честно говоря, никогда бы не подумал, что потребуется "на лету" менять MAC... Зачем это Вам нужно ?


Объективной необходимости нет, но меню настройки устройства построено по принципу Apply и отдельно Save. Чтобы можно было откатить неправильно сделанные настройки, сделав Reset.
Это конечно же нетрудно переделать, я же в основном хотел понять для себя, почему недостаточно на горячую заменить MAC адрес в ni->hw_adr и в SA регистрах? Он где то еще прописывается?


Цитата(Bender @ Oct 15 2010, 09:07) *
да, о нем.
Я конечно пока "чайник", до этого пользовался только UDP.
Но вот что делать в случае, если все задачи уже ждут сообщений, и вот с одним из клиентом теряется связь. Нового клиента, вместо потерянного уже слушать некому.
Так?


При потере связи s_recv возвратит ошибку (<0), поток разблокируется и позволит снова сконфигурироваться для повторного установления соединения.

Сообщение отредактировал grinux - Oct 15 2010, 07:14
Go to the top of the page
 
+Quote Post
Bender
сообщение Oct 15 2010, 08:02
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 28-06-05
Из: Тула
Пользователь №: 6 361



Цитата(grinux @ Oct 15 2010, 11:13) *
При потере связи s_recv возвратит ошибку (<0), поток разблокируется и позволит снова сконфигурироваться для повторного установления соединения.

Точно так. только потребовалось установить флаг SO_KEEPALIVE, и s_recv возвращает ошибку (=0)

Сообщение отредактировал Bender - Oct 15 2010, 08:03
Go to the top of the page
 
+Quote Post
LightElf
сообщение Oct 15 2010, 11:17
Сообщение #46


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (yuri_t @ Oct 14 2010, 17:50) *
Каждое ТСР соединение требует приличного (опять-таки, для прс с малым кол-вом ОЗУ) объема ОЗУ для внутренних
нужд.

Как здесь справедливо заметили - не так уж и много нужно. В 32к таких мелких сокетов можно изрядно наплодить.

QUOTE (yuri_t @ Oct 14 2010, 17:50) *
Если надо принимать/передавать малые объемы данных и не часто, то ТСР не нужен - UDP прекрасно справится.

Именно так и думал. Но админы всяких VPN/проксей/файрволлов/и т.д. думают иначе, в результате чего UDP трафик цинично рубят на корню. maniac.gif

Сообщение отредактировал LightElf - Oct 15 2010, 11:18
Go to the top of the page
 
+Quote Post
YAM
сообщение Oct 15 2010, 17:16
Сообщение #47


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



Цитата(LightElf @ Oct 14 2010, 16:10) *
BTW, часто от изучения сорцов разных "мелких" TCP/IP стеков остается ощущение, что стеки оные заточены в первую голову на всякие HTTP и FTP серверы, а не на реальные применения. Типо "бутлодер с поддержкой HTTP PUT для обновления прошивки". Убил бы smile.gif
Даже uIP на что мелкий, и то к делу приспособить не удалось из-за проблем с delayed acknowledge.

А для uIP есть спец. фишка. Для ускорения работы передавать два одинаковых пакета при ненулевом размере данных. Не знаю как у кого , но у меня WEB сервер на этом просто летает по сравнению с обычной передачей (LPC1768 стоит в связке с KSZ8721BL).


--------------------
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Oct 17 2010, 06:01
Сообщение #48


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Чтобы иметь возможность неблокирующего приема в TN NET TCP, достаточно в файле tn_tcp_sockets.c (TN NET v.0.9) добавить после
линии 566 следующее выражение

Код
       if(so->so_state & SS_NBIO) //-- For non-blocking socket - exit
            return -EWOULDBLOCK;


Было:

Код
      if(m)
         break;
      else
      {
         splx(tnet, sm);
         tn_net_wait(&so->so_rcv.sb_sem);
      }


Стало:

Код
     if(m)
         break;
      else
      {
         splx(tnet, sm);

         if(so->so_state & SS_NBIO) //-- For non-blocking socket - exit
            return -EWOULDBLOCK;

         tn_net_wait(&so->so_rcv.sb_sem);
      }


Все другие части TCP(в том числе и tcp_s_send() )
уже готовы для работы в неблокирующем режиме SS_NBIO.
Go to the top of the page
 
+Quote Post
AntonPV
сообщение Nov 16 2010, 15:36
Сообщение #49





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



Прошу прощения,может есть такие,у кого есть опыт использования DP83848 в качестве PHY в TN NET?

Сообщение отредактировал AntonPV - Nov 16 2010, 16:05
Go to the top of the page
 
+Quote Post
Pavel V.
сообщение Dec 27 2010, 02:42
Сообщение #50


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Я попытался портировать стек на процессор LPC1768, но до конца он так и не заработал. Может быть у кого-нибудь был подобный опыт?

Свой проект выложил в соседней ветке: http://electronix.ru/forum/index.php?showtopic=84637

Наверняка мелочь какая-нибудь осталась, но сил больше нет sad.gif


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
prgjz
сообщение Dec 27 2010, 11:26
Сообщение #51


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 3-01-07
Из: Germany
Пользователь №: 24 071



Да, выложил в указанном топике. В tn_net_cfg.h
#define USE_PHY_KS8721 или
#define USE_PHY_DP83848C выбрать.
Go to the top of the page
 
+Quote Post
spf
сообщение Feb 1 2011, 18:47
Сообщение #52


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Ошибочка обнаружена в проверке на multicast, не работали адреса xx.xx.xx.224 - xx.xx.xx.239 (пинг проходит, а соединение не устанавливается)

Код
Index: tn_tcp_input.c
   ===================================================================
   @@ -309,7 +309,7 @@
       th   = (struct tcphdr *)(((unsigned char *)m->m_data) + iphlen);
       tlen = m->m_tlen - iphlen;         //-- TCP header + data
    
   -   if(IN_MULTICAST(ip->ip_dst.s__addr) || in_broadcast(ip->ip_dst, ni))
   +   if(IN_MULTICAST(ntohl(ip->ip_dst.s__addr)) || in_broadcast(ip->ip_dst, ni))
          goto drop;
    
       if(in4_cksum(m, IPPROTO_TCP, iphlen, tlen))
   @@ -492,7 +492,7 @@
             //--  packet with M_BCAST not set.
    
             if(m->m_flags & (M_BCAST|M_MCAST) ||
   -                                    IN_MULTICAST(ip->ip_dst.s__addr))
   +                                    IN_MULTICAST(ntohl(ip->ip_dst.s__addr)))
                goto drop;
    
           //---- Digest of the in_pcbconnect() for tcp_input()
   @@ -1205,7 +1205,7 @@
       //-- Don't bother to respond if destination was broadcast/multicast.
    
       if((tiflags & TH_RST) || m->m_flags & (M_BCAST|M_MCAST) ||
   -                                  IN_MULTICAST(ip->ip_dst.s__addr))
   +                                  IN_MULTICAST(ntohl(ip->ip_dst.s__addr)))
          goto drop;
    
       if(tiflags & TH_ACK)

Прикрепленные файлы
Прикрепленный файл  tn_tcp_input.txt ( 1.23 килобайт ) Кол-во скачиваний: 97
 


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 2 2011, 15:30
Сообщение #53


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(spf @ Feb 1 2011, 22:47) *
Ошибочка обнаружена в проверке на multicast, не работали адреса xx.xx.xx.224 - xx.xx.xx.239 (пинг проходит, а соединение не устанавливается)


Спасибо!
Go to the top of the page
 
+Quote Post
spf
сообщение Feb 3 2011, 04:28
Сообщение #54


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Когда ожидается вариант со всеми доработками?

PS:
При наличии системы ведения версий было бы крайне просто актуализировать доработки.
Можно было бы вообще обойтись без архивов релизов.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 30 2013, 14:17
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(spf @ Feb 3 2011, 08:28) *
Когда ожидается вариант со всеми доработками?


Кстати, какие замечены косяки ?
я нашел только про
tcp_respond CRC

Сам же я напоролся на следующий косяк, в функции arp_request не инициализируется MAC отправителя
нужно после bcopy((unsigned char *)etherbroadcastaddr, (unsigned char *)eh->ether_dhost, MAC_SIZE);
добавить
bcopy((unsigned char *)ni->hw_addr, (unsigned char *)eh->ether_shost, MAC_SIZE);

ну и еще мелочь:автор задал такой вид конфигурирования #define TN_DHCP 1 подразумевая что выключатся будет через #define TN_DHCP 0 то в местах применения писать не #ifdef TN_DHCP а #if TN_DHCP == 1


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 31 2013, 03:25
Сообщение #56


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(megajohn @ Jul 30 2013, 18:17) *
Сам же я напоролся на следующий косяк, в функции arp_request не инициализируется MAC отправителя


Оказывается, об этом было известно еще три года назад, и напоролся на это Bender.
Извиняюсь на непреднамеренный плагиат, то вчера весь день убил на поиск этой траблы
Я то думал, что скачивал самую последнюю версию с сайта с фиксами. А оказалось что казалось.


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
megajohn
сообщение Aug 6 2013, 15:32
Сообщение #57


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(yuri_t @ Sep 22 2010, 15:33) *
Поэтому большая просьба ко всем пользователям TN NET - пишите, пожалуйста, обо всех проблемах и
найденных багах(в любой форме - через e-mail конференции, на e-mail yuri at tnkernel.com, задавая вопросы в конференции etc.) .


№1
IAR ARM 6.6 ругается на невыровненное обращение Warning[Pa039]: use of address of unaligned structure member I:\projects\_lib\protocol\ip\tn_net\in4_cksum.c 123
u.ipov.ih_src = mtod(m, struct ip *)->ip_src;
u.ipov.ih_dst = mtod(m, struct ip *)->ip_dst;

№2
в функции udp_s_recvfrom не особо нравится поведение, если пришло данных больше чем запрашивалось.
к примеру нужно только 16 байт, а пришло 128. Записать только 16 и вернуть результат 16. ( по крайней мере в NDK для TI SYS/BIOS вроде так )

№3
udp_s_sendto блокирующая отправка работает если только нет пулов памяти. А пулов больше чем передающих дескрипторов, а в очередь передачи отправка размещается с полингом. а не блокировкой.
Получается что задача которая все время отправялет UDP не дает процессорного времени всем более низкоприоритетным задачам. А лучше бы на момент отправки и реальной передачи блокировалась задача. Вроде так


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

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

 


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


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