Ruslan1 16 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Здравствуйте! В одной задаче не хватило установки MEMP_NUM_TCP_PCB = 15, пришлось поставить 20. А сколько нужно и как понять кто их захватил? Только отладчиком и руками? или есть какие-то средства в LwIP? Задачи у меня сейчас крутятся следующие: 1) FTP клиент, перекачивает кучу файлов (сейчас на один ftp) и туда и оттуда. 2) smtp клиент, пишет письма (на несколько ящиков) Ну, есть еще и UDP-шные линки, но я так понимаю, в LwIP это четко разнесено, на каждый тип своя область блоков выделена в памяти Так вот как-то внезапно кончился диван не хватило 15 выделенных блоков на эти задачи, я как-то даже растерялся. Это как-то в LwIP подается контролю, какая задача заняла TCP блок памяти? И как-то можно во время работы контролировать, сколько блоков свободно? Надеюсь, что в LwIP есть какие-то средства для этого. Вполне может быть, что и просто утечка где-то, старые соединения не закрываются корректно. Но вот увеличил с 15 до 20 и все стабильно работает уже пару часов, еще бы понять кто же столько берет и зачем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 64 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Вполне может быть, что и просто утечка где-то, старые соединения не закрываются корректно. Но вот увеличил с 15 до 20 и все стабильно работает уже пару часов, еще бы понять кто же столько берет и зачем. Если сети больше 2-х клиентов(контроллер и компьютер), то может другой компьютер(вирус?) попытаться создать коннект и LwIP его исправно создаст. А вообще надо смотреть с помощью Wireshark или tcpdump кто присылает коннект и закрывается ли он корректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Если сети больше 2-х клиентов(контроллер и компьютер), то может другой компьютер(вирус?) попытаться создать коннект и LwIP его исправно создаст. А вообще надо смотреть с помощью Wireshark или tcpdump кто присылает коннект и закрывается ли он корректно. Извините, я не указал в условиях- это соединение через GPRS/3G модем. Посчитал несущественным, но в свете Вашей гипотезы это может быть очень важным дополнением к моему описанию проблемы. Спасибо за идею, "больше двух клиентов" вполне возможно. Не запланированных мной а "паразитов". Про "других гостей" я даже не подумал, отличная идея, я же на GSM это сейчас не контролирую. Кстати, иногда на объектах вижу в логах, как кто-то стучится в telnet порт (через GSM), но полного логгирования по другим портам не веду, может и там непрошенные гости забегают. Прямо сейчас не представляю как, но наверняка есть какие-то настройки в LwIP, позволяющие это ограничить. Я подозреваю, что это переменная MEMP_NUM_TCP_PCB_LISTEN, так у меня она равна 6. Попробую повторить проблему на кабеле и с Wireshark. Прибор умеет и через модем и по LAN, но обнаружил проблему именно при работе через модем (штатно так и используем в большинстве применений). Кабель не пробовал, думал то же самое увижу. Upd: ниже добавил часть моего файла конфигурации LwIP (1.4.1), может что-то еще просто несимметрично настроено и поэтому проблема? #define SYS_LIGHTWEIGHT_PROT 1 #define ETHARP_TRUST_IP_MAC 0 #define IP_REASSEMBLY 0 #define IP_FRAG 0 #define ARP_QUEUEING 0 /** * NO_SYS==1: Provides VERY minimal functionality. Otherwise, * use lwIP facilities. */ #define NO_SYS 0 /* ---------- Memory options ---------- */ /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 byte alignment -> define MEM_ALIGNMENT to 2. */ #define MEM_ALIGNMENT 4 /* MEM_SIZE: the size of the heap memory. If the application will send a lot of data that needs to be copied, this should be set high. */ #define MEM_SIZE (30*1024) //(10*1024) /* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application sends a lot of data out of ROM (or other static memory), this should be set high. */ #define MEMP_NUM_PBUF 10 /* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One per active UDP "connection". */ #define MEMP_NUM_UDP_PCB 10 /* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. */ #define MEMP_NUM_TCP_PCB 25 //changed 20161209 to "25" for reserve ("20" was also working) "//changed 20161208 from not working "15" to working "20" //20140205: 10 /* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. */ #define MEMP_NUM_TCP_PCB_LISTEN 6 //20140205: 5 /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. */ #define MEMP_NUM_TCP_SEG 65 //20140205: 20 /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. */ #define MEMP_NUM_SYS_TIMEOUT 10 #define MEMP_NUM_PPP_PCB 1 #define MEMP_NUM_NETCONN 25 /* ---------- Pbuf options ---------- */ /* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #define PBUF_POOL_SIZE 25 /* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) /* ---------- TCP options ---------- */ #define LWIP_TCP 1 #define TCP_TTL 255 /* Controls if TCP should queue segments that arrive out of order. Define to 0 if your device is low on memory. */ #define TCP_QUEUE_OOSEQ 1 /* TCP Maximum segment size. */ #define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */ /* TCP sender buffer space (bytes). */ #define TCP_SND_BUF (8*TCP_MSS) //20140205: (5*TCP_MSS) /* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */ #define TCP_SND_QUEUELEN (8* TCP_SND_BUF/TCP_MSS) //20140205: (4* TCP_SND_BUF/TCP_MSS) /* TCP receive window. */ #define TCP_WND (4*TCP_MSS) //20140205: (2*TCP_MSS) /* ---------- ICMP options ---------- */ #define LWIP_ICMP 1 //#define LWIP_IGMP 1 /* ---------- DHCP options ---------- */ /* Define LWIP_DHCP to 1 if you want DHCP configuration of interfaces. DHCP is not implemented in lwIP 0.5.1, however, so turning this on does currently not work. */ #define LWIP_DHCP 1 /* ---------- UDP options ---------- */ #define LWIP_UDP 1 #define UDP_TTL 255 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 64 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Кстати, иногда на объектах вижу в логах, как кто-то стучится в telnet порт (через GSM), но полного логгирования по другим портам не веду, может и там непрошенные гости забегают. Угу, они могут открыть соединение, что-нибудь прислать, а потом не послать FIN и висит это соединение, пока таймаут не кончится, вот здесь четко продемонстрировано. Но какой параметр LwIP за таймаут отвечает - не помню... Если ваш прибор коннектится с удаленным компьютером, то наверное еще можно написать какой-нибудь ограничитель типа firewall - на приеме пакетов, когда идет разбор TCP, рубить левых по ip-адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Угу, они могут открыть соединение, что-нибудь прислать, а потом не послать FIN и висит это соединение, пока таймаут не кончится, вот здесь четко продемонстрировано. Но какой параметр LwIP за таймаут отвечает - не помню... Если ваш прибор коннектится с удаленным компьютером, то наверное еще можно написать какой-нибудь ограничитель типа firewall - на приеме пакетов, когда идет разбор TCP, рубить левых по ip-адресу. Большое спасибо! познавательно, буду копать и думать. Так как если внешние причины- то забивание всех коннектов только вопрос времени, тут количеством не решается. А еще сложилось впечатление что в LwIP нет функции, которая ответит количество еще свободных коннектов, нужно свое писать. Хотя у меня версия старая(LwIP 1.4.1), может новая и имеет что-нибудь для этого. Там есть хорошая идея в механизме выделения блока- если нет свободных, то пытается освободить самый старый с приоритетом меньше затребованного. Но вот что-то я не вижу как снаружи приоритеты выставлять, tcp_new() вообще не содержит аргумента приоритет, просто внутри нее жестко забито "tcp_alloc(TCP_PRIO_NORMAL)" и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Таким макаром на какой-нибудь СТМ32 скоро антивирус ставить придется с файрволом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 64 10 декабря, 2016 Опубликовано 10 декабря, 2016 · Жалоба А еще сложилось впечатление что в LwIP нет функции, которая ответит количество еще свободных коннектов, нужно свое писать. Сделать простой поиск по исходникам на сравнение с MEMP_NUM_TCP_PCB и получите переменную отвечающую за текущее количество соединений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться