mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-19 13:32:21 +02:00
fix(modem): Fix netif data race causing PPP startup delays
Removes PPP_started signal on reception, since lwip handles data reception if the netif is up/down (which we correctly set in start() stop() methods) Closes https://github.com/espressif/esp-protocols/issues/308
This commit is contained in:
@ -54,9 +54,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
private:
|
|
||||||
void receive(uint8_t *data, size_t len);
|
void receive(uint8_t *data, size_t len);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
static esp_err_t esp_modem_dte_transmit(void *h, void *buffer, size_t len);
|
static esp_err_t esp_modem_dte_transmit(void *h, void *buffer, size_t len);
|
||||||
|
|
||||||
static esp_err_t esp_modem_post_attach(esp_netif_t *esp_netif, void *args);
|
static esp_err_t esp_modem_post_attach(esp_netif_t *esp_netif, void *args);
|
||||||
|
@ -21,10 +21,17 @@ static bool exit_data(DTE &dte, ModuleIf &device, Netif &netif)
|
|||||||
netif.stop();
|
netif.stop();
|
||||||
auto signal = std::make_shared<SignalGroup>();
|
auto signal = std::make_shared<SignalGroup>();
|
||||||
std::weak_ptr<SignalGroup> weak_signal = signal;
|
std::weak_ptr<SignalGroup> weak_signal = signal;
|
||||||
dte.set_read_cb([weak_signal](uint8_t *data, size_t len) -> bool {
|
dte.set_read_cb([&netif, weak_signal](uint8_t *data, size_t len) -> bool {
|
||||||
|
// post the transitioning data to the network layers if it contains PPP SOF marker
|
||||||
|
if (memchr(data, 0x7E, len))
|
||||||
|
{
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data (PPP)", data, len, ESP_LOG_DEBUG);
|
||||||
|
netif.receive(data, len);
|
||||||
|
}
|
||||||
|
// treat the transitioning data as a textual message if it contains a newline char
|
||||||
if (memchr(data, '\n', len))
|
if (memchr(data, '\n', len))
|
||||||
{
|
{
|
||||||
ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data", data, len, ESP_LOG_DEBUG);
|
ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data (CMD)", data, len, ESP_LOG_DEBUG);
|
||||||
const auto pass = std::list<std::string_view>({"NO CARRIER", "DISCONNECTED"});
|
const auto pass = std::list<std::string_view>({"NO CARRIER", "DISCONNECTED"});
|
||||||
std::string_view response((char *) data, len);
|
std::string_view response((char *) data, len);
|
||||||
for (auto &it : pass)
|
for (auto &it : pass)
|
||||||
|
@ -65,9 +65,7 @@ esp_err_t Netif::esp_modem_post_attach(esp_netif_t *esp_netif, void *args)
|
|||||||
|
|
||||||
void Netif::receive(uint8_t *data, size_t len)
|
void Netif::receive(uint8_t *data, size_t len)
|
||||||
{
|
{
|
||||||
if (signal.is_any(PPP_STARTED)) {
|
|
||||||
esp_netif_receive(driver.base.netif, data, len, nullptr);
|
esp_netif_receive(driver.base.netif, data, len, nullptr);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Netif::Netif(std::shared_ptr<DTE> e, esp_netif_t *ppp_netif) :
|
Netif::Netif(std::shared_ptr<DTE> e, esp_netif_t *ppp_netif) :
|
||||||
@ -89,8 +87,8 @@ void Netif::start()
|
|||||||
receive(data, len);
|
receive(data, len);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
esp_netif_action_start(driver.base.netif, nullptr, 0, nullptr);
|
|
||||||
signal.set(PPP_STARTED);
|
signal.set(PPP_STARTED);
|
||||||
|
esp_netif_action_start(driver.base.netif, nullptr, 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Netif::stop()
|
void Netif::stop()
|
||||||
|
Reference in New Issue
Block a user