pvvx
Активный участник сообщества
Где и когда?Тут заметил, что lwip перестает принимать пакеты, если очередь mbox была переполнена.
Где и когда?Тут заметил, что lwip перестает принимать пакеты, если очередь mbox была переполнена.
да везде и в любое время вот пример, вешаем колбек на прием udp, делаем специально задержку:Где и когда?
static void lwip_udp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
printf("udp received: %s\n", p->payload);
pbuf_free(p);
vTaskDelay(10000);
}
А зачем вы полезли (застопорили) единственный тред LwIP, не запустив ему другой? Ваша ошибка, а не системы. Алгоритмическая.да везде и в любое время вот пример, вешаем колбек на прием udp, делаем специально задержку:
далее забрасываем udp пакетами, и при переполнении очереди, сама очередь в tcpip thread опустошается, но потом не пополняется. При этом странно, что TCP disconnect пакет как-то пролез.Код:static void lwip_udp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { printf("udp received: %s\n", p->payload); pbuf_free(p); vTaskDelay(10000); }
Все верно так и сделал. Все колбеки вешаются на этот тред и потому его блокируют, а вот повалить девайс довольно легко получается. Второй тред по сути и ненужен, достаточно просто затирать очередь новыми пакетами.А зачем вы полезли (застопорили) единственный тред LwIP, не запустив ему другой? Ваша ошибка, а не системы. Алгоритмическая.
Дисконнект сработал по софт-таймеру опроса psb - это другой процесс в RTOS.
И где mbox?
Проще вставить какую невалидную команду процу, чтобы он улетел на "протектед". Примерно про это вы пишите?Все верно так и сделал. Все колбеки вешаются на этот тред и потому его блокируют, а вот повалить девайс довольно легко получается.
Меня удовлетворит потеря части пакетов, т.е. затереть в очереди старые пакеты новыми (ну да, плохо, а куда деваться?), чем вывод из строя tcp/ip стека. Понятно, что все колбеки нужно стараться делать максимально быстрыми и вероятность переполнения очереди близка к нулю, но при желании атаковать устройство довольно легко.В RTOS нема нормального распределителя “отложенных функций” ( или “стека функций”, или "стека событий").
Не думаю, что какая атака поможет. Пишите правильно и всё будет Ok. Проверка показывает, что происходит просто потеря пакетов, а чип в состоянии принять и обработать весь поток в от PHY с HT40. Когда забивается память буферов у LwIP, то он просто скипает пакеты, а при передаче их скипает драйвер WiFi с оповещением - "выкинул столько-то за время n-секунд" если не успевает передать (уложиться в арбитраж внешней AP).Меня удовлетворит потеря части пакетов, т.е. затереть в очереди старые пакеты новыми (ну да, плохо, а куда деваться?), чем вывод из строя tcp/ip стека. Понятно, что все колбеки нужно стараться делать максимально быстрыми и вероятность переполнения очереди близка к нулю, но при желании атаковать устройство довольно легко.
видимо вы успеваете разгрести пакеты из очереди вот буквально только что забил очередь, и новые пакеты ни в какую.Даже в rtlDuino описываемых проблем нет
Ещё раз - вы ставили обработку в нутро, считайте что в прерывание драйвера, тем самым разрушили вообще всю систему, а после этого что-то хотите от неё. Сами запретили работу всему LwIP и хотите чтобы он дальше что-то принимал или вообще что-то делалвидимо вы успеваете разгрести пакеты из очереди вот буквально только что забил очередь, и новые пакеты ни в какую.
Проще вставить какую невалидную команду процу, чтобы он улетел на "протектед". Примерно про это вы пишите?
А вот и нет я блокирую TCPIP таск, а прерывание периферии лишь наполняет очередь, его я не блокируюЕщё раз - вы ставили обработку в нутро, считайте что в прерывание драйвера
Ну и глупость - блокируете LwIP и говорите что он не работает. Не бред ли?А вот и нет я блокирую TCPIP таск, а прерывание периферии лишь наполняет очередь, его я не блокирую
#include <WiFi.h>
#include <WiFiUdp.h>
#include <stdio.h>
char ssid[] = "mynetwork"; // your network SSID (name)
char pass[] = "mypassword"; // your network password
unsigned int localPort = 5001; // local port to listen for UDP packets
WiFiUDP Udp;
void setup() {
while (WiFi.begin(ssid, pass) != WL_CONNECTED) delay(100);
Serial.println("Connected to wifi");
Udp.begin(localPort);
}
int timeout = 1000;
char buf[256];
void loop() {
while (1) {
memset(buf, 0, sizeof(buf));
int n = Udp.read(buf, sizeof(buf));
if ( n <= 0 ) timeout++;
else timeout--;
if (timeout > 3000) timeout = 3000; // assume that the udp timeout is no more than 3s
else if (timeout < 1) timeout = 1;
printf("\r%d ", timeout); // Serial.println(timeout);
Udp.setRecvTimeout(timeout);
}
}
Никакая пауза в выполнении задачи lwip не должна приводить к его неработоспособности. Хоть 10 сек хоть 20. И не слушайте pvvx. Кадры могут теряться, сокеты могут закрываться по таймауту, но после возобновления работы задачи - работоспособность стека должна восстановиться.А вот и нет я блокирую TCPIP таск, а прерывание периферии лишь наполняет очередь, его я не блокирую
Если заблокировать тред LWIP вызывающий udp recv_cb(), то он вызовет другие калбеки, как только будет разблокирован тред. Для этого есть очередь mbox. RTL00MP3/tcpip.c at master · pvvx/RTL00MP3 · GitHubон не врубается, что если заблокировать тред LwIP вызывающий udp recv_cb(), то он не вызовет других калбаков.
И что??? Сейчас не вызовет - потом после окончания паузы - вызовет.Не слушайте rst – он не врубается, что если заблокировать тред LwIP вызывающий udp recv_cb(), то он не вызовет других калбаков.
Вот именно. Или по-крайней мере так должно быть. Если не так - где-то в реализации или портировании баг, который надо искать.он вызовет другие калбеки, как только будет разблокирован тред.
rst описал то, что я говорил. Он наверно не спал и всё перепутал.Если заблокировать тред LWIP вызывающий udp recv_cb(), то он вызовет другие калбеки, как только будет разблокирован тред. Для этого есть очередь mbox. RTL00MP3/tcpip.c at master · pvvx/RTL00MP3 · GitHub
Согласен с @rst
А у нас уровень только до "обучения", а ублажение и прочие акции для увеличения популяции "общества потребления" (ардуинщиков) не рассматриваются. Обратитесь в "сферу услуг" - писателей для Ардуино. Там несложно поправить код - выкидывать куски...Вот если по честному - народу нужен не пример, но готовое решение.
Если без жлобства - добавили бы веб мордочку то простецкую, а вывод в spi - по умолчанию (без опций - всегда включен, благо ножки свободные), глядишь и кому еще кроме Вас и пары тройки "продвинутых" и сгодится - идея то хорошая, нужная.
Поясните пожалуйста всем, как так у вас vTaskDelay(10000) блокирует xQueue?Очередь там и остановится от вашей вставки, блокирующей исполнение треда.
Странный г-н pvvx Я лишь написал что при переполнении очереди пакетов lwip падает, а он пытается уверовать что при блокировке колбака я блокирую интеррапт, ломаю систему, не пускаю новые пакеты, блокирую очередь.Вот именно. Или по-крайней мере так должно быть. Если не так - где-то в реализации или портировании баг, который надо искать.
pvvx видимо привык костылить код, вот у него из-за любого чиха какие-то костыли и начинают падать и он считает это нормальным