This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Racing issue while downloading firmware using CoAP DFU

Hi,

There is a racing issue in file:
nRF5_SDK_for_Thread_and_Zigbee/components/iot/background_dfu/transport/coap/coap_dfu.c
in function:

static void coap_dfu_delayed_message_send(coap_message_t * p_message)
{
    if (!m_coap_dfu_ctx.timer_active)
    {
        uint8_t delay = (background_dfu_random() % DEFAULT_DELAY_MAX_MS) + 1;

        app_timer_start(m_send_timer, APP_TIMER_TICKS(delay), p_message);
        m_coap_dfu_ctx.timer_active = true;
    }
    else
    {
        // Drop the message in case another message is pending for transmission.
        coap_message_delete(p_message);
    }
}


Sometimes calculated dalay is 1 which causes that timer's callback:

static void delayed_send_handler(void * p_context)
{
    coap_dfu_message_send((coap_message_t *)p_context);

    m_coap_dfu_ctx.timer_active = false;
}

is called before execution of following line in coap_dfu_delayed_message_send() function:
m_coap_dfu_ctx.timer_active = true;

The issue does not appear after moving this line up before line:
app_timer_start(m_send_timer, APP_TIMER_TICKS(delay), p_message);

So the working code is:

static void coap_dfu_delayed_message_send(coap_message_t * p_message)
{
    if (!m_coap_dfu_ctx.timer_active)
    {
        uint8_t delay = (background_dfu_random() % DEFAULT_DELAY_MAX_MS) + 1;

        m_coap_dfu_ctx.timer_active = true;
        app_timer_start(m_send_timer, APP_TIMER_TICKS(delay), p_message);
    }
    else
    {
        // Drop the message in case another message is pending for transmission.
        coap_message_delete(p_message);
    }
}

Can you please fix it in next SDK version?

Kind regards,
Krzysztof

Related