gs2200m: Check disassociation from AP and enable rejoin

Summary:
- This commit enables gs2200m driver re-associate to the access point when disassociated

Impact:
- Affects gs2200m only

Testing:
- Tested with spresense:wifi
This commit is contained in:
Masatoshi Ueno 2020-10-30 15:19:50 +09:00 committed by Masayuki Ishikawa
parent 6d3746c2e7
commit c0b4bd2f85

View File

@ -143,7 +143,8 @@ enum pkt_type_e
TYPE_FAIL = 7,
TYPE_TIMEOUT = 8,
TYPE_SPI_ERROR = 9,
TYPE_UNMATCH = 10,
TYPE_DISASSOCIATE = 10,
TYPE_UNMATCH = 11,
};
struct evt_code_s
@ -202,6 +203,8 @@ struct gs2200m_dev_s
struct net_driver_s net_dev;
uint8_t op_mode;
FAR const struct gs2200m_lower_s *lower;
bool disassociate_flag;
struct gs2200m_assoc_msg reconnect_msg;
};
/****************************************************************************
@ -247,6 +250,7 @@ static const struct file_operations g_gs2200m_fops =
static struct evt_code_s _evt_table[] =
{
{"OK", TYPE_OK},
{"Disassociation Event", TYPE_DISASSOCIATE},
{"ERROR", TYPE_ERROR},
{"DISCONNECT", TYPE_DISCONNECT},
{"CONNECT", TYPE_CONNECT},
@ -1473,6 +1477,11 @@ static enum pkt_type_e gs2200m_recv_pkt(FAR struct gs2200m_dev_s *dev,
_check_pkt_q_cnt(dev, pkt_dat->cid);
}
if (t == TYPE_DISASSOCIATE)
{
dev->disassociate_flag = true;
}
if (pkt_dat)
{
pkt_dat->type = t;
@ -2573,6 +2582,10 @@ static int gs2200m_ioctl_assoc_sta(FAR struct gs2200m_dev_s *dev,
{
enum pkt_type_e t;
/* Remember assoc request msg for reconnection */
memcpy(&dev->reconnect_msg, msg, sizeof(struct gs2200m_assoc_msg));
/* Disassociate */
t = gs2200m_disassociate(dev);
@ -2625,6 +2638,8 @@ static int gs2200m_ioctl_assoc_sta(FAR struct gs2200m_dev_s *dev,
return -1;
}
dev->disassociate_flag = false;
return OK;
}
@ -3071,6 +3086,30 @@ repeat:
t = gs2200m_recv_pkt(dev, pkt_dat);
if (true == dev->disassociate_flag)
{
/* Disassociate recovery */
wlwarn("=== receive DISASSOCIATE\n");
dev->valid_cid_bits = 0;
do
{
/* Discard incoming packets until timeout happens */
while (gs2200m_recv_pkt(dev, NULL) != TYPE_TIMEOUT)
{
nxsig_usleep(100 * 1000);
}
}
while (gs2200m_ioctl_assoc_sta(dev, &dev->reconnect_msg) != OK);
wlwarn("=== recover DISASSOCIATE\n");
dev->disassociate_flag = false;
goto errout;
}
if (TYPE_ERROR == t || 'z' == pkt_dat->cid)
{
/* An error event? */