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_FAIL = 7,
TYPE_TIMEOUT = 8, TYPE_TIMEOUT = 8,
TYPE_SPI_ERROR = 9, TYPE_SPI_ERROR = 9,
TYPE_UNMATCH = 10, TYPE_DISASSOCIATE = 10,
TYPE_UNMATCH = 11,
}; };
struct evt_code_s struct evt_code_s
@ -202,6 +203,8 @@ struct gs2200m_dev_s
struct net_driver_s net_dev; struct net_driver_s net_dev;
uint8_t op_mode; uint8_t op_mode;
FAR const struct gs2200m_lower_s *lower; 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[] = static struct evt_code_s _evt_table[] =
{ {
{"OK", TYPE_OK}, {"OK", TYPE_OK},
{"Disassociation Event", TYPE_DISASSOCIATE},
{"ERROR", TYPE_ERROR}, {"ERROR", TYPE_ERROR},
{"DISCONNECT", TYPE_DISCONNECT}, {"DISCONNECT", TYPE_DISCONNECT},
{"CONNECT", TYPE_CONNECT}, {"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); _check_pkt_q_cnt(dev, pkt_dat->cid);
} }
if (t == TYPE_DISASSOCIATE)
{
dev->disassociate_flag = true;
}
if (pkt_dat) if (pkt_dat)
{ {
pkt_dat->type = t; 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; enum pkt_type_e t;
/* Remember assoc request msg for reconnection */
memcpy(&dev->reconnect_msg, msg, sizeof(struct gs2200m_assoc_msg));
/* Disassociate */ /* Disassociate */
t = gs2200m_disassociate(dev); t = gs2200m_disassociate(dev);
@ -2625,6 +2638,8 @@ static int gs2200m_ioctl_assoc_sta(FAR struct gs2200m_dev_s *dev,
return -1; return -1;
} }
dev->disassociate_flag = false;
return OK; return OK;
} }
@ -3071,6 +3086,30 @@ repeat:
t = gs2200m_recv_pkt(dev, pkt_dat); 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) if (TYPE_ERROR == t || 'z' == pkt_dat->cid)
{ {
/* An error event? */ /* An error event? */