|
IP/UDP/TFTP uIP v1.0, uIP-шники отзовитесь. |
|
|
|
Aug 10 2007, 11:31
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Недавно поднял uIP 1.0 для своей платы с LPC2364. Реализовал на ней web сервер, потом - telnet. Документация потрясающая, все понятно. Но это все были стеки IP/TCP/, моя же техническая задача состоит в реализации IP/UDP/TFTP(modbus). Если кто имеет исходнички на UDP и TFTP, плиз, ПОДЕЛИТЕСЬ. А если кто-то, вообще, уже делал такую связку, то я буду несказанно рад взять и воспользоваться вашими плодами работы безо всяких угрызений совести blush.gif. Попутно спрошу. 1. Я так понимаю, что в uIP есть возможность подключения нескольких соединений равно как и несколько портов, но последнее не означает, что в uIP можно врубить два сервака сразу, например, web сервер и telnet, поскольку существует только одно определение app_call, которое вызывается обработчиком событий TCP. Правильно я понимаю? 2. Могут ли одновременно работать TCP и UDP в uIP?
Спасибо за внимание.
|
|
|
|
|
Aug 12 2007, 11:09
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483

|
1. Не правильно понимаешь. Есть еще uip_app_registration.[c|h]. 2. Why not?
P.S. Интересует скорость... у нас с uIP - полная #опа. Пинги быстрые, но TCP тормозит страшно (скорость ~10-15 Мбит).
|
|
|
|
|
Aug 13 2007, 08:05
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(Цырен @ Aug 10 2007, 14:31)  1. Я так понимаю, что в uIP есть возможность подключения нескольких соединений равно как и несколько портов, но последнее не означает, что в uIP можно врубить два сервака сразу, например, web сервер и telnet, поскольку существует только одно определение app_call, которое вызывается обработчиком событий TCP. Правильно я понимаю? Недокурили доку  Где то в доке есть пример как запускать два сервака вместе. У меня именно web сервер и telnet работали вместе. По памяти проверяешь порт и запускаешь нужное апп
|
|
|
|
|
Aug 13 2007, 08:15
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Цитата(ig_z @ Aug 13 2007, 12:05)  Недокурили доку  Где то в доке есть пример как запускать два сервака вместе. У меня именно web сервер и telnet работали вместе. По памяти проверяешь порт и запускаешь нужное апп Я полазил по зарубежным форумам и нашел следующую подсказку от автора uIP: You can use a union, something like this: typedef union { struct app1_state a1; struct app2_state a2; struct app3_state a3; } uip_tcp_appstate_t; and access the state structures through appstate->a1.var1; and so forth. This way no extra memory is required. Hope this helps, /adam Marc Lehmann wrote: Hello everyone out there I'm trying to build an application that has several features using uIP. Each of that features has its own structure to store the application state. And that's where the problems start. Of course it's not possible to typedef more than one structure to be uip_tcp_appstate_t. I tried the add-on module uip_app_registration, but it doesn't take care of uip_tcp_state. Any ideas? Is there any workaround? Of couse I could put all the application states together into one huge structure, but I'd rather prefer a "smart" solution.  Thanks Marc -- Adam Dunkels, Swedish Institute of Computer Science Буду следовать совету автора. 2 e-yes Я нашел указанные файлы на старой версии сайта uIP 2 ig_z Вы делали также? Если нет, то можно подробнее?
Сообщение отредактировал Цырен - Aug 13 2007, 08:38
|
|
|
|
|
Aug 13 2007, 15:07
|
Участник

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483

|
>Я нашел указанные файлы на старой версии сайта uIP Ну у меня они на локальном диске, уже не помню где брал  Но и без них подобную функциональность реализовать - не вопрос  Так что насчет скорости у uIP?
|
|
|
|
|
Aug 14 2007, 06:38
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Цитата(e-yes @ Aug 13 2007, 19:07)  > Так что насчет скорости у uIP? Знаешь, в моей задаче скорость - не критичный параметр, поэтому я не интересовался, но скажу, что скорость в 10-15Мбит - это уже не плохо.
|
|
|
|
|
Aug 14 2007, 08:29
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(Цырен @ Aug 13 2007, 11:15)  2 ig_z Вы делали также? Если нет, то можно подробнее? Я делал по другому, как советовал автор. Я не помню названия пдфки (я несколько пдф склеил для печати книжкой), но в ней есть раздел "6.3 Di®erentiating between applications". Все идеи оттуда. Ключевые моменты привожу ниже. Из Main Код int main(void) { uip_init(); app_init();
uip_kos_input.RunDly(0); uip_kos_output.RunDly(0); uip_kos_arp.RunDly(0); OS.Start(); } Из App Код void app_init() { ... telnetd_init(); http_uart_bridge_init(); }
void application() { switch (uip_conn->lport) { case HTONS(IP_UART_PORT): http_uart_bridge_appcall(); break;
case HTONS(TELNET_PORT): telnetd_appcall(); break; default: /* Should never happen. */ uip_abort(); break; } } http_uart_bridge_appcall() и telnetd_appcall() - приложения верхнего уровня. В данном случае 2 сервера: мост уарт-тцпип и телнет. А начиналось с серверов нттп и телнет.
|
|
|
|
|
Aug 16 2007, 11:26
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Я сделал так, чтобы на uIP работали сразу два сервака!!! В моем случае - telnet и web А сделал я вот что: 1. Создал файлики multiapplication.h: #ifndef __MULTIAPPLICATION_H__ #define __MULTIAPPLICATION_H__ #include "webserver.h" #include "telnetd.h" extern void application(void); typedef union { struct telnetd_state uip_tcp_telnet; struct httpd_state uip_tcp_http; } uip_tcp_appstate_t; #endif /*__MULTIAPPLICATION_H__*/ , multiapplication.c: #include "uip.h" #include "webserver.h" #include "telnetd.h" #include "multiapplication.h" void application(void) { switch (uip_conn->lport) { case HTONS(80): httpd_appcall(); break; case HTONS(23): telnetd_appcall(); break; default: /* Should never happen. */ uip_abort(); break; } } 2. Закоментил typedef-нги в telnetd.h и webserver.h соответственно //typedef struct telnetd_state uip_tcp_appstate_t; //typedef struct httpd_state uip_tcp_appstate_t; 3. Определил UIP_APPCALL как (старые определения удалил) #ifndef UIP_APPCALL #define UIP_APPCALL application #endif 4. Инклудил multiapplication.h в uIP.c Таким образом, можно вставлять в uIP серваки по различным портам скока хочешь(в пределах имеющихся на свете с учетом размера памяти в МК  Но, вот такая байда, что-то я отошел от прямой задачи - портировать TFTP поверх IP/UDP. Если кто что может полезное кинуть, сказать - прошу, я буду рад.
Сообщение отредактировал Цырен - Aug 16 2007, 11:37
|
|
|
|
|
Aug 19 2007, 21:37
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Я почти близок к своей заветной цели. Я вот думаю как организовать тайм-аут. Ведь у каждого нового подключения есть своя история (был ли подтвержден последний блок, сколько было попыток ретрансляции и еще что-нибудь). Помоему одной глобальной переменной не обойтись, как вы считаете, те, кто разбирался в TFTP? Кстати пришлось много где поискать инфу по протоколу. RFC1350 (ftp://ftp.rfc-editor.org/in-notes/rfc1350.txt) - похоже единственный источник, давший полное представление о протоколе. Но по началу очень помогла ссылка http://andr.ru/lib/comp/net/tcpip/tcpip_il...ated/tcp15.html - очень доступным языком. Да и вообще на этом сайте есть все про протоколы. Мысли вслух: 1. Интересно получается, для того, чтобы TFTP заработал надо инициализировать его, создав в таблице UDP-соединений соединение с параметрами ripaddr=0.0.0.0, rport=0 и lport=69 (ну там еще ttl есть, не понятно для чего он там для TFTP). TFTP постоянно прослушивает 69-й порт и когда появляется UDP-сообщение на наш IP и порт 69 (это запрос на чтение или запись: opcode=1или2), сервер должен создать в таблице UDP-соединений новое соединение по случайному номеру локального порта lport. В этой новой записи сохраняются даные об IP-адресе и номере порта удаленного хоста(ripaddr=x, rport=y), вытащенные из UDP-пакета. И сразуже происходит обработка пришедших данных, с последующим ответом (подтверждение на запись или посылка первого блока запрошенных данных). Т.о. в таблице UDP-соединений появляются две записи, одна - для ублажения нужд подключившегося клиента, вторая - для рецепшена возможных новых соединений. А о состоянии соединения будут отражать какие-нибудь глобальные переменные. Если так, то получается для каждого соединения нет индивидуальных данных о том, было ли подтверждение на прошлый блок или, например, сколько времени прошло с момента посылки последнего блока. А если соединений три, допустим, и в одном из них произошел разрыв. Что же, теперь все остальные соединения канут в лету? Как же быть? Создать структуру(struct) в которой будут все параметры состояния соединения и построить массив такого типа размером равным размеру массива UDP-соединений, чтобы потом ассоциировать каждый элемент такого массива состояний с соответствующим соединением? 2. TFTP должно само позаботиться о том как поправить UDP-заголовок. А точнее задать IP-адрес получателя, наш IP-адрес, порт получателя, наш порт в пакете сообщения и длину UDP-пакета с заголовком. А надо ли длину?
Сообщение отредактировал Цырен - Aug 19 2007, 21:41
|
|
|
|
|
Aug 19 2007, 21:54
|

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

|
Цитата(Цырен @ Aug 20 2007, 00:37)  RFC1350 (ftp://ftp.rfc-editor.org/in-notes/rfc1350.txt) - похоже единственный источник, давший полное представление о протоколе. Полное? А эти забыли еще почитать RFC 1785, ,RFC 2090, RFC 2347, RFC 2348, RFC 2349, если будете работать с продвинутыми клиентами.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 20 2007, 09:47
|

Частый гость
 
Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714

|
Цитата(zltigo @ Aug 20 2007, 01:54)  Полное? А эти забыли еще почитать RFC 1785, ,RFC 2090, RFC 2347, RFC 2348, RFC 2349, если будете работать с продвинутыми клиентами. Это уже бег с препятствиями. А мне бы пока первые шаги освоить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|