drivers/wireless/ieee802154/xbee: Cancel query timeout upon receiving the expected response. Add protection for race condition that can cause association timeout to continue firing repeatedly
This commit is contained in:
parent
bc60397e48
commit
3529be7d9b
@ -637,6 +637,7 @@ static void xbee_process_apiframes(FAR struct xbee_priv_s *priv,
|
|||||||
frame->io_data[frame->io_offset] != 0x13)
|
frame->io_data[frame->io_offset] != 0x13)
|
||||||
{
|
{
|
||||||
wd_cancel(priv->assocwd);
|
wd_cancel(priv->assocwd);
|
||||||
|
priv->associating = false;
|
||||||
|
|
||||||
primitive = ieee802154_primitive_allocate();
|
primitive = ieee802154_primitive_allocate();
|
||||||
primitive->type = IEEE802154_PRIMITIVE_CONF_ASSOC;
|
primitive->type = IEEE802154_PRIMITIVE_CONF_ASSOC;
|
||||||
@ -724,6 +725,7 @@ static void xbee_process_apiframes(FAR struct xbee_priv_s *priv,
|
|||||||
if ((priv->querycmd[0] == *command) &&
|
if ((priv->querycmd[0] == *command) &&
|
||||||
(priv->querycmd[1] == *(command + 1)))
|
(priv->querycmd[1] == *(command + 1)))
|
||||||
{
|
{
|
||||||
|
wd_cancel(priv->atquery_wd);
|
||||||
priv->querydone = true;
|
priv->querydone = true;
|
||||||
nxsem_post(&priv->atresp_sem);
|
nxsem_post(&priv->atresp_sem);
|
||||||
}
|
}
|
||||||
|
@ -167,6 +167,7 @@ struct xbee_priv_s
|
|||||||
* callback to registered receivers */
|
* callback to registered receivers */
|
||||||
WDOG_ID assocwd; /* Association watchdog */
|
WDOG_ID assocwd; /* Association watchdog */
|
||||||
struct work_s assocwork; /* For polling for association status */
|
struct work_s assocwork; /* For polling for association status */
|
||||||
|
bool associating; /* Are we currently associating */
|
||||||
sem_t atquery_sem; /* Only allow one AT query at a time */
|
sem_t atquery_sem; /* Only allow one AT query at a time */
|
||||||
sem_t atresp_sem; /* For signaling pending AT response received */
|
sem_t atresp_sem; /* For signaling pending AT response received */
|
||||||
char querycmd[2]; /* Stores the pending AT Query command */
|
char querycmd[2]; /* Stores the pending AT Query command */
|
||||||
|
@ -146,9 +146,12 @@ static void xbee_assocworker(FAR void *arg)
|
|||||||
{
|
{
|
||||||
FAR struct xbee_priv_s *priv = (FAR struct xbee_priv_s *)arg;
|
FAR struct xbee_priv_s *priv = (FAR struct xbee_priv_s *)arg;
|
||||||
|
|
||||||
xbee_send_atquery(priv, "AI");
|
if (priv->associating)
|
||||||
|
{
|
||||||
|
xbee_send_atquery(priv, "AI");
|
||||||
|
|
||||||
(void)wd_start(priv->assocwd, XBEE_ASSOC_POLLDELAY, xbee_assoctimer, 1, (wdparm_t)arg);
|
(void)wd_start(priv->assocwd, XBEE_ASSOC_POLLDELAY, xbee_assoctimer, 1, (wdparm_t)arg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -660,6 +663,8 @@ int xbee_req_associate(XBEEHANDLE xbee, FAR struct ieee802154_assoc_req_s *req)
|
|||||||
|
|
||||||
xbee_set_epassocflags(priv, XBEE_EPASSOCFLAGS_AUTOASSOC);
|
xbee_set_epassocflags(priv, XBEE_EPASSOCFLAGS_AUTOASSOC);
|
||||||
|
|
||||||
|
priv->associating = true;
|
||||||
|
|
||||||
/* In order to track the association status, we must poll the device for
|
/* In order to track the association status, we must poll the device for
|
||||||
* an update.
|
* an update.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user