import RT-Thread@9217865c without bsp, libcpu and components/net
This commit is contained in:
commit
e2376a3709
1414 changed files with 390370 additions and 0 deletions
30
components/drivers/wlan/SConscript
Normal file
30
components/drivers/wlan/SConscript
Normal file
|
@ -0,0 +1,30 @@
|
|||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
CPPPATH = [cwd]
|
||||
|
||||
src = Split('''
|
||||
wlan_dev.c
|
||||
''')
|
||||
|
||||
if GetDepend(['RT_WLAN_MANAGE_ENABLE']):
|
||||
src += ['wlan_mgnt.c']
|
||||
|
||||
if GetDepend(['RT_WLAN_MSH_CMD_ENABLE']):
|
||||
src += ['wlan_cmd.c']
|
||||
|
||||
if GetDepend(['RT_WLAN_PROT_ENABLE']):
|
||||
src += ['wlan_prot.c']
|
||||
|
||||
if GetDepend(['RT_WLAN_PROT_LWIP_ENABLE']):
|
||||
src += ['wlan_lwip.c']
|
||||
|
||||
if GetDepend(['RT_WLAN_CFG_ENABLE']):
|
||||
src += ['wlan_cfg.c']
|
||||
|
||||
if GetDepend(['RT_WLAN_WORK_THREAD_ENABLE']):
|
||||
src += ['wlan_workqueue.c']
|
||||
|
||||
group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_WIFI'], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
468
components/drivers/wlan/wlan_cfg.c
Normal file
468
components/drivers/wlan/wlan_cfg.c
Normal file
|
@ -0,0 +1,468 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-06 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <wlan_cfg.h>
|
||||
|
||||
#define DBG_TAG "WLAN.cfg"
|
||||
#ifdef RT_WLAN_CFG_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_WLAN_CFG_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
#ifdef RT_WLAN_CFG_ENABLE
|
||||
|
||||
#define WLAN_CFG_LOCK() (rt_mutex_take(&cfg_mutex, RT_WAITING_FOREVER))
|
||||
#define WLAN_CFG_UNLOCK() (rt_mutex_release(&cfg_mutex))
|
||||
|
||||
#if RT_WLAN_CFG_INFO_MAX < 1
|
||||
#error "The minimum configuration is 1"
|
||||
#endif
|
||||
|
||||
struct cfg_save_info_head
|
||||
{
|
||||
rt_uint32_t magic;
|
||||
rt_uint32_t len;
|
||||
rt_uint32_t num;
|
||||
rt_uint32_t crc;
|
||||
};
|
||||
|
||||
struct rt_wlan_cfg_des
|
||||
{
|
||||
rt_uint32_t num;
|
||||
struct rt_wlan_cfg_info *cfg_info;
|
||||
};
|
||||
|
||||
static struct rt_wlan_cfg_des *cfg_cache;
|
||||
static const struct rt_wlan_cfg_ops *cfg_ops;
|
||||
static struct rt_mutex cfg_mutex;
|
||||
|
||||
/*
|
||||
* CRC16_CCITT
|
||||
*/
|
||||
static rt_uint16_t rt_wlan_cal_crc(rt_uint8_t *buff, int len)
|
||||
{
|
||||
rt_uint16_t wCRCin = 0x0000;
|
||||
rt_uint16_t wCPoly = 0x1021;
|
||||
rt_uint8_t wChar = 0;
|
||||
|
||||
while (len--)
|
||||
{
|
||||
int i;
|
||||
|
||||
wChar = *(buff++);
|
||||
wCRCin ^= (wChar << 8);
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (wCRCin & 0x8000)
|
||||
wCRCin = (wCRCin << 1) ^ wCPoly;
|
||||
else
|
||||
wCRCin = wCRCin << 1;
|
||||
}
|
||||
}
|
||||
return wCRCin;
|
||||
}
|
||||
|
||||
void rt_wlan_cfg_init(void)
|
||||
{
|
||||
/* init cache memory */
|
||||
if (cfg_cache == RT_NULL)
|
||||
{
|
||||
cfg_cache = rt_malloc(sizeof(struct rt_wlan_cfg_des));
|
||||
if (cfg_cache != RT_NULL)
|
||||
{
|
||||
rt_memset(cfg_cache, 0, sizeof(struct rt_wlan_cfg_des));
|
||||
}
|
||||
/* init mutex lock */
|
||||
rt_mutex_init(&cfg_mutex, "wlan_cfg", RT_IPC_FLAG_PRIO);
|
||||
}
|
||||
}
|
||||
|
||||
void rt_wlan_cfg_set_ops(const struct rt_wlan_cfg_ops *ops)
|
||||
{
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
WLAN_CFG_LOCK();
|
||||
/* save ops pointer */
|
||||
cfg_ops = ops;
|
||||
WLAN_CFG_UNLOCK();
|
||||
}
|
||||
|
||||
/* save config data */
|
||||
rt_err_t rt_wlan_cfg_cache_save(void)
|
||||
{
|
||||
rt_err_t err = RT_EOK;
|
||||
struct cfg_save_info_head *info_pkg;
|
||||
int len = 0;
|
||||
|
||||
if ((cfg_ops == RT_NULL) || (cfg_ops->write_cfg == RT_NULL))
|
||||
return RT_EOK;
|
||||
|
||||
WLAN_CFG_LOCK();
|
||||
len = sizeof(struct cfg_save_info_head) + sizeof(struct rt_wlan_cfg_info) * cfg_cache->num;
|
||||
info_pkg = rt_malloc(len);
|
||||
if (info_pkg == RT_NULL)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
info_pkg->magic = RT_WLAN_CFG_MAGIC;
|
||||
info_pkg->len = len;
|
||||
info_pkg->num = cfg_cache->num;
|
||||
/* CRC */
|
||||
info_pkg->crc = rt_wlan_cal_crc((rt_uint8_t *)cfg_cache->cfg_info, sizeof(struct rt_wlan_cfg_info) * cfg_cache->num);
|
||||
rt_memcpy(((rt_uint8_t *)info_pkg) + sizeof(struct cfg_save_info_head),
|
||||
cfg_cache->cfg_info, sizeof(struct rt_wlan_cfg_info) * cfg_cache->num);
|
||||
if (cfg_ops->write_cfg(info_pkg, len) != len)
|
||||
err = -RT_ERROR;
|
||||
rt_free(info_pkg);
|
||||
WLAN_CFG_UNLOCK();
|
||||
return err;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_cfg_cache_refresh(void)
|
||||
{
|
||||
int len = 0, i, j;
|
||||
struct cfg_save_info_head *head;
|
||||
void *data;
|
||||
struct rt_wlan_cfg_info *t_info, *cfg_info;
|
||||
rt_uint32_t crc;
|
||||
rt_bool_t equal_flag;
|
||||
|
||||
/* cache is full! exit */
|
||||
if (cfg_cache == RT_NULL || cfg_cache->num >= RT_WLAN_CFG_INFO_MAX)
|
||||
return -RT_ERROR;
|
||||
|
||||
/* check callback */
|
||||
if ((cfg_ops == RT_NULL) ||
|
||||
(cfg_ops->get_len == RT_NULL) ||
|
||||
(cfg_ops->read_cfg == RT_NULL))
|
||||
return -RT_ERROR;
|
||||
|
||||
WLAN_CFG_LOCK();
|
||||
/* get data len */
|
||||
if ((len = cfg_ops->get_len()) <= 0)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
head = rt_malloc(len);
|
||||
if (head == RT_NULL)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ERROR;
|
||||
}
|
||||
/* get data */
|
||||
if (cfg_ops->read_cfg(head, len) != len)
|
||||
{
|
||||
rt_free(head);
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ERROR;
|
||||
}
|
||||
/* get config */
|
||||
data = ((rt_uint8_t *)head) + sizeof(struct cfg_save_info_head);
|
||||
crc = rt_wlan_cal_crc((rt_uint8_t *)data, len - sizeof(struct cfg_save_info_head));
|
||||
LOG_D("head->magic:0x%08x RT_WLAN_CFG_MAGIC:0x%08x", head->magic, RT_WLAN_CFG_MAGIC);
|
||||
LOG_D("head->len:%d len:%d", head->len, len);
|
||||
LOG_D("head->num:%d num:%d", head->num, (len - sizeof(struct cfg_save_info_head)) / sizeof(struct rt_wlan_cfg_info));
|
||||
LOG_D("hred->crc:0x%04x crc:0x%04x", head->crc, crc);
|
||||
/* check */
|
||||
if ((head->magic != RT_WLAN_CFG_MAGIC) ||
|
||||
(head->len != len) ||
|
||||
(head->num != (len - sizeof(struct cfg_save_info_head)) / sizeof(struct rt_wlan_cfg_info)) ||
|
||||
(head->crc != crc))
|
||||
{
|
||||
rt_free(head);
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
/* remove duplicate config */
|
||||
cfg_info = (struct rt_wlan_cfg_info *)data;
|
||||
for (i = 0; i < head->num; i++)
|
||||
{
|
||||
equal_flag = RT_FALSE;
|
||||
for (j = 0; j < cfg_cache->num; j++)
|
||||
{
|
||||
if ((cfg_cache->cfg_info[j].info.ssid.len == cfg_info[i].info.ssid.len) &&
|
||||
(rt_memcmp(&cfg_cache->cfg_info[j].info.ssid.val[0], &cfg_info[i].info.ssid.val[0],
|
||||
cfg_cache->cfg_info[j].info.ssid.len) == 0) &&
|
||||
(rt_memcmp(&cfg_cache->cfg_info[j].info.bssid[0], &cfg_info[i].info.bssid[0], RT_WLAN_BSSID_MAX_LENGTH) == 0))
|
||||
{
|
||||
equal_flag = RT_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cfg_cache->num >= RT_WLAN_CFG_INFO_MAX)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (equal_flag == RT_FALSE)
|
||||
{
|
||||
t_info = rt_realloc(cfg_cache->cfg_info, sizeof(struct rt_wlan_cfg_info) * (cfg_cache->num + 1));
|
||||
if (t_info == RT_NULL)
|
||||
{
|
||||
rt_free(head);
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ERROR;
|
||||
}
|
||||
cfg_cache->cfg_info = t_info;
|
||||
cfg_cache->cfg_info[cfg_cache->num] = cfg_info[i];
|
||||
cfg_cache->num ++;
|
||||
}
|
||||
}
|
||||
|
||||
rt_free(head);
|
||||
WLAN_CFG_UNLOCK();
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
int rt_wlan_cfg_get_num(void)
|
||||
{
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
return cfg_cache->num;
|
||||
}
|
||||
|
||||
int rt_wlan_cfg_read(struct rt_wlan_cfg_info *cfg_info, int num)
|
||||
{
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
if ((cfg_info == RT_NULL) || (num <= 0))
|
||||
return 0;
|
||||
/* copy data */
|
||||
WLAN_CFG_LOCK();
|
||||
num = cfg_cache->num > num ? num : cfg_cache->num;
|
||||
rt_memcpy(&cfg_cache->cfg_info[0], cfg_info, sizeof(struct rt_wlan_cfg_info) * num);
|
||||
WLAN_CFG_UNLOCK();
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_cfg_save(struct rt_wlan_cfg_info *cfg_info)
|
||||
{
|
||||
rt_err_t err = RT_EOK;
|
||||
struct rt_wlan_cfg_info *t_info;
|
||||
int idx = -1, i = 0;
|
||||
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
/* parameter check */
|
||||
if ((cfg_info == RT_NULL) || (cfg_info->info.ssid.len == 0))
|
||||
{
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
/* if (iteam == cache) exit */
|
||||
WLAN_CFG_LOCK();
|
||||
for (i = 0; i < cfg_cache->num; i++)
|
||||
{
|
||||
if ((cfg_cache->cfg_info[i].info.ssid.len == cfg_info->info.ssid.len) &&
|
||||
(rt_memcmp(&cfg_cache->cfg_info[i].info.ssid.val[0], &cfg_info->info.ssid.val[0],
|
||||
cfg_cache->cfg_info[i].info.ssid.len) == 0) &&
|
||||
(rt_memcmp(&cfg_cache->cfg_info[i].info.bssid[0], &cfg_info->info.bssid[0], RT_WLAN_BSSID_MAX_LENGTH) == 0))
|
||||
{
|
||||
idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((idx == 0) && (cfg_cache->cfg_info[i].key.len == cfg_info->key.len) &&
|
||||
(rt_memcmp(&cfg_cache->cfg_info[i].key.val[0], &cfg_info->key.val[0], cfg_info->key.len) == 0))
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
/* not find iteam with cache, Add iteam to the head */
|
||||
if ((idx == -1) && (cfg_cache->num < RT_WLAN_CFG_INFO_MAX))
|
||||
{
|
||||
t_info = rt_realloc(cfg_cache->cfg_info, sizeof(struct rt_wlan_cfg_info) * (cfg_cache->num + 1));
|
||||
if (t_info == RT_NULL)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
cfg_cache->cfg_info = t_info;
|
||||
cfg_cache->num ++;
|
||||
}
|
||||
|
||||
/* move cache info */
|
||||
i = (i >= RT_WLAN_CFG_INFO_MAX ? RT_WLAN_CFG_INFO_MAX - 1 : i);
|
||||
for (; i; i--)
|
||||
{
|
||||
cfg_cache->cfg_info[i] = cfg_cache->cfg_info[i - 1];
|
||||
}
|
||||
/* add iteam to head */
|
||||
cfg_cache->cfg_info[i] = *cfg_info;
|
||||
WLAN_CFG_UNLOCK();
|
||||
|
||||
/* save info to flash */
|
||||
err = rt_wlan_cfg_cache_save();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int rt_wlan_cfg_read_index(struct rt_wlan_cfg_info *cfg_info, int index)
|
||||
{
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
if ((cfg_info == RT_NULL) || (index < 0))
|
||||
return 0;
|
||||
|
||||
WLAN_CFG_LOCK();
|
||||
if (index >= cfg_cache->num)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return 0;
|
||||
}
|
||||
/* copy data */
|
||||
*cfg_info = cfg_cache->cfg_info[index];
|
||||
WLAN_CFG_UNLOCK();
|
||||
return 1;
|
||||
}
|
||||
|
||||
int rt_wlan_cfg_delete_index(int index)
|
||||
{
|
||||
struct rt_wlan_cfg_info *cfg_info;
|
||||
int i;
|
||||
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
if (index < 0)
|
||||
return -1;
|
||||
|
||||
WLAN_CFG_LOCK();
|
||||
if (index >= cfg_cache->num)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* malloc new mem */
|
||||
cfg_info = rt_malloc(sizeof(struct rt_wlan_cfg_info) * (cfg_cache->num - 1));
|
||||
if (cfg_info == RT_NULL)
|
||||
{
|
||||
WLAN_CFG_UNLOCK();
|
||||
return -1;
|
||||
}
|
||||
/* copy data to new mem */
|
||||
for (i = 0; i < cfg_cache->num; i++)
|
||||
{
|
||||
if (i < index)
|
||||
{
|
||||
cfg_info[i] = cfg_cache->cfg_info[i];
|
||||
}
|
||||
else if (i > index)
|
||||
{
|
||||
cfg_info[i - 1] = cfg_cache->cfg_info[i];
|
||||
}
|
||||
}
|
||||
rt_free(cfg_cache->cfg_info);
|
||||
cfg_cache->cfg_info = cfg_info;
|
||||
cfg_cache->num --;
|
||||
WLAN_CFG_UNLOCK();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rt_wlan_cfg_delete_all(void)
|
||||
{
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
/* delete all iteam */
|
||||
WLAN_CFG_LOCK();
|
||||
cfg_cache->num = 0;
|
||||
rt_free(cfg_cache->cfg_info);
|
||||
cfg_cache->cfg_info = RT_NULL;
|
||||
WLAN_CFG_UNLOCK();
|
||||
}
|
||||
|
||||
void rt_wlan_cfg_dump(void)
|
||||
{
|
||||
int index = 0;
|
||||
struct rt_wlan_info *info;
|
||||
struct rt_wlan_key *key;
|
||||
char *security;
|
||||
|
||||
rt_wlan_cfg_init();
|
||||
|
||||
rt_kprintf(" SSID PASSWORD MAC security chn\n");
|
||||
rt_kprintf("------------------------------- ------------------------------- ----------------- -------------- ---\n");
|
||||
for (index = 0; index < cfg_cache->num; index ++)
|
||||
{
|
||||
info = &cfg_cache->cfg_info[index].info;
|
||||
key = &cfg_cache->cfg_info[index].key;
|
||||
|
||||
if (info->ssid.len)
|
||||
rt_kprintf("%-32.32s", &info->ssid.val[0]);
|
||||
else
|
||||
rt_kprintf("%-32.32s", " ");
|
||||
|
||||
if (key->len)
|
||||
rt_kprintf("%-32.32s", &key->val[0]);
|
||||
else
|
||||
rt_kprintf("%-32.32s", " ");
|
||||
|
||||
rt_kprintf("%02x:%02x:%02x:%02x:%02x:%02x ",
|
||||
info->bssid[0],
|
||||
info->bssid[1],
|
||||
info->bssid[2],
|
||||
info->bssid[3],
|
||||
info->bssid[4],
|
||||
info->bssid[5]
|
||||
);
|
||||
switch (info->security)
|
||||
{
|
||||
case SECURITY_OPEN:
|
||||
security = "OPEN";
|
||||
break;
|
||||
case SECURITY_WEP_PSK:
|
||||
security = "WEP_PSK";
|
||||
break;
|
||||
case SECURITY_WEP_SHARED:
|
||||
security = "WEP_SHARED";
|
||||
break;
|
||||
case SECURITY_WPA_TKIP_PSK:
|
||||
security = "WPA_TKIP_PSK";
|
||||
break;
|
||||
case SECURITY_WPA_AES_PSK:
|
||||
security = "WPA_AES_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_AES_PSK:
|
||||
security = "WPA2_AES_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_TKIP_PSK:
|
||||
security = "WPA2_TKIP_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_MIXED_PSK:
|
||||
security = "WPA2_MIXED_PSK";
|
||||
break;
|
||||
case SECURITY_WPS_OPEN:
|
||||
security = "WPS_OPEN";
|
||||
break;
|
||||
case SECURITY_WPS_SECURE:
|
||||
security = "WPS_SECURE";
|
||||
break;
|
||||
default:
|
||||
security = "UNKNOWN";
|
||||
break;
|
||||
}
|
||||
rt_kprintf("%-14.14s ", security);
|
||||
rt_kprintf("%3d \n", info->channel);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
67
components/drivers/wlan/wlan_cfg.h
Normal file
67
components/drivers/wlan/wlan_cfg.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-06 tyx the first version
|
||||
*/
|
||||
|
||||
#ifndef __WLAN_CFG_H__
|
||||
#define __WLAN_CFG_H__
|
||||
|
||||
#include <wlan_dev.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_CFG_INFO_MAX
|
||||
#define RT_WLAN_CFG_INFO_MAX (3) /* min is 1 */
|
||||
#endif
|
||||
|
||||
#define RT_WLAN_CFG_MAGIC (0x426f6d62)
|
||||
|
||||
struct rt_wlan_cfg_info
|
||||
{
|
||||
struct rt_wlan_info info;
|
||||
struct rt_wlan_key key;
|
||||
};
|
||||
|
||||
typedef int (*rt_wlan_wr)(void *buff, int len);
|
||||
|
||||
struct rt_wlan_cfg_ops
|
||||
{
|
||||
int (*read_cfg)(void *buff, int len);
|
||||
int (*get_len)(void);
|
||||
int (*write_cfg)(void *buff, int len);
|
||||
};
|
||||
|
||||
void rt_wlan_cfg_init(void);
|
||||
|
||||
void rt_wlan_cfg_set_ops(const struct rt_wlan_cfg_ops *ops);
|
||||
|
||||
int rt_wlan_cfg_get_num(void);
|
||||
|
||||
int rt_wlan_cfg_read(struct rt_wlan_cfg_info *cfg_info, int num);
|
||||
|
||||
int rt_wlan_cfg_read_index(struct rt_wlan_cfg_info *cfg_info, int index);
|
||||
|
||||
rt_err_t rt_wlan_cfg_save(struct rt_wlan_cfg_info *cfg_info);
|
||||
|
||||
rt_err_t rt_wlan_cfg_cache_refresh(void);
|
||||
|
||||
rt_err_t rt_wlan_cfg_cache_save(void);
|
||||
|
||||
int rt_wlan_cfg_delete_index(int index);
|
||||
|
||||
void rt_wlan_cfg_delete_all(void);
|
||||
|
||||
void rt_wlan_cfg_dump(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
821
components/drivers/wlan/wlan_cmd.c
Normal file
821
components/drivers/wlan/wlan_cmd.c
Normal file
|
@ -0,0 +1,821 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-13 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rthw.h>
|
||||
#include <wlan_mgnt.h>
|
||||
#include <wlan_cfg.h>
|
||||
#include <wlan_prot.h>
|
||||
|
||||
#define DBG_TAG "WLAN.cmd"
|
||||
#ifdef RT_WLAN_MGNT_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_WLAN_MGNT_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
static struct rt_wlan_scan_result scan_result;
|
||||
static struct rt_wlan_info *scan_filter = RT_NULL;
|
||||
|
||||
#if defined(RT_WLAN_MANAGE_ENABLE) && defined(RT_WLAN_MSH_CMD_ENABLE)
|
||||
|
||||
struct wifi_cmd_des
|
||||
{
|
||||
const char *cmd;
|
||||
int (*fun)(int argc, char *argv[]);
|
||||
};
|
||||
|
||||
static int wifi_help(int argc, char *argv[]);
|
||||
static int wifi_scan(int argc, char *argv[]);
|
||||
static int wifi_status(int argc, char *argv[]);
|
||||
static int wifi_join(int argc, char *argv[]);
|
||||
static int wifi_ap(int argc, char *argv[]);
|
||||
static int wifi_list_sta(int argc, char *argv[]);
|
||||
static int wifi_disconnect(int argc, char *argv[]);
|
||||
static int wifi_ap_stop(int argc, char *argv[]);
|
||||
|
||||
#ifdef RT_WLAN_CMD_DEBUG
|
||||
/* just for debug */
|
||||
static int wifi_debug(int argc, char *argv[]);
|
||||
static int wifi_debug_save_cfg(int argc, char *argv[]);
|
||||
static int wifi_debug_dump_cfg(int argc, char *argv[]);
|
||||
static int wifi_debug_clear_cfg(int argc, char *argv[]);
|
||||
static int wifi_debug_dump_prot(int argc, char *argv[]);
|
||||
static int wifi_debug_set_mode(int argc, char *argv[]);
|
||||
static int wifi_debug_set_prot(int argc, char *argv[]);
|
||||
static int wifi_debug_set_autoconnect(int argc, char *argv[]);
|
||||
#endif
|
||||
|
||||
/* cmd table */
|
||||
static const struct wifi_cmd_des cmd_tab[] =
|
||||
{
|
||||
{"scan", wifi_scan},
|
||||
{"help", wifi_help},
|
||||
{"status", wifi_status},
|
||||
{"join", wifi_join},
|
||||
{"ap", wifi_ap},
|
||||
{"list_sta", wifi_list_sta},
|
||||
{"disc", wifi_disconnect},
|
||||
{"ap_stop", wifi_ap_stop},
|
||||
{"smartconfig", RT_NULL},
|
||||
#ifdef RT_WLAN_CMD_DEBUG
|
||||
{"-d", wifi_debug},
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef RT_WLAN_CMD_DEBUG
|
||||
/* debug cmd table */
|
||||
static const struct wifi_cmd_des debug_tab[] =
|
||||
{
|
||||
{"save_cfg", wifi_debug_save_cfg},
|
||||
{"dump_cfg", wifi_debug_dump_cfg},
|
||||
{"clear_cfg", wifi_debug_clear_cfg},
|
||||
{"dump_prot", wifi_debug_dump_prot},
|
||||
{"mode", wifi_debug_set_mode},
|
||||
{"prot", wifi_debug_set_prot},
|
||||
{"auto", wifi_debug_set_autoconnect},
|
||||
};
|
||||
#endif
|
||||
|
||||
static int wifi_help(int argc, char *argv[])
|
||||
{
|
||||
rt_kprintf("wifi\n");
|
||||
rt_kprintf("wifi help\n");
|
||||
rt_kprintf("wifi scan [SSID]\n");
|
||||
rt_kprintf("wifi join [SSID] [PASSWORD]\n");
|
||||
rt_kprintf("wifi ap SSID [PASSWORD]\n");
|
||||
rt_kprintf("wifi disc\n");
|
||||
rt_kprintf("wifi ap_stop\n");
|
||||
rt_kprintf("wifi status\n");
|
||||
rt_kprintf("wifi smartconfig\n");
|
||||
#ifdef RT_WLAN_CMD_DEBUG
|
||||
rt_kprintf("wifi -d debug command\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_status(int argc, char *argv[])
|
||||
{
|
||||
int rssi;
|
||||
struct rt_wlan_info info;
|
||||
|
||||
if (argc > 2)
|
||||
return -1;
|
||||
|
||||
if (rt_wlan_is_connected() == 1)
|
||||
{
|
||||
rssi = rt_wlan_get_rssi();
|
||||
rt_wlan_get_info(&info);
|
||||
rt_kprintf("Wi-Fi STA Info\n");
|
||||
rt_kprintf("SSID : %-.32s\n", &info.ssid.val[0]);
|
||||
rt_kprintf("MAC Addr: %02x:%02x:%02x:%02x:%02x:%02x\n", info.bssid[0],
|
||||
info.bssid[1],
|
||||
info.bssid[2],
|
||||
info.bssid[3],
|
||||
info.bssid[4],
|
||||
info.bssid[5]);
|
||||
rt_kprintf("Channel: %d\n", info.channel);
|
||||
rt_kprintf("DataRate: %dMbps\n", info.datarate / 1000000);
|
||||
rt_kprintf("RSSI: %d\n", rssi);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("wifi disconnected!\n");
|
||||
}
|
||||
|
||||
if (rt_wlan_ap_is_active() == 1)
|
||||
{
|
||||
rt_wlan_ap_get_info(&info);
|
||||
rt_kprintf("Wi-Fi AP Info\n");
|
||||
rt_kprintf("SSID : %-.32s\n", &info.ssid.val[0]);
|
||||
rt_kprintf("MAC Addr: %02x:%02x:%02x:%02x:%02x:%02x\n", info.bssid[0],
|
||||
info.bssid[1],
|
||||
info.bssid[2],
|
||||
info.bssid[3],
|
||||
info.bssid[4],
|
||||
info.bssid[5]);
|
||||
rt_kprintf("Channel: %d\n", info.channel);
|
||||
rt_kprintf("DataRate: %dMbps\n", info.datarate / 1000000);
|
||||
rt_kprintf("hidden: %s\n", info.hidden ? "Enable" : "Disable");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("wifi ap not start!\n");
|
||||
}
|
||||
rt_kprintf("Auto Connect status:%s!\n", (rt_wlan_get_autoreconnect_mode() ? "Enable" : "Disable"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static rt_bool_t wifi_info_isequ(struct rt_wlan_info *info1, struct rt_wlan_info *info2)
|
||||
{
|
||||
rt_bool_t is_equ = 1;
|
||||
rt_uint8_t bssid_zero[RT_WLAN_BSSID_MAX_LENGTH] = { 0 };
|
||||
|
||||
if (is_equ && (info1->security != SECURITY_UNKNOWN) && (info2->security != SECURITY_UNKNOWN))
|
||||
{
|
||||
is_equ &= info2->security == info1->security;
|
||||
}
|
||||
if (is_equ && ((info1->ssid.len > 0) && (info2->ssid.len > 0)))
|
||||
{
|
||||
is_equ &= info1->ssid.len == info2->ssid.len;
|
||||
is_equ &= rt_memcmp(&info2->ssid.val[0], &info1->ssid.val[0], info1->ssid.len) == 0;
|
||||
}
|
||||
if (is_equ && (rt_memcmp(&info1->bssid[0], bssid_zero, RT_WLAN_BSSID_MAX_LENGTH)) &&
|
||||
(rt_memcmp(&info2->bssid[0], bssid_zero, RT_WLAN_BSSID_MAX_LENGTH)))
|
||||
{
|
||||
is_equ &= rt_memcmp(&info1->bssid[0], &info2->bssid[0], RT_WLAN_BSSID_MAX_LENGTH) == 0;
|
||||
}
|
||||
if (is_equ && info1->datarate && info2->datarate)
|
||||
{
|
||||
is_equ &= info1->datarate == info2->datarate;
|
||||
}
|
||||
if (is_equ && (info1->channel >= 0) && (info2->channel >= 0))
|
||||
{
|
||||
is_equ &= info1->channel == info2->channel;
|
||||
}
|
||||
if (is_equ && (info1->rssi < 0) && (info2->rssi < 0))
|
||||
{
|
||||
is_equ &= info1->rssi == info2->rssi;
|
||||
}
|
||||
return is_equ;
|
||||
}
|
||||
|
||||
static rt_err_t wifi_scan_result_cache(struct rt_wlan_info *info)
|
||||
{
|
||||
struct rt_wlan_info *ptable;
|
||||
rt_err_t err = RT_EOK;
|
||||
int i, insert = -1;
|
||||
rt_base_t level;
|
||||
|
||||
if ((info == RT_NULL) || (info->ssid.len == 0)) return -RT_EINVAL;
|
||||
|
||||
LOG_D("ssid:%s len:%d mac:%02x:%02x:%02x:%02x:%02x:%02x", info->ssid.val, info->ssid.len,
|
||||
info->bssid[0], info->bssid[1], info->bssid[2], info->bssid[3], info->bssid[4], info->bssid[5]);
|
||||
|
||||
/* scanning result filtering */
|
||||
level = rt_hw_interrupt_disable();
|
||||
if (scan_filter)
|
||||
{
|
||||
struct rt_wlan_info _tmp_info = *scan_filter;
|
||||
rt_hw_interrupt_enable(level);
|
||||
if (wifi_info_isequ(&_tmp_info, info) != RT_TRUE)
|
||||
{
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
/* de-duplicatio */
|
||||
for (i = 0; i < scan_result.num; i++)
|
||||
{
|
||||
if ((info->ssid.len == scan_result.info[i].ssid.len) &&
|
||||
(rt_memcmp(&info->bssid[0], &scan_result.info[i].bssid[0], RT_WLAN_BSSID_MAX_LENGTH) == 0))
|
||||
{
|
||||
return RT_EOK;
|
||||
}
|
||||
#ifdef RT_WLAN_SCAN_SORT
|
||||
if (insert >= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/* Signal intensity comparison */
|
||||
if ((info->rssi < 0) && (scan_result.info[i].rssi < 0))
|
||||
{
|
||||
if (info->rssi > scan_result.info[i].rssi)
|
||||
{
|
||||
insert = i;
|
||||
continue;
|
||||
}
|
||||
else if (info->rssi < scan_result.info[i].rssi)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Channel comparison */
|
||||
if (info->channel < scan_result.info[i].channel)
|
||||
{
|
||||
insert = i;
|
||||
continue;
|
||||
}
|
||||
else if (info->channel > scan_result.info[i].channel)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* data rate comparison */
|
||||
if ((info->datarate > scan_result.info[i].datarate))
|
||||
{
|
||||
insert = i;
|
||||
continue;
|
||||
}
|
||||
else if (info->datarate < scan_result.info[i].datarate)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Insert the end */
|
||||
if (insert == -1)
|
||||
insert = scan_result.num;
|
||||
|
||||
if (scan_result.num >= RT_WLAN_SCAN_CACHE_NUM)
|
||||
return RT_EOK;
|
||||
|
||||
/* malloc memory */
|
||||
ptable = rt_malloc(sizeof(struct rt_wlan_info) * (scan_result.num + 1));
|
||||
if (ptable == RT_NULL)
|
||||
{
|
||||
LOG_E("wlan info malloc failed!");
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
scan_result.num ++;
|
||||
|
||||
/* copy info */
|
||||
for (i = 0; i < scan_result.num; i++)
|
||||
{
|
||||
if (i < insert)
|
||||
{
|
||||
ptable[i] = scan_result.info[i];
|
||||
}
|
||||
else if (i > insert)
|
||||
{
|
||||
ptable[i] = scan_result.info[i - 1];
|
||||
}
|
||||
else if (i == insert)
|
||||
{
|
||||
ptable[i] = *info;
|
||||
}
|
||||
}
|
||||
rt_free(scan_result.info);
|
||||
scan_result.info = ptable;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void wifi_scan_result_clean(void)
|
||||
{
|
||||
|
||||
/* If there is data */
|
||||
if (scan_result.num)
|
||||
{
|
||||
scan_result.num = 0;
|
||||
rt_free(scan_result.info);
|
||||
scan_result.info = RT_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void print_ap_info(struct rt_wlan_info *info,int index)
|
||||
{
|
||||
char *security;
|
||||
|
||||
if(index == 0)
|
||||
{
|
||||
rt_kprintf(" SSID MAC security rssi chn Mbps\n");
|
||||
rt_kprintf("------------------------------- ----------------- -------------- ---- --- ----\n");
|
||||
}
|
||||
|
||||
{
|
||||
rt_kprintf("%-32.32s", &(info->ssid.val[0]));
|
||||
rt_kprintf("%02x:%02x:%02x:%02x:%02x:%02x ",
|
||||
info->bssid[0],
|
||||
info->bssid[1],
|
||||
info->bssid[2],
|
||||
info->bssid[3],
|
||||
info->bssid[4],
|
||||
info->bssid[5]
|
||||
);
|
||||
switch (info->security)
|
||||
{
|
||||
case SECURITY_OPEN:
|
||||
security = "OPEN";
|
||||
break;
|
||||
case SECURITY_WEP_PSK:
|
||||
security = "WEP_PSK";
|
||||
break;
|
||||
case SECURITY_WEP_SHARED:
|
||||
security = "WEP_SHARED";
|
||||
break;
|
||||
case SECURITY_WPA_TKIP_PSK:
|
||||
security = "WPA_TKIP_PSK";
|
||||
break;
|
||||
case SECURITY_WPA_AES_PSK:
|
||||
security = "WPA_AES_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_AES_PSK:
|
||||
security = "WPA2_AES_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_TKIP_PSK:
|
||||
security = "WPA2_TKIP_PSK";
|
||||
break;
|
||||
case SECURITY_WPA2_MIXED_PSK:
|
||||
security = "WPA2_MIXED_PSK";
|
||||
break;
|
||||
case SECURITY_WPS_OPEN:
|
||||
security = "WPS_OPEN";
|
||||
break;
|
||||
case SECURITY_WPS_SECURE:
|
||||
security = "WPS_SECURE";
|
||||
break;
|
||||
default:
|
||||
security = "UNKNOWN";
|
||||
break;
|
||||
}
|
||||
rt_kprintf("%-14.14s ", security);
|
||||
rt_kprintf("%-4d ", info->rssi);
|
||||
rt_kprintf("%3d ", info->channel);
|
||||
rt_kprintf("%4d\n", info->datarate / 1000000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void user_ap_info_callback(int event, struct rt_wlan_buff *buff, void *parameter)
|
||||
{
|
||||
struct rt_wlan_info *info = RT_NULL;
|
||||
int index = 0;
|
||||
int ret = RT_EOK;
|
||||
|
||||
RT_ASSERT(event == RT_WLAN_EVT_SCAN_REPORT);
|
||||
RT_ASSERT(buff != RT_NULL);
|
||||
RT_ASSERT(parameter != RT_NULL);
|
||||
|
||||
info = (struct rt_wlan_info *)buff->data;
|
||||
index = *((int *)(parameter));
|
||||
|
||||
ret = wifi_scan_result_cache(info);
|
||||
if(ret == RT_EOK)
|
||||
{
|
||||
if(scan_filter == RT_NULL ||
|
||||
(scan_filter != RT_NULL &&
|
||||
scan_filter->ssid.len == info->ssid.len &&
|
||||
rt_memcmp(&scan_filter->ssid.val[0], &info->ssid.val[0], scan_filter->ssid.len) == 0))
|
||||
{
|
||||
/*Print the info*/
|
||||
print_ap_info(info,index);
|
||||
|
||||
index++;
|
||||
*((int *)(parameter)) = index;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
static int wifi_scan(int argc, char *argv[])
|
||||
{
|
||||
struct rt_wlan_info *info = RT_NULL;
|
||||
struct rt_wlan_info filter;
|
||||
int ret = 0;
|
||||
int i = 0;
|
||||
|
||||
if (argc > 3)
|
||||
return -1;
|
||||
|
||||
if (argc == 3)
|
||||
{
|
||||
INVALID_INFO(&filter);
|
||||
SSID_SET(&filter, argv[2]);
|
||||
info = &filter;
|
||||
}
|
||||
|
||||
ret = rt_wlan_register_event_handler(RT_WLAN_EVT_SCAN_REPORT,user_ap_info_callback,&i);
|
||||
if(ret != RT_EOK)
|
||||
{
|
||||
LOG_E("Scan register user callback error:%d!\n",ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(info)
|
||||
{
|
||||
scan_filter = info;
|
||||
}
|
||||
|
||||
|
||||
/*Todo: what can i do for it return val */
|
||||
ret = rt_wlan_scan_with_info(info);
|
||||
if(ret != RT_EOK)
|
||||
{
|
||||
LOG_E("Scan with info error:%d!\n",ret);
|
||||
}
|
||||
|
||||
/* clean scan result */
|
||||
wifi_scan_result_clean();
|
||||
if(info)
|
||||
{
|
||||
scan_filter = RT_NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_join(int argc, char *argv[])
|
||||
{
|
||||
const char *ssid = RT_NULL;
|
||||
const char *key = RT_NULL;
|
||||
struct rt_wlan_cfg_info cfg_info;
|
||||
|
||||
rt_memset(&cfg_info, 0, sizeof(cfg_info));
|
||||
if (argc == 2)
|
||||
{
|
||||
#ifdef RT_WLAN_CFG_ENABLE
|
||||
/* get info to connect */
|
||||
if (rt_wlan_cfg_read_index(&cfg_info, 0) == 1)
|
||||
{
|
||||
ssid = (char *)(&cfg_info.info.ssid.val[0]);
|
||||
if (cfg_info.key.len)
|
||||
key = (char *)(&cfg_info.key.val[0]);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
rt_kprintf("not find connect info\n");
|
||||
}
|
||||
}
|
||||
else if (argc == 3)
|
||||
{
|
||||
/* ssid */
|
||||
ssid = argv[2];
|
||||
}
|
||||
else if (argc == 4)
|
||||
{
|
||||
ssid = argv[2];
|
||||
/* password */
|
||||
key = argv[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
rt_wlan_connect(ssid, key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_ap(int argc, char *argv[])
|
||||
{
|
||||
const char *ssid = RT_NULL;
|
||||
const char *key = RT_NULL;
|
||||
|
||||
if (argc == 3)
|
||||
{
|
||||
ssid = argv[2];
|
||||
}
|
||||
else if (argc == 4)
|
||||
{
|
||||
ssid = argv[2];
|
||||
key = argv[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
rt_wlan_start_ap(ssid, key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_list_sta(int argc, char *argv[])
|
||||
{
|
||||
struct rt_wlan_info *sta_info;
|
||||
int num, i;
|
||||
|
||||
if (argc > 2)
|
||||
return -1;
|
||||
num = rt_wlan_ap_get_sta_num();
|
||||
sta_info = rt_malloc(sizeof(struct rt_wlan_info) * num);
|
||||
if (sta_info == RT_NULL)
|
||||
{
|
||||
rt_kprintf("num:%d\n", num);
|
||||
return 0;
|
||||
}
|
||||
rt_wlan_ap_get_sta_info(sta_info, num);
|
||||
rt_kprintf("num:%d\n", num);
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
rt_kprintf("sta mac %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
sta_info[i].bssid[0], sta_info[i].bssid[1], sta_info[i].bssid[2],
|
||||
sta_info[i].bssid[3], sta_info[i].bssid[4], sta_info[i].bssid[5]);
|
||||
}
|
||||
rt_free(sta_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_disconnect(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
rt_wlan_disconnect();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_ap_stop(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
rt_wlan_ap_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef RT_WLAN_CMD_DEBUG
|
||||
/* just for debug */
|
||||
static int wifi_debug_help(int argc, char *argv[])
|
||||
{
|
||||
rt_kprintf("save_cfg ssid [password]\n");
|
||||
rt_kprintf("dump_cfg\n");
|
||||
rt_kprintf("clear_cfg\n");
|
||||
rt_kprintf("dump_prot\n");
|
||||
rt_kprintf("mode sta/ap dev_name\n");
|
||||
rt_kprintf("prot lwip dev_name\n");
|
||||
rt_kprintf("auto enable/disable\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_save_cfg(int argc, char *argv[])
|
||||
{
|
||||
struct rt_wlan_cfg_info cfg_info;
|
||||
int len;
|
||||
char *ssid = RT_NULL, *password = RT_NULL;
|
||||
|
||||
rt_memset(&cfg_info, 0, sizeof(cfg_info));
|
||||
INVALID_INFO(&cfg_info.info);
|
||||
if (argc == 2)
|
||||
{
|
||||
ssid = argv[1];
|
||||
}
|
||||
else if (argc == 3)
|
||||
{
|
||||
ssid = argv[1];
|
||||
password = argv[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ssid != RT_NULL)
|
||||
{
|
||||
len = rt_strlen(ssid);
|
||||
if (len > RT_WLAN_SSID_MAX_LENGTH)
|
||||
{
|
||||
rt_kprintf("ssid is to long");
|
||||
return 0;
|
||||
}
|
||||
rt_memcpy(&cfg_info.info.ssid.val[0], ssid, len);
|
||||
cfg_info.info.ssid.len = len;
|
||||
}
|
||||
|
||||
if (password != RT_NULL)
|
||||
{
|
||||
len = rt_strlen(password);
|
||||
if (len > RT_WLAN_PASSWORD_MAX_LENGTH)
|
||||
{
|
||||
rt_kprintf("password is to long");
|
||||
return 0;
|
||||
}
|
||||
rt_memcpy(&cfg_info.key.val[0], password, len);
|
||||
cfg_info.key.len = len;
|
||||
}
|
||||
#ifdef RT_WLAN_CFG_ENABLE
|
||||
rt_wlan_cfg_save(&cfg_info);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_dump_cfg(int argc, char *argv[])
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
#ifdef RT_WLAN_CFG_ENABLE
|
||||
rt_wlan_cfg_dump();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_clear_cfg(int argc, char *argv[])
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
#ifdef RT_WLAN_CFG_ENABLE
|
||||
rt_wlan_cfg_delete_all();
|
||||
rt_wlan_cfg_cache_save();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_dump_prot(int argc, char *argv[])
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
rt_wlan_prot_dump();
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_set_mode(int argc, char *argv[])
|
||||
{
|
||||
rt_wlan_mode_t mode;
|
||||
|
||||
if (argc != 3)
|
||||
return -1;
|
||||
|
||||
if (rt_strcmp("sta", argv[1]) == 0)
|
||||
{
|
||||
mode = RT_WLAN_STATION;
|
||||
}
|
||||
else if (rt_strcmp("ap", argv[1]) == 0)
|
||||
{
|
||||
mode = RT_WLAN_AP;
|
||||
}
|
||||
else if (rt_strcmp("none", argv[1]) == 0)
|
||||
{
|
||||
mode = RT_WLAN_NONE;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
|
||||
rt_wlan_set_mode(argv[2], mode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_set_prot(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 3)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
rt_wlan_prot_attach(argv[2], argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug_set_autoconnect(int argc, char *argv[])
|
||||
{
|
||||
if (argc == 2)
|
||||
{
|
||||
if (rt_strcmp(argv[1], "enable") == 0)
|
||||
rt_wlan_config_autoreconnect(RT_TRUE);
|
||||
else if (rt_strcmp(argv[1], "disable") == 0)
|
||||
rt_wlan_config_autoreconnect(RT_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_debug(int argc, char *argv[])
|
||||
{
|
||||
int i, result = 0;
|
||||
const struct wifi_cmd_des *run_cmd = RT_NULL;
|
||||
|
||||
if (argc < 3)
|
||||
{
|
||||
wifi_debug_help(0, RT_NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(debug_tab) / sizeof(debug_tab[0]); i++)
|
||||
{
|
||||
if (rt_strcmp(debug_tab[i].cmd, argv[2]) == 0)
|
||||
{
|
||||
run_cmd = &debug_tab[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (run_cmd == RT_NULL)
|
||||
{
|
||||
wifi_debug_help(0, RT_NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (run_cmd->fun != RT_NULL)
|
||||
{
|
||||
result = run_cmd->fun(argc - 2, &argv[2]);
|
||||
}
|
||||
|
||||
if (result)
|
||||
{
|
||||
wifi_debug_help(argc - 2, &argv[2]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int wifi_msh(int argc, char *argv[])
|
||||
{
|
||||
int i, result = 0;
|
||||
const struct wifi_cmd_des *run_cmd = RT_NULL;
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
wifi_help(argc, argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find fun */
|
||||
for (i = 0; i < sizeof(cmd_tab) / sizeof(cmd_tab[0]); i++)
|
||||
{
|
||||
if (rt_strcmp(cmd_tab[i].cmd, argv[1]) == 0)
|
||||
{
|
||||
run_cmd = &cmd_tab[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* not find fun, print help */
|
||||
if (run_cmd == RT_NULL)
|
||||
{
|
||||
wifi_help(argc, argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* run fun */
|
||||
if (run_cmd->fun != RT_NULL)
|
||||
{
|
||||
result = run_cmd->fun(argc, argv);
|
||||
}
|
||||
|
||||
if (result)
|
||||
{
|
||||
wifi_help(argc, argv);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(RT_USING_FINSH)
|
||||
MSH_CMD_EXPORT_ALIAS(wifi_msh, wifi, wifi command);
|
||||
#endif
|
||||
|
||||
#endif
|
976
components/drivers/wlan/wlan_dev.c
Normal file
976
components/drivers/wlan/wlan_dev.c
Normal file
|
@ -0,0 +1,976 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-03 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <wlan_dev.h>
|
||||
#include <wlan_prot.h>
|
||||
|
||||
#define DBG_TAG "WLAN.dev"
|
||||
#ifdef RT_WLAN_DEV_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_WLAN_DEV_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
#if defined(RT_USING_WIFI) || defined(RT_USING_WLAN)
|
||||
|
||||
#ifndef RT_DEVICE
|
||||
#define RT_DEVICE(__device) ((rt_device_t)__device)
|
||||
#endif
|
||||
|
||||
#define WLAN_DEV_LOCK(_wlan) (rt_mutex_take(&(_wlan)->lock, RT_WAITING_FOREVER))
|
||||
#define WLAN_DEV_UNLOCK(_wlan) (rt_mutex_release(&(_wlan)->lock))
|
||||
|
||||
#if RT_WLAN_SSID_MAX_LENGTH < 1
|
||||
#error "SSID length is too short"
|
||||
#endif
|
||||
|
||||
#if RT_WLAN_BSSID_MAX_LENGTH < 1
|
||||
#error "BSSID length is too short"
|
||||
#endif
|
||||
|
||||
#if RT_WLAN_PASSWORD_MAX_LENGTH < 1
|
||||
#error "password length is too short"
|
||||
#endif
|
||||
|
||||
#if RT_WLAN_DEV_EVENT_NUM < 2
|
||||
#error "dev num Too little"
|
||||
#endif
|
||||
|
||||
rt_err_t rt_wlan_dev_init(struct rt_wlan_device *device, rt_wlan_mode_t mode)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
/* init wlan device */
|
||||
LOG_D("F:%s L:%d is run device:0x%08x mode:%d", __FUNCTION__, __LINE__, device, mode);
|
||||
if ((device == RT_NULL) || (mode >= RT_WLAN_MODE_MAX))
|
||||
{
|
||||
LOG_E("F:%s L:%d Parameter Wrongful device:0x%08x mode:%d", __FUNCTION__, __LINE__, device, mode);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if (mode == RT_WLAN_AP && device->flags & RT_WLAN_FLAG_STA_ONLY)
|
||||
{
|
||||
LOG_E("F:%s L:%d This wlan device can only be set to sta mode!", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
else if (mode == RT_WLAN_STATION && device->flags & RT_WLAN_FLAG_AP_ONLY)
|
||||
{
|
||||
LOG_E("F:%s L:%d This wlan device can only be set to ap mode!", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
result = rt_device_init(RT_DEVICE(device));
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_E("L:%d wlan init failed", __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_MODE, (void *)&mode);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_E("L:%d wlan config mode failed", __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
device->mode = mode;
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
struct rt_sta_info sta_info;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (info == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if ((password_len > RT_WLAN_PASSWORD_MAX_LENGTH) ||
|
||||
(info->ssid.len > RT_WLAN_SSID_MAX_LENGTH))
|
||||
{
|
||||
LOG_E("L:%d password or ssid is too long", __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
rt_memset(&sta_info, 0, sizeof(struct rt_sta_info));
|
||||
rt_memcpy(&sta_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
|
||||
rt_memcpy(sta_info.bssid, info->bssid, RT_WLAN_BSSID_MAX_LENGTH);
|
||||
if (password != RT_NULL)
|
||||
{
|
||||
rt_memcpy(sta_info.key.val, password, password_len);
|
||||
sta_info.key.len = password_len;
|
||||
}
|
||||
sta_info.channel = info->channel;
|
||||
sta_info.security = info->security;
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_JOIN, &sta_info);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_fast_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
struct rt_wlan_buff buff;
|
||||
|
||||
int len = 0;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (info == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if ((password_len > RT_WLAN_PASSWORD_MAX_LENGTH) ||
|
||||
(info->ssid.len > RT_WLAN_SSID_MAX_LENGTH))
|
||||
{
|
||||
LOG_E("L:%d password or ssid is too long", __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
buff.len = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_FAST_CONNECT_INFO, buff.data);
|
||||
if(buff.len < 0)
|
||||
{
|
||||
LOG_D("L:%d Can't get fast connect info", __LINE__);
|
||||
return buff.len;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_FAST_CONNECT, &buff);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_disconnect(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_DISCONNECT, RT_NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
struct rt_ap_info ap_info;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (info == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if ((password_len > RT_WLAN_PASSWORD_MAX_LENGTH) ||
|
||||
(info->ssid.len > RT_WLAN_SSID_MAX_LENGTH))
|
||||
{
|
||||
LOG_E("L:%d password or ssid is too long", __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_memset(&ap_info, 0, sizeof(struct rt_ap_info));
|
||||
rt_memcpy(&ap_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
|
||||
if (password != RT_NULL)
|
||||
{
|
||||
rt_memcpy(ap_info.key.val, password, password_len);
|
||||
}
|
||||
ap_info.key.len = password_len;
|
||||
ap_info.hidden = info->hidden;
|
||||
ap_info.channel = info->channel;
|
||||
ap_info.security = info->security;
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SOFTAP, &ap_info);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_AP_STOP, RT_NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_ap_deauth(struct rt_wlan_device *device, rt_uint8_t mac[6])
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_AP_DEAUTH, mac);
|
||||
return result;
|
||||
}
|
||||
|
||||
int rt_wlan_dev_get_rssi(struct rt_wlan_device *device)
|
||||
{
|
||||
int rssi = 0;
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
rt_set_errno(-RT_EIO);
|
||||
return 0;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_RSSI, &rssi);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_set_errno(result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return rssi;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_MAC, &mac[0]);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_MAC, &mac[0]);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_POWERSAVE, &level);
|
||||
return result;
|
||||
}
|
||||
|
||||
int rt_wlan_dev_get_powersave(struct rt_wlan_device *device)
|
||||
{
|
||||
int level = -1;
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
rt_set_errno(-RT_EIO);
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_POWERSAVE, &level);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_set_errno(result);
|
||||
}
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_register_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler, void *parameter)
|
||||
{
|
||||
int i = 0;
|
||||
rt_base_t level;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (event >= RT_WLAN_DEV_EVT_MAX)
|
||||
{
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
|
||||
{
|
||||
if (device->handler_table[event][i].handler == RT_NULL)
|
||||
{
|
||||
device->handler_table[event][i].handler = handler;
|
||||
device->handler_table[event][i].parameter = parameter;
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
/* No space found */
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler)
|
||||
{
|
||||
int i = 0;
|
||||
rt_base_t level;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (event >= RT_WLAN_DEV_EVT_MAX)
|
||||
{
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
|
||||
{
|
||||
if (device->handler_table[event][i].handler == handler)
|
||||
{
|
||||
rt_memset(&device->handler_table[event][i], 0, sizeof(struct rt_wlan_dev_event_desc));
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
/* not find iteam */
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff)
|
||||
{
|
||||
void *parameter[RT_WLAN_DEV_EVENT_NUM];
|
||||
rt_wlan_dev_event_handler handler[RT_WLAN_DEV_EVENT_NUM];
|
||||
int i;
|
||||
rt_base_t level;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (event >= RT_WLAN_DEV_EVT_MAX)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* get callback handle */
|
||||
level = rt_hw_interrupt_disable();
|
||||
for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
|
||||
{
|
||||
handler[i] = device->handler_table[event][i].handler;
|
||||
parameter[i] = device->handler_table[event][i].parameter;
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
/* run callback */
|
||||
for (i = 0; i < RT_WLAN_DEV_EVENT_NUM; i++)
|
||||
{
|
||||
if (handler[i] != RT_NULL)
|
||||
{
|
||||
handler[i](device, event, buff, parameter[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
int enable = 1;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_PROMISC, &enable);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
int enable = 0;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_PROMISC, &enable);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
|
||||
{
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
device->pormisc_callback = callback;
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len)
|
||||
{
|
||||
rt_wlan_pormisc_callback_t callback;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
callback = device->pormisc_callback;
|
||||
|
||||
if (callback != RT_NULL)
|
||||
{
|
||||
callback(device, data, len);
|
||||
}
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_cfg_filter(struct rt_wlan_device *device, struct rt_wlan_filter *filter)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (filter == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_FILTER, filter);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_channel(struct rt_wlan_device *device, int channel)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
if (channel < 0)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_CHANNEL, &channel);
|
||||
return result;
|
||||
}
|
||||
|
||||
int rt_wlan_dev_get_channel(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
int channel = -1;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
rt_set_errno(-RT_EIO);
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_CHANNEL, &channel);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_set_errno(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return channel;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_country(struct rt_wlan_device *device, rt_country_code_t country_code)
|
||||
{
|
||||
int result = RT_EOK;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_COUNTRY, &country_code);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_country_code_t rt_wlan_dev_get_country(struct rt_wlan_device *device)
|
||||
{
|
||||
int result = RT_EOK;
|
||||
rt_country_code_t country_code = RT_COUNTRY_UNKNOWN;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
rt_set_errno(-RT_EIO);
|
||||
return RT_COUNTRY_UNKNOWN;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_COUNTRY, &country_code);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
rt_set_errno(result);
|
||||
return RT_COUNTRY_UNKNOWN;
|
||||
}
|
||||
|
||||
return country_code;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_scan(struct rt_wlan_device *device, struct rt_wlan_info *info)
|
||||
{
|
||||
struct rt_scan_info scan_info = { 0 };
|
||||
struct rt_scan_info *p_scan_info = RT_NULL;
|
||||
rt_err_t result = 0;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
if (info != RT_NULL)
|
||||
{
|
||||
if (info->ssid.len > RT_WLAN_SSID_MAX_LENGTH)
|
||||
{
|
||||
LOG_E("L:%d ssid is too long", __LINE__);
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
rt_memcpy(&scan_info.ssid, &info->ssid, sizeof(rt_wlan_ssid_t));
|
||||
rt_memcpy(scan_info.bssid, info->bssid, RT_WLAN_BSSID_MAX_LENGTH);
|
||||
if (info->channel > 0)
|
||||
{
|
||||
scan_info.channel_min = info->channel;
|
||||
scan_info.channel_max = info->channel;
|
||||
}
|
||||
else
|
||||
{
|
||||
scan_info.channel_min = -1;
|
||||
scan_info.channel_max = -1;
|
||||
}
|
||||
scan_info.passive = info->hidden ? RT_TRUE : RT_FALSE;
|
||||
p_scan_info = &scan_info;
|
||||
}
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SCAN, p_scan_info);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_scan_stop(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = 0;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SCAN_STOP, RT_NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int len)
|
||||
{
|
||||
#ifdef RT_WLAN_PROT_ENABLE
|
||||
return rt_wlan_dev_transfer_prot(device, buff, len);
|
||||
#else
|
||||
return -RT_ERROR;
|
||||
#endif
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_enter_mgnt_filter(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
int enable = 1;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_MGNT_FILTER, &enable);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_exit_mgnt_filter(struct rt_wlan_device *device)
|
||||
{
|
||||
rt_err_t result = RT_EOK;
|
||||
int enable = 0;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_CFG_MGNT_FILTER, &enable);
|
||||
return result;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_set_mgnt_filter_callback(struct rt_wlan_device *device, rt_wlan_mgnt_filter_callback_t callback)
|
||||
{
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
device->mgnt_filter_callback = callback;
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
void rt_wlan_dev_mgnt_filter_handler(struct rt_wlan_device *device, void *data, int len)
|
||||
{
|
||||
rt_wlan_mgnt_filter_callback_t callback;
|
||||
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
callback = device->mgnt_filter_callback;
|
||||
|
||||
if (callback != RT_NULL)
|
||||
{
|
||||
callback(device, data, len);
|
||||
}
|
||||
}
|
||||
|
||||
int rt_wlan_dev_send_raw_frame(struct rt_wlan_device *device, void *buff, int len)
|
||||
{
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
return -RT_EIO;
|
||||
}
|
||||
|
||||
if (device->ops->wlan_send_raw_frame)
|
||||
{
|
||||
return device->ops->wlan_send_raw_frame(device, buff, len);
|
||||
}
|
||||
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
static rt_err_t _rt_wlan_dev_init(rt_device_t dev)
|
||||
{
|
||||
struct rt_wlan_device *wlan = (struct rt_wlan_device *)dev;
|
||||
rt_err_t result = RT_EOK;
|
||||
|
||||
rt_mutex_init(&wlan->lock, "wlan_dev", RT_IPC_FLAG_PRIO);
|
||||
|
||||
if (wlan->ops->wlan_init)
|
||||
result = wlan->ops->wlan_init(wlan);
|
||||
|
||||
if (result == RT_EOK)
|
||||
{
|
||||
LOG_I("wlan init success");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_I("wlan init failed");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args)
|
||||
{
|
||||
struct rt_wlan_device *wlan = (struct rt_wlan_device *)dev;
|
||||
rt_err_t err = RT_EOK;
|
||||
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
|
||||
WLAN_DEV_LOCK(wlan);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case RT_WLAN_CMD_MODE:
|
||||
{
|
||||
rt_wlan_mode_t mode = *((rt_wlan_mode_t *)args);
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_MODE, "RT_WLAN_CMD_MODE");
|
||||
if (wlan->ops->wlan_mode)
|
||||
err = wlan->ops->wlan_mode(wlan, mode);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SCAN:
|
||||
{
|
||||
struct rt_scan_info *scan_info = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SCAN, "RT_WLAN_CMD_SCAN");
|
||||
if (wlan->ops->wlan_scan)
|
||||
err = wlan->ops->wlan_scan(wlan, scan_info);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_JOIN:
|
||||
{
|
||||
struct rt_sta_info *sta_info = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_JOIN, "RT_WLAN_CMD_JOIN");
|
||||
if (wlan->ops->wlan_join)
|
||||
err = wlan->ops->wlan_join(wlan, sta_info);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SOFTAP:
|
||||
{
|
||||
struct rt_ap_info *ap_info = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SOFTAP, "RT_WLAN_CMD_SOFTAP");
|
||||
if (wlan->ops->wlan_softap)
|
||||
err = wlan->ops->wlan_softap(wlan, ap_info);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_DISCONNECT:
|
||||
{
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_DISCONNECT, "RT_WLAN_CMD_DISCONNECT");
|
||||
if (wlan->ops->wlan_disconnect)
|
||||
err = wlan->ops->wlan_disconnect(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_AP_STOP:
|
||||
{
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_AP_STOP, "RT_WLAN_CMD_AP_STOP");
|
||||
if (wlan->ops->wlan_ap_stop)
|
||||
err = wlan->ops->wlan_ap_stop(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_AP_DEAUTH:
|
||||
{
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_AP_DEAUTH, "RT_WLAN_CMD_AP_DEAUTH");
|
||||
if (wlan->ops->wlan_ap_deauth)
|
||||
err = wlan->ops->wlan_ap_deauth(wlan, args);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SCAN_STOP:
|
||||
{
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SCAN_STOP, "RT_WLAN_CMD_SCAN_STOP");
|
||||
if (wlan->ops->wlan_scan_stop)
|
||||
err = wlan->ops->wlan_scan_stop(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_RSSI:
|
||||
{
|
||||
int *rssi = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_RSSI, "RT_WLAN_CMD_GET_RSSI");
|
||||
if (wlan->ops->wlan_get_rssi)
|
||||
*rssi = wlan->ops->wlan_get_rssi(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SET_POWERSAVE:
|
||||
{
|
||||
int level = *((int *)args);
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_POWERSAVE, "RT_WLAN_CMD_SET_POWERSAVE");
|
||||
if (wlan->ops->wlan_set_powersave)
|
||||
err = wlan->ops->wlan_set_powersave(wlan, level);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_POWERSAVE:
|
||||
{
|
||||
int *level = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_POWERSAVE, "RT_WLAN_CMD_GET_POWERSAVE");
|
||||
if (wlan->ops->wlan_get_powersave)
|
||||
*level = wlan->ops->wlan_get_powersave(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_CFG_PROMISC:
|
||||
{
|
||||
rt_bool_t start = *((rt_bool_t *)args);
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_CFG_PROMISC, "RT_WLAN_CMD_CFG_PROMISC");
|
||||
if (wlan->ops->wlan_cfg_promisc)
|
||||
err = wlan->ops->wlan_cfg_promisc(wlan, start);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_CFG_FILTER:
|
||||
{
|
||||
struct rt_wlan_filter *filter = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_CFG_FILTER, "RT_WLAN_CMD_CFG_FILTER");
|
||||
if (wlan->ops->wlan_cfg_filter)
|
||||
err = wlan->ops->wlan_cfg_filter(wlan, filter);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_CFG_MGNT_FILTER:
|
||||
{
|
||||
rt_bool_t start = *((rt_bool_t *)args);
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_CFG_MGNT_FILTER, "RT_WLAN_CMD_CFG_MGNT_FILTER");
|
||||
if (wlan->ops->wlan_cfg_mgnt_filter)
|
||||
err = wlan->ops->wlan_cfg_mgnt_filter(wlan, start);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SET_CHANNEL:
|
||||
{
|
||||
int channel = *(int *)args;
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_CHANNEL, "RT_WLAN_CMD_SET_CHANNEL");
|
||||
if (wlan->ops->wlan_set_channel)
|
||||
err = wlan->ops->wlan_set_channel(wlan, channel);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_CHANNEL:
|
||||
{
|
||||
int *channel = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_CHANNEL, "RT_WLAN_CMD_GET_CHANNEL");
|
||||
if (wlan->ops->wlan_get_channel)
|
||||
*channel = wlan->ops->wlan_get_channel(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SET_COUNTRY:
|
||||
{
|
||||
rt_country_code_t country = *(rt_country_code_t *)args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_COUNTRY, "RT_WLAN_CMD_SET_COUNTRY");
|
||||
if (wlan->ops->wlan_set_country)
|
||||
err = wlan->ops->wlan_set_country(wlan, country);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_COUNTRY:
|
||||
{
|
||||
rt_country_code_t *country = args;
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_COUNTRY, "RT_WLAN_CMD_GET_COUNTRY");
|
||||
if (wlan->ops->wlan_get_country)
|
||||
*country = wlan->ops->wlan_get_country(wlan);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_SET_MAC:
|
||||
{
|
||||
rt_uint8_t *mac = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_SET_MAC, "RT_WLAN_CMD_SET_MAC");
|
||||
if (wlan->ops->wlan_set_mac)
|
||||
err = wlan->ops->wlan_set_mac(wlan, mac);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_MAC:
|
||||
{
|
||||
rt_uint8_t *mac = args;
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_MAC, "RT_WLAN_CMD_GET_MAC");
|
||||
if (wlan->ops->wlan_get_mac)
|
||||
err = wlan->ops->wlan_get_mac(wlan, mac);
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_GET_FAST_CONNECT_INFO:
|
||||
{
|
||||
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_FAST_INFO, "RT_WLAN_CMD_GET_FAST_INFO");
|
||||
if (wlan->ops->wlan_get_fast_info)
|
||||
{
|
||||
err = wlan->ops->wlan_get_fast_info(args);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_EEMPTY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_CMD_FAST_CONNECT:
|
||||
{
|
||||
struct rt_wlan_buff *buff = (struct rt_wlan_buff *)args;
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_FAST_CONNECT, "RT_WLAN_CMD_FAST_CONNECT");
|
||||
if (wlan->ops->wlan_get_fast_info)
|
||||
{
|
||||
err = wlan->ops->wlan_fast_connect(buff->data,buff->len);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_EEMPTY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, -1, "UNKUOWN");
|
||||
break;
|
||||
}
|
||||
|
||||
WLAN_DEV_UNLOCK(wlan);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
const static struct rt_device_ops wlan_ops =
|
||||
{
|
||||
_rt_wlan_dev_init,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
_rt_wlan_dev_control
|
||||
};
|
||||
#endif
|
||||
|
||||
rt_err_t rt_wlan_dev_register(struct rt_wlan_device *wlan, const char *name, const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data)
|
||||
{
|
||||
rt_err_t err = RT_EOK;
|
||||
|
||||
if ((wlan == RT_NULL) || (name == RT_NULL) || (ops == RT_NULL) ||
|
||||
(flag & RT_WLAN_FLAG_STA_ONLY && flag & RT_WLAN_FLAG_AP_ONLY))
|
||||
{
|
||||
LOG_E("F:%s L:%d parameter Wrongful", __FUNCTION__, __LINE__);
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
rt_memset(wlan, 0, sizeof(struct rt_wlan_device));
|
||||
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
wlan->device.ops = &wlan_ops;
|
||||
#else
|
||||
wlan->device.init = _rt_wlan_dev_init;
|
||||
wlan->device.open = RT_NULL;
|
||||
wlan->device.close = RT_NULL;
|
||||
wlan->device.read = RT_NULL;
|
||||
wlan->device.write = RT_NULL;
|
||||
wlan->device.control = _rt_wlan_dev_control;
|
||||
#endif
|
||||
|
||||
wlan->device.user_data = RT_NULL;
|
||||
|
||||
wlan->device.type = RT_Device_Class_NetIf;
|
||||
|
||||
wlan->ops = ops;
|
||||
wlan->user_data = user_data;
|
||||
|
||||
wlan->flags = flag;
|
||||
err = rt_device_register(&wlan->device, name, RT_DEVICE_FLAG_RDWR);
|
||||
|
||||
LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
604
components/drivers/wlan/wlan_dev.h
Normal file
604
components/drivers/wlan/wlan_dev.h
Normal file
|
@ -0,0 +1,604 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-03 tyx the first version
|
||||
*/
|
||||
|
||||
#ifndef __WLAN_DEVICE_H__
|
||||
#define __WLAN_DEVICE_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_WLAN_NONE,
|
||||
RT_WLAN_STATION,
|
||||
RT_WLAN_AP,
|
||||
RT_WLAN_MODE_MAX
|
||||
} rt_wlan_mode_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_WLAN_CMD_MODE = 0x10,
|
||||
RT_WLAN_CMD_SCAN, /* trigger scanning (list cells) */
|
||||
RT_WLAN_CMD_JOIN,
|
||||
RT_WLAN_CMD_SOFTAP, /* start soft-AP */
|
||||
RT_WLAN_CMD_DISCONNECT,
|
||||
RT_WLAN_CMD_AP_STOP, /* stop soft-AP */
|
||||
RT_WLAN_CMD_AP_DEAUTH,
|
||||
RT_WLAN_CMD_SCAN_STOP,
|
||||
RT_WLAN_CMD_GET_RSSI, /* get sensitivity (dBm) */
|
||||
RT_WLAN_CMD_SET_POWERSAVE,
|
||||
RT_WLAN_CMD_GET_POWERSAVE,
|
||||
RT_WLAN_CMD_CFG_PROMISC, /* start/stop minitor */
|
||||
RT_WLAN_CMD_CFG_FILTER, /* start/stop frame filter */
|
||||
RT_WLAN_CMD_CFG_MGNT_FILTER, /* start/stop management frame filter */
|
||||
RT_WLAN_CMD_SET_CHANNEL,
|
||||
RT_WLAN_CMD_GET_CHANNEL,
|
||||
RT_WLAN_CMD_SET_COUNTRY,
|
||||
RT_WLAN_CMD_GET_COUNTRY,
|
||||
RT_WLAN_CMD_SET_MAC,
|
||||
RT_WLAN_CMD_GET_MAC,
|
||||
RT_WLAN_CMD_GET_FAST_CONNECT_INFO,
|
||||
RT_WLAN_CMD_FAST_CONNECT,
|
||||
} rt_wlan_cmd_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_WLAN_DEV_EVT_INIT_DONE = 0,
|
||||
RT_WLAN_DEV_EVT_CONNECT,
|
||||
RT_WLAN_DEV_EVT_CONNECT_FAIL,
|
||||
RT_WLAN_DEV_EVT_DISCONNECT,
|
||||
RT_WLAN_DEV_EVT_AP_START,
|
||||
RT_WLAN_DEV_EVT_AP_STOP,
|
||||
RT_WLAN_DEV_EVT_AP_ASSOCIATED,
|
||||
RT_WLAN_DEV_EVT_AP_DISASSOCIATED,
|
||||
RT_WLAN_DEV_EVT_AP_ASSOCIATE_FAILED,
|
||||
RT_WLAN_DEV_EVT_SCAN_REPORT,
|
||||
RT_WLAN_DEV_EVT_SCAN_DONE,
|
||||
RT_WLAN_DEV_EVT_MAX,
|
||||
} rt_wlan_dev_event_t;
|
||||
|
||||
#define SHARED_ENABLED 0x00008000
|
||||
#define WPA_SECURITY 0x00200000
|
||||
#define WPA2_SECURITY 0x00400000
|
||||
#define WPS_ENABLED 0x10000000
|
||||
#define WEP_ENABLED 0x0001
|
||||
#define TKIP_ENABLED 0x0002
|
||||
#define AES_ENABLED 0x0004
|
||||
#define WSEC_SWFLAG 0x0008
|
||||
|
||||
#define RT_WLAN_FLAG_STA_ONLY (0x1 << 0)
|
||||
#define RT_WLAN_FLAG_AP_ONLY (0x1 << 1)
|
||||
|
||||
#ifndef RT_WLAN_SSID_MAX_LENGTH
|
||||
#define RT_WLAN_SSID_MAX_LENGTH (32) /* SSID MAX LEN */
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_BSSID_MAX_LENGTH
|
||||
#define RT_WLAN_BSSID_MAX_LENGTH (6) /* BSSID MAX LEN (default is 6) */
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_PASSWORD_MAX_LENGTH
|
||||
#define RT_WLAN_PASSWORD_MAX_LENGTH (32) /* PASSWORD MAX LEN*/
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_DEV_EVENT_NUM
|
||||
#define RT_WLAN_DEV_EVENT_NUM (2) /* EVENT GROUP MAX NUM */
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Enumeration of Wi-Fi security modes
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
SECURITY_OPEN = 0, /* Open security */
|
||||
SECURITY_WEP_PSK = WEP_ENABLED, /* WEP Security with open authentication */
|
||||
SECURITY_WEP_SHARED = (WEP_ENABLED | SHARED_ENABLED), /* WEP Security with shared authentication */
|
||||
SECURITY_WPA_TKIP_PSK = (WPA_SECURITY | TKIP_ENABLED), /* WPA Security with TKIP */
|
||||
SECURITY_WPA_AES_PSK = (WPA_SECURITY | AES_ENABLED), /* WPA Security with AES */
|
||||
SECURITY_WPA2_AES_PSK = (WPA2_SECURITY | AES_ENABLED), /* WPA2 Security with AES */
|
||||
SECURITY_WPA2_TKIP_PSK = (WPA2_SECURITY | TKIP_ENABLED), /* WPA2 Security with TKIP */
|
||||
SECURITY_WPA2_MIXED_PSK = (WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED), /* WPA2 Security with AES & TKIP */
|
||||
SECURITY_WPS_OPEN = WPS_ENABLED, /* WPS with open security */
|
||||
SECURITY_WPS_SECURE = (WPS_ENABLED | AES_ENABLED), /* WPS with AES security */
|
||||
SECURITY_UNKNOWN = -1, /* May be returned by scan function if security is unknown.
|
||||
Do not pass this to the join function! */
|
||||
} rt_wlan_security_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_802_11_BAND_5GHZ = 0, /* Denotes 5GHz radio band */
|
||||
RT_802_11_BAND_2_4GHZ = 1, /* Denotes 2.4GHz radio band */
|
||||
RT_802_11_BAND_UNKNOWN = 0x7fffffff, /* unknown */
|
||||
} rt_802_11_band_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_COUNTRY_AFGHANISTAN,
|
||||
RT_COUNTRY_ALBANIA,
|
||||
RT_COUNTRY_ALGERIA,
|
||||
RT_COUNTRY_AMERICAN_SAMOA,
|
||||
RT_COUNTRY_ANGOLA,
|
||||
RT_COUNTRY_ANGUILLA,
|
||||
RT_COUNTRY_ANTIGUA_AND_BARBUDA,
|
||||
RT_COUNTRY_ARGENTINA,
|
||||
RT_COUNTRY_ARMENIA,
|
||||
RT_COUNTRY_ARUBA,
|
||||
RT_COUNTRY_AUSTRALIA,
|
||||
RT_COUNTRY_AUSTRIA,
|
||||
RT_COUNTRY_AZERBAIJAN,
|
||||
RT_COUNTRY_BAHAMAS,
|
||||
RT_COUNTRY_BAHRAIN,
|
||||
RT_COUNTRY_BAKER_ISLAND,
|
||||
RT_COUNTRY_BANGLADESH,
|
||||
RT_COUNTRY_BARBADOS,
|
||||
RT_COUNTRY_BELARUS,
|
||||
RT_COUNTRY_BELGIUM,
|
||||
RT_COUNTRY_BELIZE,
|
||||
RT_COUNTRY_BENIN,
|
||||
RT_COUNTRY_BERMUDA,
|
||||
RT_COUNTRY_BHUTAN,
|
||||
RT_COUNTRY_BOLIVIA,
|
||||
RT_COUNTRY_BOSNIA_AND_HERZEGOVINA,
|
||||
RT_COUNTRY_BOTSWANA,
|
||||
RT_COUNTRY_BRAZIL,
|
||||
RT_COUNTRY_BRITISH_INDIAN_OCEAN_TERRITORY,
|
||||
RT_COUNTRY_BRUNEI_DARUSSALAM,
|
||||
RT_COUNTRY_BULGARIA,
|
||||
RT_COUNTRY_BURKINA_FASO,
|
||||
RT_COUNTRY_BURUNDI,
|
||||
RT_COUNTRY_CAMBODIA,
|
||||
RT_COUNTRY_CAMEROON,
|
||||
RT_COUNTRY_CANADA,
|
||||
RT_COUNTRY_CAPE_VERDE,
|
||||
RT_COUNTRY_CAYMAN_ISLANDS,
|
||||
RT_COUNTRY_CENTRAL_AFRICAN_REPUBLIC,
|
||||
RT_COUNTRY_CHAD,
|
||||
RT_COUNTRY_CHILE,
|
||||
RT_COUNTRY_CHINA,
|
||||
RT_COUNTRY_CHRISTMAS_ISLAND,
|
||||
RT_COUNTRY_COLOMBIA,
|
||||
RT_COUNTRY_COMOROS,
|
||||
RT_COUNTRY_CONGO,
|
||||
RT_COUNTRY_CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE,
|
||||
RT_COUNTRY_COSTA_RICA,
|
||||
RT_COUNTRY_COTE_DIVOIRE,
|
||||
RT_COUNTRY_CROATIA,
|
||||
RT_COUNTRY_CUBA,
|
||||
RT_COUNTRY_CYPRUS,
|
||||
RT_COUNTRY_CZECH_REPUBLIC,
|
||||
RT_COUNTRY_DENMARK,
|
||||
RT_COUNTRY_DJIBOUTI,
|
||||
RT_COUNTRY_DOMINICA,
|
||||
RT_COUNTRY_DOMINICAN_REPUBLIC,
|
||||
RT_COUNTRY_DOWN_UNDER,
|
||||
RT_COUNTRY_ECUADOR,
|
||||
RT_COUNTRY_EGYPT,
|
||||
RT_COUNTRY_EL_SALVADOR,
|
||||
RT_COUNTRY_EQUATORIAL_GUINEA,
|
||||
RT_COUNTRY_ERITREA,
|
||||
RT_COUNTRY_ESTONIA,
|
||||
RT_COUNTRY_ETHIOPIA,
|
||||
RT_COUNTRY_FALKLAND_ISLANDS_MALVINAS,
|
||||
RT_COUNTRY_FAROE_ISLANDS,
|
||||
RT_COUNTRY_FIJI,
|
||||
RT_COUNTRY_FINLAND,
|
||||
RT_COUNTRY_FRANCE,
|
||||
RT_COUNTRY_FRENCH_GUINA,
|
||||
RT_COUNTRY_FRENCH_POLYNESIA,
|
||||
RT_COUNTRY_FRENCH_SOUTHERN_TERRITORIES,
|
||||
RT_COUNTRY_GABON,
|
||||
RT_COUNTRY_GAMBIA,
|
||||
RT_COUNTRY_GEORGIA,
|
||||
RT_COUNTRY_GERMANY,
|
||||
RT_COUNTRY_GHANA,
|
||||
RT_COUNTRY_GIBRALTAR,
|
||||
RT_COUNTRY_GREECE,
|
||||
RT_COUNTRY_GRENADA,
|
||||
RT_COUNTRY_GUADELOUPE,
|
||||
RT_COUNTRY_GUAM,
|
||||
RT_COUNTRY_GUATEMALA,
|
||||
RT_COUNTRY_GUERNSEY,
|
||||
RT_COUNTRY_GUINEA,
|
||||
RT_COUNTRY_GUINEA_BISSAU,
|
||||
RT_COUNTRY_GUYANA,
|
||||
RT_COUNTRY_HAITI,
|
||||
RT_COUNTRY_HOLY_SEE_VATICAN_CITY_STATE,
|
||||
RT_COUNTRY_HONDURAS,
|
||||
RT_COUNTRY_HONG_KONG,
|
||||
RT_COUNTRY_HUNGARY,
|
||||
RT_COUNTRY_ICELAND,
|
||||
RT_COUNTRY_INDIA,
|
||||
RT_COUNTRY_INDONESIA,
|
||||
RT_COUNTRY_IRAN_ISLAMIC_REPUBLIC_OF,
|
||||
RT_COUNTRY_IRAQ,
|
||||
RT_COUNTRY_IRELAND,
|
||||
RT_COUNTRY_ISRAEL,
|
||||
RT_COUNTRY_ITALY,
|
||||
RT_COUNTRY_JAMAICA,
|
||||
RT_COUNTRY_JAPAN,
|
||||
RT_COUNTRY_JERSEY,
|
||||
RT_COUNTRY_JORDAN,
|
||||
RT_COUNTRY_KAZAKHSTAN,
|
||||
RT_COUNTRY_KENYA,
|
||||
RT_COUNTRY_KIRIBATI,
|
||||
RT_COUNTRY_KOREA_REPUBLIC_OF,
|
||||
RT_COUNTRY_KOSOVO,
|
||||
RT_COUNTRY_KUWAIT,
|
||||
RT_COUNTRY_KYRGYZSTAN,
|
||||
RT_COUNTRY_LAO_PEOPLES_DEMOCRATIC_REPUBIC,
|
||||
RT_COUNTRY_LATVIA,
|
||||
RT_COUNTRY_LEBANON,
|
||||
RT_COUNTRY_LESOTHO,
|
||||
RT_COUNTRY_LIBERIA,
|
||||
RT_COUNTRY_LIBYAN_ARAB_JAMAHIRIYA,
|
||||
RT_COUNTRY_LIECHTENSTEIN,
|
||||
RT_COUNTRY_LITHUANIA,
|
||||
RT_COUNTRY_LUXEMBOURG,
|
||||
RT_COUNTRY_MACAO,
|
||||
RT_COUNTRY_MACEDONIA_FORMER_YUGOSLAV_REPUBLIC_OF,
|
||||
RT_COUNTRY_MADAGASCAR,
|
||||
RT_COUNTRY_MALAWI,
|
||||
RT_COUNTRY_MALAYSIA,
|
||||
RT_COUNTRY_MALDIVES,
|
||||
RT_COUNTRY_MALI,
|
||||
RT_COUNTRY_MALTA,
|
||||
RT_COUNTRY_MAN_ISLE_OF,
|
||||
RT_COUNTRY_MARTINIQUE,
|
||||
RT_COUNTRY_MAURITANIA,
|
||||
RT_COUNTRY_MAURITIUS,
|
||||
RT_COUNTRY_MAYOTTE,
|
||||
RT_COUNTRY_MEXICO,
|
||||
RT_COUNTRY_MICRONESIA_FEDERATED_STATES_OF,
|
||||
RT_COUNTRY_MOLDOVA_REPUBLIC_OF,
|
||||
RT_COUNTRY_MONACO,
|
||||
RT_COUNTRY_MONGOLIA,
|
||||
RT_COUNTRY_MONTENEGRO,
|
||||
RT_COUNTRY_MONTSERRAT,
|
||||
RT_COUNTRY_MOROCCO,
|
||||
RT_COUNTRY_MOZAMBIQUE,
|
||||
RT_COUNTRY_MYANMAR,
|
||||
RT_COUNTRY_NAMIBIA,
|
||||
RT_COUNTRY_NAURU,
|
||||
RT_COUNTRY_NEPAL,
|
||||
RT_COUNTRY_NETHERLANDS,
|
||||
RT_COUNTRY_NETHERLANDS_ANTILLES,
|
||||
RT_COUNTRY_NEW_CALEDONIA,
|
||||
RT_COUNTRY_NEW_ZEALAND,
|
||||
RT_COUNTRY_NICARAGUA,
|
||||
RT_COUNTRY_NIGER,
|
||||
RT_COUNTRY_NIGERIA,
|
||||
RT_COUNTRY_NORFOLK_ISLAND,
|
||||
RT_COUNTRY_NORTHERN_MARIANA_ISLANDS,
|
||||
RT_COUNTRY_NORWAY,
|
||||
RT_COUNTRY_OMAN,
|
||||
RT_COUNTRY_PAKISTAN,
|
||||
RT_COUNTRY_PALAU,
|
||||
RT_COUNTRY_PANAMA,
|
||||
RT_COUNTRY_PAPUA_NEW_GUINEA,
|
||||
RT_COUNTRY_PARAGUAY,
|
||||
RT_COUNTRY_PERU,
|
||||
RT_COUNTRY_PHILIPPINES,
|
||||
RT_COUNTRY_POLAND,
|
||||
RT_COUNTRY_PORTUGAL,
|
||||
RT_COUNTRY_PUETO_RICO,
|
||||
RT_COUNTRY_QATAR,
|
||||
RT_COUNTRY_REUNION,
|
||||
RT_COUNTRY_ROMANIA,
|
||||
RT_COUNTRY_RUSSIAN_FEDERATION,
|
||||
RT_COUNTRY_RWANDA,
|
||||
RT_COUNTRY_SAINT_KITTS_AND_NEVIS,
|
||||
RT_COUNTRY_SAINT_LUCIA,
|
||||
RT_COUNTRY_SAINT_PIERRE_AND_MIQUELON,
|
||||
RT_COUNTRY_SAINT_VINCENT_AND_THE_GRENADINES,
|
||||
RT_COUNTRY_SAMOA,
|
||||
RT_COUNTRY_SANIT_MARTIN_SINT_MARTEEN,
|
||||
RT_COUNTRY_SAO_TOME_AND_PRINCIPE,
|
||||
RT_COUNTRY_SAUDI_ARABIA,
|
||||
RT_COUNTRY_SENEGAL,
|
||||
RT_COUNTRY_SERBIA,
|
||||
RT_COUNTRY_SEYCHELLES,
|
||||
RT_COUNTRY_SIERRA_LEONE,
|
||||
RT_COUNTRY_SINGAPORE,
|
||||
RT_COUNTRY_SLOVAKIA,
|
||||
RT_COUNTRY_SLOVENIA,
|
||||
RT_COUNTRY_SOLOMON_ISLANDS,
|
||||
RT_COUNTRY_SOMALIA,
|
||||
RT_COUNTRY_SOUTH_AFRICA,
|
||||
RT_COUNTRY_SPAIN,
|
||||
RT_COUNTRY_SRI_LANKA,
|
||||
RT_COUNTRY_SURINAME,
|
||||
RT_COUNTRY_SWAZILAND,
|
||||
RT_COUNTRY_SWEDEN,
|
||||
RT_COUNTRY_SWITZERLAND,
|
||||
RT_COUNTRY_SYRIAN_ARAB_REPUBLIC,
|
||||
RT_COUNTRY_TAIWAN_PROVINCE_OF_CHINA,
|
||||
RT_COUNTRY_TAJIKISTAN,
|
||||
RT_COUNTRY_TANZANIA_UNITED_REPUBLIC_OF,
|
||||
RT_COUNTRY_THAILAND,
|
||||
RT_COUNTRY_TOGO,
|
||||
RT_COUNTRY_TONGA,
|
||||
RT_COUNTRY_TRINIDAD_AND_TOBAGO,
|
||||
RT_COUNTRY_TUNISIA,
|
||||
RT_COUNTRY_TURKEY,
|
||||
RT_COUNTRY_TURKMENISTAN,
|
||||
RT_COUNTRY_TURKS_AND_CAICOS_ISLANDS,
|
||||
RT_COUNTRY_TUVALU,
|
||||
RT_COUNTRY_UGANDA,
|
||||
RT_COUNTRY_UKRAINE,
|
||||
RT_COUNTRY_UNITED_ARAB_EMIRATES,
|
||||
RT_COUNTRY_UNITED_KINGDOM,
|
||||
RT_COUNTRY_UNITED_STATES,
|
||||
RT_COUNTRY_UNITED_STATES_REV4,
|
||||
RT_COUNTRY_UNITED_STATES_NO_DFS,
|
||||
RT_COUNTRY_UNITED_STATES_MINOR_OUTLYING_ISLANDS,
|
||||
RT_COUNTRY_URUGUAY,
|
||||
RT_COUNTRY_UZBEKISTAN,
|
||||
RT_COUNTRY_VANUATU,
|
||||
RT_COUNTRY_VENEZUELA,
|
||||
RT_COUNTRY_VIET_NAM,
|
||||
RT_COUNTRY_VIRGIN_ISLANDS_BRITISH,
|
||||
RT_COUNTRY_VIRGIN_ISLANDS_US,
|
||||
RT_COUNTRY_WALLIS_AND_FUTUNA,
|
||||
RT_COUNTRY_WEST_BANK,
|
||||
RT_COUNTRY_WESTERN_SAHARA,
|
||||
RT_COUNTRY_WORLD_WIDE_XX,
|
||||
RT_COUNTRY_YEMEN,
|
||||
RT_COUNTRY_ZAMBIA,
|
||||
RT_COUNTRY_ZIMBABWE,
|
||||
RT_COUNTRY_UNKNOWN
|
||||
} rt_country_code_t;
|
||||
|
||||
struct rt_wlan_device;
|
||||
struct rt_wlan_buff;
|
||||
|
||||
typedef void (*rt_wlan_dev_event_handler)(struct rt_wlan_device *device, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff, void *parameter);
|
||||
|
||||
typedef void (*rt_wlan_pormisc_callback_t)(struct rt_wlan_device *device, void *data, int len);
|
||||
|
||||
typedef void (*rt_wlan_mgnt_filter_callback_t)(struct rt_wlan_device *device, void *data, int len);
|
||||
|
||||
struct rt_wlan_ssid
|
||||
{
|
||||
rt_uint8_t len;
|
||||
rt_uint8_t val[RT_WLAN_SSID_MAX_LENGTH + 1];
|
||||
};
|
||||
typedef struct rt_wlan_ssid rt_wlan_ssid_t;
|
||||
|
||||
struct rt_wlan_key
|
||||
{
|
||||
rt_uint8_t len;
|
||||
rt_uint8_t val[RT_WLAN_PASSWORD_MAX_LENGTH + 1];
|
||||
};
|
||||
typedef struct rt_wlan_key rt_wlan_key_t;
|
||||
|
||||
#define INVALID_INFO(_info) do { \
|
||||
rt_memset((_info), 0, sizeof(struct rt_wlan_info)); \
|
||||
(_info)->band = RT_802_11_BAND_UNKNOWN; \
|
||||
(_info)->security = SECURITY_UNKNOWN; \
|
||||
(_info)->channel = -1; \
|
||||
} while(0)
|
||||
|
||||
#define SSID_SET(_info, _ssid) do { \
|
||||
rt_strncpy((char *)(_info)->ssid.val, (_ssid), RT_WLAN_SSID_MAX_LENGTH); \
|
||||
(_info)->ssid.len = rt_strlen((char *)(_info)->ssid.val); \
|
||||
} while(0)
|
||||
|
||||
struct rt_wlan_info
|
||||
{
|
||||
/* security type */
|
||||
rt_wlan_security_t security;
|
||||
/* 2.4G/5G */
|
||||
rt_802_11_band_t band;
|
||||
/* maximal data rate */
|
||||
rt_uint32_t datarate;
|
||||
/* radio channel */
|
||||
rt_int16_t channel;
|
||||
/* signal strength */
|
||||
rt_int16_t rssi;
|
||||
/* ssid */
|
||||
rt_wlan_ssid_t ssid;
|
||||
/* hwaddr */
|
||||
rt_uint8_t bssid[RT_WLAN_BSSID_MAX_LENGTH];
|
||||
rt_uint8_t hidden;
|
||||
};
|
||||
|
||||
struct rt_wlan_buff
|
||||
{
|
||||
void *data;
|
||||
rt_int32_t len;
|
||||
};
|
||||
|
||||
struct rt_filter_pattern
|
||||
{
|
||||
rt_uint16_t offset; /* Offset in bytes to start filtering (referenced to the start of the ethernet packet) */
|
||||
rt_uint16_t mask_size; /* Size of the mask in bytes */
|
||||
rt_uint8_t *mask; /* Pattern mask bytes to be ANDed with the pattern eg. "\xff00" (must be in network byte order) */
|
||||
rt_uint8_t *pattern; /* Pattern bytes used to filter eg. "\x0800" (must be in network byte order) */
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_POSITIVE_MATCHING = 0, /* Receive the data matching with this pattern and discard the other data */
|
||||
RT_NEGATIVE_MATCHING = 1 /* Discard the data matching with this pattern and receive the other data */
|
||||
} rt_filter_rule_t;
|
||||
|
||||
struct rt_wlan_filter
|
||||
{
|
||||
struct rt_filter_pattern patt;
|
||||
rt_filter_rule_t rule;
|
||||
rt_uint8_t enable;
|
||||
};
|
||||
|
||||
struct rt_wlan_dev_event_desc
|
||||
{
|
||||
rt_wlan_dev_event_handler handler;
|
||||
void *parameter;
|
||||
};
|
||||
|
||||
struct rt_wlan_device
|
||||
{
|
||||
struct rt_device device;
|
||||
rt_wlan_mode_t mode;
|
||||
struct rt_mutex lock;
|
||||
struct rt_wlan_dev_event_desc handler_table[RT_WLAN_DEV_EVT_MAX][RT_WLAN_DEV_EVENT_NUM];
|
||||
rt_wlan_pormisc_callback_t pormisc_callback;
|
||||
rt_wlan_mgnt_filter_callback_t mgnt_filter_callback;
|
||||
const struct rt_wlan_dev_ops *ops;
|
||||
rt_uint32_t flags;
|
||||
struct netdev *netdev;
|
||||
void *prot;
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
struct rt_sta_info
|
||||
{
|
||||
rt_wlan_ssid_t ssid;
|
||||
rt_wlan_key_t key;
|
||||
rt_uint8_t bssid[6];
|
||||
rt_uint16_t channel;
|
||||
rt_wlan_security_t security;
|
||||
};
|
||||
|
||||
struct rt_ap_info
|
||||
{
|
||||
rt_wlan_ssid_t ssid;
|
||||
rt_wlan_key_t key;
|
||||
rt_bool_t hidden;
|
||||
rt_uint16_t channel;
|
||||
rt_wlan_security_t security;
|
||||
};
|
||||
|
||||
struct rt_scan_info
|
||||
{
|
||||
rt_wlan_ssid_t ssid;
|
||||
rt_uint8_t bssid[6];
|
||||
rt_int16_t channel_min;
|
||||
rt_int16_t channel_max;
|
||||
rt_bool_t passive;
|
||||
};
|
||||
|
||||
struct rt_wlan_dev_ops
|
||||
{
|
||||
rt_err_t (*wlan_init)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_mode)(struct rt_wlan_device *wlan, rt_wlan_mode_t mode);
|
||||
rt_err_t (*wlan_scan)(struct rt_wlan_device *wlan, struct rt_scan_info *scan_info);
|
||||
rt_err_t (*wlan_join)(struct rt_wlan_device *wlan, struct rt_sta_info *sta_info);
|
||||
rt_err_t (*wlan_softap)(struct rt_wlan_device *wlan, struct rt_ap_info *ap_info);
|
||||
rt_err_t (*wlan_disconnect)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_ap_stop)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_ap_deauth)(struct rt_wlan_device *wlan, rt_uint8_t mac[]);
|
||||
rt_err_t (*wlan_scan_stop)(struct rt_wlan_device *wlan);
|
||||
int (*wlan_get_rssi)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_set_powersave)(struct rt_wlan_device *wlan, int level);
|
||||
int (*wlan_get_powersave)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_cfg_promisc)(struct rt_wlan_device *wlan, rt_bool_t start);
|
||||
rt_err_t (*wlan_cfg_filter)(struct rt_wlan_device *wlan, struct rt_wlan_filter *filter);
|
||||
rt_err_t (*wlan_cfg_mgnt_filter)(struct rt_wlan_device *wlan, rt_bool_t start);
|
||||
rt_err_t (*wlan_set_channel)(struct rt_wlan_device *wlan, int channel);
|
||||
int (*wlan_get_channel)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_set_country)(struct rt_wlan_device *wlan, rt_country_code_t country_code);
|
||||
rt_country_code_t (*wlan_get_country)(struct rt_wlan_device *wlan);
|
||||
rt_err_t (*wlan_set_mac)(struct rt_wlan_device *wlan, rt_uint8_t mac[]);
|
||||
rt_err_t (*wlan_get_mac)(struct rt_wlan_device *wlan, rt_uint8_t mac[]);
|
||||
int (*wlan_recv)(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
int (*wlan_send)(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
int (*wlan_send_raw_frame)(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
int (*wlan_get_fast_info)(void *data);
|
||||
rt_err_t (*wlan_fast_connect)(void *data,rt_int32_t len);
|
||||
};
|
||||
|
||||
/*
|
||||
* wlan device init
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_init(struct rt_wlan_device *device, rt_wlan_mode_t mode);
|
||||
|
||||
/*
|
||||
* wlan device station interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len);
|
||||
rt_err_t rt_wlan_dev_fast_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len);
|
||||
rt_err_t rt_wlan_dev_disconnect(struct rt_wlan_device *device);
|
||||
int rt_wlan_dev_get_rssi(struct rt_wlan_device *device);
|
||||
|
||||
/*
|
||||
* wlan device ap interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len);
|
||||
rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device);
|
||||
rt_err_t rt_wlan_dev_ap_deauth(struct rt_wlan_device *device, rt_uint8_t mac[6]);
|
||||
|
||||
/*
|
||||
* wlan device scan interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_scan(struct rt_wlan_device *device, struct rt_wlan_info *info);
|
||||
rt_err_t rt_wlan_dev_scan_stop(struct rt_wlan_device *device);
|
||||
|
||||
/*
|
||||
* wlan device mac interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6]);
|
||||
rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6]);
|
||||
|
||||
/*
|
||||
* wlan device powersave interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level);
|
||||
int rt_wlan_dev_get_powersave(struct rt_wlan_device *device);
|
||||
|
||||
/*
|
||||
* wlan device event interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_register_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler, void *parameter);
|
||||
rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler);
|
||||
void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff);
|
||||
|
||||
/*
|
||||
* wlan device promisc interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device);
|
||||
rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device);
|
||||
rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback);
|
||||
void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len);
|
||||
|
||||
/*
|
||||
* wlan device filter interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_cfg_filter(struct rt_wlan_device *device, struct rt_wlan_filter *filter);
|
||||
|
||||
/*
|
||||
* wlan device channel interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_set_channel(struct rt_wlan_device *device, int channel);
|
||||
int rt_wlan_dev_get_channel(struct rt_wlan_device *device);
|
||||
|
||||
/*
|
||||
* wlan device country interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_set_country(struct rt_wlan_device *device, rt_country_code_t country_code);
|
||||
rt_country_code_t rt_wlan_dev_get_country(struct rt_wlan_device *device);
|
||||
|
||||
/*
|
||||
* wlan device datat transfer interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int len);
|
||||
// void rt_wlan_dev_data_ready(struct rt_wlan_device *device, int len);
|
||||
|
||||
/*
|
||||
* wlan device register interface
|
||||
*/
|
||||
rt_err_t rt_wlan_dev_register(struct rt_wlan_device *wlan, const char *name,
|
||||
const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
558
components/drivers/wlan/wlan_lwip.c
Normal file
558
components/drivers/wlan/wlan_lwip.c
Normal file
|
@ -0,0 +1,558 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-14 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <wlan_dev.h>
|
||||
#include <wlan_prot.h>
|
||||
#include <wlan_workqueue.h>
|
||||
|
||||
#if defined(RT_WLAN_PROT_ENABLE) && defined(RT_WLAN_PROT_LWIP_ENABLE)
|
||||
|
||||
#ifdef RT_USING_LWIP
|
||||
#include <netif/ethernetif.h>
|
||||
#include <lwip/netifapi.h>
|
||||
#ifdef LWIP_USING_DHCPD
|
||||
#include <dhcp_server.h>
|
||||
#endif
|
||||
#ifdef RT_USING_NETDEV
|
||||
#include <netdev.h>
|
||||
#endif
|
||||
|
||||
#define DBG_TAG "WLAN.lwip"
|
||||
#ifdef RT_WLAN_LWIP_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_WLAN_LWIP_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
#ifndef IPADDR_STRLEN_MAX
|
||||
#define IPADDR_STRLEN_MAX (32)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_PROT_LWIP_NAME
|
||||
#define RT_WLAN_PROT_LWIP_NAME ("lwip")
|
||||
#endif
|
||||
|
||||
struct lwip_prot_des
|
||||
{
|
||||
struct rt_wlan_prot prot;
|
||||
struct eth_device eth;
|
||||
rt_int8_t connected_flag;
|
||||
struct rt_timer timer;
|
||||
struct rt_work work;
|
||||
};
|
||||
|
||||
static void netif_is_ready(struct rt_work *work, void *parameter)
|
||||
{
|
||||
ip_addr_t ip_addr_zero = { 0 };
|
||||
struct rt_wlan_device *wlan = parameter;
|
||||
struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
|
||||
struct eth_device *eth_dev;
|
||||
rt_base_t level;
|
||||
struct rt_wlan_buff buff;
|
||||
rt_uint32_t ip_addr[4];
|
||||
char str[IPADDR_STRLEN_MAX];
|
||||
|
||||
if (lwip_prot == RT_NULL)
|
||||
return;
|
||||
|
||||
eth_dev = &lwip_prot->eth;
|
||||
rt_timer_stop(&lwip_prot->timer);
|
||||
if (ip_addr_cmp(&(eth_dev->netif->ip_addr), &ip_addr_zero) != 0)
|
||||
{
|
||||
rt_timer_start(&lwip_prot->timer);
|
||||
goto exit;
|
||||
}
|
||||
rt_memset(&ip_addr, 0, sizeof(ip_addr));
|
||||
#if LWIP_IPV4 && LWIP_IPV6
|
||||
if (eth_dev->netif->ip_addr.type == IPADDR_TYPE_V4)
|
||||
{
|
||||
ip_addr[0] = ip4_addr_get_u32(ð_dev->netif->ip_addr.u_addr.ip4);
|
||||
buff.data = &ip_addr[0];
|
||||
buff.len = sizeof(ip_addr[0]);
|
||||
}
|
||||
else if (eth_dev->netif->ip_addr.type == IPADDR_TYPE_V6)
|
||||
{
|
||||
*(ip6_addr_t *)(&ip_addr[0]) = eth_dev->netif->ip_addr.u_addr.ip6;
|
||||
buff.data = ip_addr;
|
||||
buff.len = sizeof(ip_addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_W("F:%s L:%d ip addr type not support", __FUNCTION__, __LINE__);
|
||||
}
|
||||
#else
|
||||
#if LWIP_IPV4
|
||||
ip_addr[0] = ip4_addr_get_u32(ð_dev->netif->ip_addr);
|
||||
buff.data = &ip_addr[0];
|
||||
buff.len = sizeof(ip_addr[0]);
|
||||
#else
|
||||
*(ip_addr_t *)(&ip_addr[0]) = eth_dev->netif->ip_addr;
|
||||
buff.data = ip_addr;
|
||||
buff.len = sizeof(ip_addr);
|
||||
#endif
|
||||
#endif
|
||||
if (rt_wlan_prot_ready(wlan, &buff) != 0)
|
||||
{
|
||||
rt_timer_start(&lwip_prot->timer);
|
||||
goto exit;
|
||||
}
|
||||
rt_memset(str, 0, IPADDR_STRLEN_MAX);
|
||||
rt_enter_critical();
|
||||
rt_memcpy(str, ipaddr_ntoa(&(eth_dev->netif->ip_addr)), IPADDR_STRLEN_MAX);
|
||||
rt_exit_critical();
|
||||
LOG_I("Got IP address : %s", str);
|
||||
exit:
|
||||
level = rt_hw_interrupt_disable();
|
||||
if (work)
|
||||
{
|
||||
rt_memset(work, 0, sizeof(struct rt_work));
|
||||
}
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
static void timer_callback(void *parameter)
|
||||
{
|
||||
#ifdef RT_WLAN_WORK_THREAD_ENABLE
|
||||
struct rt_workqueue *workqueue;
|
||||
struct rt_wlan_device *wlan = parameter;
|
||||
struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
|
||||
struct rt_work *work;
|
||||
rt_base_t level;
|
||||
|
||||
if (lwip_prot == RT_NULL)
|
||||
return;
|
||||
|
||||
work = &lwip_prot->work;
|
||||
workqueue = rt_wlan_get_workqueue();
|
||||
if (workqueue != RT_NULL)
|
||||
{
|
||||
level = rt_hw_interrupt_disable();
|
||||
rt_work_init(work, netif_is_ready, parameter);
|
||||
rt_hw_interrupt_enable(level);
|
||||
if (rt_workqueue_dowork(workqueue, work) != RT_EOK)
|
||||
{
|
||||
level = rt_hw_interrupt_disable();
|
||||
rt_memset(work, 0, sizeof(struct rt_work));
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
}
|
||||
#else
|
||||
netif_is_ready(RT_NULL, parameter);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void netif_set_connected(void *parameter)
|
||||
{
|
||||
struct rt_wlan_device *wlan = parameter;
|
||||
struct lwip_prot_des *lwip_prot = wlan->prot;
|
||||
struct eth_device *eth_dev;
|
||||
|
||||
if (lwip_prot == RT_NULL)
|
||||
return;
|
||||
|
||||
eth_dev = &lwip_prot->eth;
|
||||
|
||||
if (lwip_prot->connected_flag)
|
||||
{
|
||||
if (wlan->mode == RT_WLAN_STATION)
|
||||
{
|
||||
LOG_D("F:%s L:%d dhcp start run", __FUNCTION__, __LINE__);
|
||||
netifapi_netif_common(eth_dev->netif, netif_set_link_up, NULL);
|
||||
#ifdef RT_LWIP_DHCP
|
||||
netifapi_dhcp_start(eth_dev->netif);
|
||||
#endif
|
||||
rt_timer_start(&lwip_prot->timer);
|
||||
}
|
||||
else if (wlan->mode == RT_WLAN_AP)
|
||||
{
|
||||
LOG_D("F:%s L:%d dhcpd start run", __FUNCTION__, __LINE__);
|
||||
|
||||
netifapi_netif_common(eth_dev->netif, netif_set_link_up, NULL);
|
||||
#ifdef LWIP_USING_DHCPD
|
||||
{
|
||||
char netif_name[RT_NAME_MAX];
|
||||
|
||||
rt_memset(netif_name, 0, sizeof(netif_name));
|
||||
rt_memcpy(netif_name, eth_dev->netif->name, sizeof(eth_dev->netif->name));
|
||||
dhcpd_start(netif_name);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_D("F:%s L:%d set linkdown", __FUNCTION__, __LINE__);
|
||||
netifapi_netif_common(eth_dev->netif, netif_set_link_down, NULL);
|
||||
rt_timer_stop(&lwip_prot->timer);
|
||||
#ifdef RT_LWIP_DHCP
|
||||
{
|
||||
ip_addr_t ip_addr = { 0 };
|
||||
netifapi_dhcp_stop(eth_dev->netif);
|
||||
netif_set_addr(eth_dev->netif, &ip_addr, &ip_addr, &ip_addr);
|
||||
}
|
||||
#endif
|
||||
#ifdef LWIP_USING_DHCPD
|
||||
{
|
||||
char netif_name[RT_NAME_MAX];
|
||||
rt_memset(netif_name, 0, sizeof(netif_name));
|
||||
rt_memcpy(netif_name, lwip_prot->eth.netif->name, sizeof(lwip_prot->eth.netif->name));
|
||||
dhcpd_stop(netif_name);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void rt_wlan_lwip_event_handle(struct rt_wlan_prot *port, struct rt_wlan_device *wlan, int event)
|
||||
{
|
||||
struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
|
||||
rt_bool_t flag_old;
|
||||
|
||||
if (lwip_prot == RT_NULL)
|
||||
return;
|
||||
|
||||
flag_old = lwip_prot->connected_flag;
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case RT_WLAN_PROT_EVT_CONNECT:
|
||||
{
|
||||
LOG_D("event: CONNECT");
|
||||
lwip_prot->connected_flag = RT_TRUE;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_PROT_EVT_DISCONNECT:
|
||||
{
|
||||
LOG_D("event: DISCONNECT");
|
||||
lwip_prot->connected_flag = RT_FALSE;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_PROT_EVT_AP_START:
|
||||
{
|
||||
LOG_D("event: AP_START");
|
||||
lwip_prot->connected_flag = RT_TRUE;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_PROT_EVT_AP_STOP:
|
||||
{
|
||||
LOG_D("event: AP_STOP");
|
||||
lwip_prot->connected_flag = RT_FALSE;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_PROT_EVT_AP_ASSOCIATED:
|
||||
{
|
||||
LOG_D("event: ASSOCIATED");
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_PROT_EVT_AP_DISASSOCIATED:
|
||||
{
|
||||
LOG_D("event: DISASSOCIATED");
|
||||
break;
|
||||
}
|
||||
default :
|
||||
{
|
||||
LOG_D("event: UNKNOWN");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (flag_old != lwip_prot->connected_flag)
|
||||
{
|
||||
#ifdef RT_WLAN_WORK_THREAD_ENABLE
|
||||
rt_wlan_workqueue_dowork(netif_set_connected, wlan);
|
||||
#else
|
||||
netif_set_connected(wlan);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static rt_err_t rt_wlan_lwip_protocol_control(rt_device_t device, int cmd, void *args)
|
||||
{
|
||||
struct eth_device *eth_dev = (struct eth_device *)device;
|
||||
struct rt_wlan_device *wlan;
|
||||
rt_err_t err = RT_EOK;
|
||||
|
||||
RT_ASSERT(eth_dev != RT_NULL);
|
||||
|
||||
LOG_D("F:%s L:%d device:0x%08x user_data:0x%08x", __FUNCTION__, __LINE__, eth_dev, eth_dev->parent.user_data);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case NIOCTL_GADDR:
|
||||
/* get MAC address */
|
||||
wlan = eth_dev->parent.user_data;
|
||||
err = rt_device_control((rt_device_t)wlan, RT_WLAN_CMD_GET_MAC, args);
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static rt_err_t rt_wlan_lwip_protocol_recv(struct rt_wlan_device *wlan, void *buff, int len)
|
||||
{
|
||||
struct eth_device *eth_dev = &((struct lwip_prot_des *)wlan->prot)->eth;
|
||||
struct pbuf *p = RT_NULL;
|
||||
|
||||
LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
|
||||
|
||||
if (eth_dev == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
#ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
|
||||
{
|
||||
p = buff;
|
||||
if ((eth_dev->netif->input(p, eth_dev->netif)) != ERR_OK)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
return RT_EOK;
|
||||
}
|
||||
#else
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
while (p == RT_NULL)
|
||||
{
|
||||
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
|
||||
if (p != RT_NULL)
|
||||
break;
|
||||
|
||||
p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
|
||||
if (p != RT_NULL)
|
||||
break;
|
||||
|
||||
LOG_D("F:%s L:%d wait for pbuf_alloc!", __FUNCTION__, __LINE__);
|
||||
rt_thread_delay(1);
|
||||
count++;
|
||||
|
||||
//wait for 10ms or give up!!
|
||||
if (count >= 10)
|
||||
{
|
||||
LOG_W("F:%s L:%d pbuf allocate fail!!!", __FUNCTION__, __LINE__);
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
}
|
||||
/*copy data dat -> pbuf*/
|
||||
pbuf_take(p, buff, len);
|
||||
if ((eth_dev->netif->input(p, eth_dev->netif)) != ERR_OK)
|
||||
{
|
||||
LOG_D("F:%s L:%d IP input error", __FUNCTION__, __LINE__);
|
||||
pbuf_free(p);
|
||||
p = RT_NULL;
|
||||
}
|
||||
LOG_D("F:%s L:%d netif iput success! len:%d", __FUNCTION__, __LINE__, len);
|
||||
return RT_EOK;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static rt_err_t rt_wlan_lwip_protocol_send(rt_device_t device, struct pbuf *p)
|
||||
{
|
||||
struct rt_wlan_device *wlan = ((struct eth_device *)device)->parent.user_data;
|
||||
|
||||
LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
|
||||
|
||||
if (wlan == RT_NULL)
|
||||
{
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
#ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
|
||||
{
|
||||
rt_wlan_prot_transfer_dev(wlan, p, p->tot_len);
|
||||
return RT_EOK;
|
||||
}
|
||||
#else
|
||||
{
|
||||
rt_uint8_t *frame;
|
||||
|
||||
/* sending data directly */
|
||||
if (p->len == p->tot_len)
|
||||
{
|
||||
frame = (rt_uint8_t *)p->payload;
|
||||
rt_wlan_prot_transfer_dev(wlan, frame, p->tot_len);
|
||||
LOG_D("F:%s L:%d run len:%d", __FUNCTION__, __LINE__, p->tot_len);
|
||||
return RT_EOK;
|
||||
}
|
||||
frame = rt_malloc(p->tot_len);
|
||||
if (frame == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d malloc out_buf fail\n", __FUNCTION__, __LINE__);
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
/*copy pbuf -> data dat*/
|
||||
pbuf_copy_partial(p, frame, p->tot_len, 0);
|
||||
/* send data */
|
||||
rt_wlan_prot_transfer_dev(wlan, frame, p->tot_len);
|
||||
LOG_D("F:%s L:%d run len:%d", __FUNCTION__, __LINE__, p->tot_len);
|
||||
rt_free(frame);
|
||||
return RT_EOK;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
const static struct rt_device_ops wlan_lwip_ops =
|
||||
{
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
rt_wlan_lwip_protocol_control
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct rt_wlan_prot *rt_wlan_lwip_protocol_register(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan)
|
||||
{
|
||||
struct eth_device *eth = RT_NULL;
|
||||
rt_uint8_t id = 0;
|
||||
char eth_name[4], timer_name[16];
|
||||
rt_device_t device = RT_NULL;
|
||||
struct lwip_prot_des *lwip_prot;
|
||||
|
||||
if (wlan == RT_NULL || prot == RT_NULL)
|
||||
return RT_NULL;;
|
||||
|
||||
LOG_D("F:%s L:%d is run wlan:0x%08x", __FUNCTION__, __LINE__, wlan);
|
||||
|
||||
do
|
||||
{
|
||||
/* find ETH device name */
|
||||
eth_name[0] = 'w';
|
||||
eth_name[1] = '0' + id++;
|
||||
eth_name[2] = '\0';
|
||||
device = rt_device_find(eth_name);
|
||||
}
|
||||
while (device);
|
||||
|
||||
if (id > 9)
|
||||
{
|
||||
LOG_E("F:%s L:%d not find Empty name", __FUNCTION__, __LINE__, eth_name);
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
if (rt_device_open((rt_device_t)wlan, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
|
||||
{
|
||||
LOG_E("F:%s L:%d open wlan failed", __FUNCTION__, __LINE__);
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
lwip_prot = rt_malloc(sizeof(struct lwip_prot_des));
|
||||
if (lwip_prot == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d malloc mem failed", __FUNCTION__, __LINE__);
|
||||
rt_device_close((rt_device_t)wlan);
|
||||
return RT_NULL;
|
||||
}
|
||||
rt_memset(lwip_prot, 0, sizeof(struct lwip_prot_des));
|
||||
|
||||
eth = &lwip_prot->eth;
|
||||
|
||||
#ifdef RT_USING_DEVICE_OPS
|
||||
eth->parent.ops = &wlan_lwip_ops;
|
||||
#else
|
||||
eth->parent.init = RT_NULL;
|
||||
eth->parent.open = RT_NULL;
|
||||
eth->parent.close = RT_NULL;
|
||||
eth->parent.read = RT_NULL;
|
||||
eth->parent.write = RT_NULL;
|
||||
eth->parent.control = rt_wlan_lwip_protocol_control;
|
||||
#endif
|
||||
|
||||
eth->parent.user_data = wlan;
|
||||
eth->eth_rx = RT_NULL;
|
||||
eth->eth_tx = rt_wlan_lwip_protocol_send;
|
||||
|
||||
/* register ETH device */
|
||||
if (eth_device_init(eth, eth_name) != RT_EOK)
|
||||
{
|
||||
LOG_E("eth device init failed");
|
||||
rt_device_close((rt_device_t)wlan);
|
||||
rt_free(lwip_prot);
|
||||
return RT_NULL;
|
||||
}
|
||||
rt_memcpy(&lwip_prot->prot, prot, sizeof(struct rt_wlan_prot));
|
||||
rt_sprintf(timer_name, "timer_%s", eth_name);
|
||||
rt_timer_init(&lwip_prot->timer, timer_name, timer_callback, wlan, rt_tick_from_millisecond(1000),
|
||||
RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
|
||||
netif_set_up(eth->netif);
|
||||
LOG_I("eth device init ok name:%s", eth_name);
|
||||
#ifdef RT_USING_NETDEV
|
||||
wlan->netdev = netdev_get_by_name(eth_name);
|
||||
#endif
|
||||
return &lwip_prot->prot;
|
||||
}
|
||||
|
||||
static void rt_wlan_lwip_protocol_unregister(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan)
|
||||
{
|
||||
struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)prot;
|
||||
|
||||
LOG_D("F:%s L:%d is run wlan:0x%08x", __FUNCTION__, __LINE__, wlan);
|
||||
#if !defined(RT_USING_LWIP141)
|
||||
wlan->prot = RT_NULL;
|
||||
if (lwip_prot == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef LWIP_USING_DHCPD
|
||||
{
|
||||
char netif_name[RT_NAME_MAX];
|
||||
rt_memset(netif_name, 0, sizeof(netif_name));
|
||||
rt_memcpy(netif_name, lwip_prot->eth.netif->name, sizeof(lwip_prot->eth.netif->name));
|
||||
dhcpd_stop(netif_name);
|
||||
}
|
||||
#endif
|
||||
eth_device_deinit(&lwip_prot->eth);
|
||||
rt_device_close((rt_device_t)wlan);
|
||||
rt_timer_detach(&lwip_prot->timer);
|
||||
wlan->netdev = RT_NULL;
|
||||
rt_free(lwip_prot);
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct rt_wlan_prot_ops ops =
|
||||
{
|
||||
rt_wlan_lwip_protocol_recv,
|
||||
rt_wlan_lwip_protocol_register,
|
||||
rt_wlan_lwip_protocol_unregister
|
||||
};
|
||||
|
||||
int rt_wlan_lwip_init(void)
|
||||
{
|
||||
static struct rt_wlan_prot prot;
|
||||
rt_wlan_prot_event_t event;
|
||||
|
||||
rt_memset(&prot, 0, sizeof(prot));
|
||||
rt_strncpy(&prot.name[0], RT_WLAN_PROT_LWIP_NAME, RT_WLAN_PROT_NAME_LEN);
|
||||
prot.ops = &ops;
|
||||
|
||||
if (rt_wlan_prot_regisetr(&prot) != RT_EOK)
|
||||
{
|
||||
LOG_E("F:%s L:%d protocol regisetr failed", __FUNCTION__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (event = RT_WLAN_PROT_EVT_INIT_DONE; event < RT_WLAN_PROT_EVT_MAX; event++)
|
||||
{
|
||||
rt_wlan_prot_event_register(&prot, event, rt_wlan_lwip_event_handle);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_PREV_EXPORT(rt_wlan_lwip_init);
|
||||
|
||||
#endif
|
||||
#endif
|
1776
components/drivers/wlan/wlan_mgnt.c
Normal file
1776
components/drivers/wlan/wlan_mgnt.c
Normal file
File diff suppressed because it is too large
Load diff
153
components/drivers/wlan/wlan_mgnt.h
Normal file
153
components/drivers/wlan/wlan_mgnt.h
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-06 tyx the first version
|
||||
*/
|
||||
|
||||
#ifndef __WLAN_MGNT_H__
|
||||
#define __WLAN_MGNT_H__
|
||||
|
||||
#include <wlan_dev.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_SCAN_WAIT_MS
|
||||
#define RT_WLAN_SCAN_WAIT_MS (10 * 1000)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_SCAN_CACHE_NUM
|
||||
#define RT_WLAN_SCAN_CACHE_NUM (50)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_CONNECT_WAIT_MS
|
||||
#define RT_WLAN_CONNECT_WAIT_MS (10 * 1000)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_START_AP_WAIT_MS
|
||||
#define RT_WLAN_START_AP_WAIT_MS (10 * 1000)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_EBOX_NUM
|
||||
#define RT_WLAN_EBOX_NUM (10)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_SCAN_RETRY_CNT
|
||||
#define RT_WLAN_SCAN_RETRY_CNT (3)
|
||||
#endif
|
||||
|
||||
#ifndef AUTO_CONNECTION_PERIOD_MS
|
||||
#define AUTO_CONNECTION_PERIOD_MS (2000)
|
||||
#endif
|
||||
|
||||
/*state fot station*/
|
||||
#define RT_WLAN_STATE_CONNECT (1UL << 0)
|
||||
#define RT_WLAN_STATE_CONNECTING (1UL << 1)
|
||||
#define RT_WLAN_STATE_READY (1UL << 2)
|
||||
#define RT_WLAN_STATE_POWERSAVE (1UL << 3)
|
||||
|
||||
/*flags fot station*/
|
||||
#define RT_WLAN_STATE_AUTOEN (1UL << 0)
|
||||
|
||||
/*state fot ap*/
|
||||
#define RT_WLAN_STATE_ACTIVE (1UL << 0)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_WLAN_EVT_READY = 0, /* connect and prot is ok, You can send data*/
|
||||
RT_WLAN_EVT_SCAN_DONE, /* Scan a info */
|
||||
RT_WLAN_EVT_SCAN_REPORT, /* Scan end */
|
||||
RT_WLAN_EVT_STA_CONNECTED, /* connect success */
|
||||
RT_WLAN_EVT_STA_CONNECTED_FAIL, /* connection failed */
|
||||
RT_WLAN_EVT_STA_DISCONNECTED, /* disconnect */
|
||||
RT_WLAN_EVT_AP_START, /* AP start */
|
||||
RT_WLAN_EVT_AP_STOP, /* AP stop */
|
||||
RT_WLAN_EVT_AP_ASSOCIATED, /* sta associated */
|
||||
RT_WLAN_EVT_AP_DISASSOCIATED, /* sta disassociated */
|
||||
RT_WLAN_EVT_MAX
|
||||
} rt_wlan_event_t;
|
||||
|
||||
typedef void (*rt_wlan_event_handler)(int event, struct rt_wlan_buff *buff, void *parameter);
|
||||
|
||||
struct rt_wlan_scan_result
|
||||
{
|
||||
rt_int32_t num;
|
||||
struct rt_wlan_info *info;
|
||||
};
|
||||
|
||||
/*
|
||||
* wifi init interface
|
||||
*/
|
||||
int rt_wlan_init(void);
|
||||
rt_err_t rt_wlan_set_mode(const char *dev_name, rt_wlan_mode_t mode);
|
||||
rt_wlan_mode_t rt_wlan_get_mode(const char *dev_name);
|
||||
|
||||
/*
|
||||
* wifi station mode interface
|
||||
*/
|
||||
rt_err_t rt_wlan_connect(const char *ssid, const char *password);
|
||||
rt_err_t rt_wlan_connect_adv(struct rt_wlan_info *info, const char *password);
|
||||
rt_err_t rt_wlan_disconnect(void);
|
||||
rt_bool_t rt_wlan_is_connected(void);
|
||||
rt_bool_t rt_wlan_is_ready(void);
|
||||
rt_err_t rt_wlan_set_mac(rt_uint8_t *mac);
|
||||
rt_err_t rt_wlan_get_mac(rt_uint8_t *mac);
|
||||
rt_err_t rt_wlan_get_info(struct rt_wlan_info *info);
|
||||
int rt_wlan_get_rssi(void);
|
||||
|
||||
/*
|
||||
* wifi ap mode interface
|
||||
*/
|
||||
rt_err_t rt_wlan_start_ap(const char *ssid, const char *password);
|
||||
rt_err_t rt_wlan_start_ap_adv(struct rt_wlan_info *info, const char *password);
|
||||
rt_bool_t rt_wlan_ap_is_active(void);
|
||||
rt_err_t rt_wlan_ap_stop(void);
|
||||
rt_err_t rt_wlan_ap_get_info(struct rt_wlan_info *info);
|
||||
int rt_wlan_ap_get_sta_num(void);
|
||||
int rt_wlan_ap_get_sta_info(struct rt_wlan_info *info, int num);
|
||||
rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac);
|
||||
rt_err_t rt_wlan_ap_set_country(rt_country_code_t country_code);
|
||||
rt_country_code_t rt_wlan_ap_get_country(void);
|
||||
|
||||
/*
|
||||
* wifi scan interface
|
||||
*/
|
||||
rt_err_t rt_wlan_scan(void);
|
||||
struct rt_wlan_scan_result *rt_wlan_scan_sync(void);
|
||||
rt_err_t rt_wlan_scan_with_info(struct rt_wlan_info *info);
|
||||
|
||||
|
||||
/*
|
||||
* wifi auto connect interface
|
||||
*/
|
||||
void rt_wlan_config_autoreconnect(rt_bool_t enable);
|
||||
rt_bool_t rt_wlan_get_autoreconnect_mode(void);
|
||||
|
||||
/*
|
||||
* wifi power management interface
|
||||
*/
|
||||
rt_err_t rt_wlan_set_powersave(int level);
|
||||
int rt_wlan_get_powersave(void);
|
||||
|
||||
/*
|
||||
* wifi event management interface
|
||||
*/
|
||||
rt_err_t rt_wlan_register_event_handler(rt_wlan_event_t event, rt_wlan_event_handler handler, void *parameter);
|
||||
rt_err_t rt_wlan_unregister_event_handler(rt_wlan_event_t event);
|
||||
|
||||
/*
|
||||
* wifi management lock interface
|
||||
*/
|
||||
void rt_wlan_mgnt_lock(void);
|
||||
void rt_wlan_mgnt_unlock(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
364
components/drivers/wlan/wlan_prot.c
Normal file
364
components/drivers/wlan/wlan_prot.c
Normal file
|
@ -0,0 +1,364 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-14 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <wlan_dev.h>
|
||||
#include <wlan_prot.h>
|
||||
|
||||
#define DBG_TAG "WLAN.prot"
|
||||
#ifdef RT_WLAN_PROT_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_WLAN_PROT_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
#ifdef RT_WLAN_PROT_ENABLE
|
||||
|
||||
#if RT_WLAN_PROT_NAME_LEN < 4
|
||||
#error "The name is too short"
|
||||
#endif
|
||||
|
||||
struct rt_wlan_prot_event_des
|
||||
{
|
||||
rt_wlan_prot_event_handler handler;
|
||||
struct rt_wlan_prot *prot;
|
||||
};
|
||||
|
||||
static struct rt_wlan_prot *_prot[RT_WLAN_PROT_MAX];
|
||||
|
||||
static struct rt_wlan_prot_event_des prot_event_tab[RT_WLAN_PROT_EVT_MAX][RT_WLAN_PROT_MAX];
|
||||
|
||||
static void rt_wlan_prot_event_handle(struct rt_wlan_device *wlan, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff, void *parameter)
|
||||
{
|
||||
int i;
|
||||
struct rt_wlan_prot *wlan_prot;
|
||||
struct rt_wlan_prot *prot;
|
||||
rt_wlan_prot_event_handler handler;
|
||||
rt_wlan_prot_event_t prot_event;
|
||||
|
||||
LOG_D("F:%s L:%d event:%d", __FUNCTION__, __LINE__, event);
|
||||
|
||||
wlan_prot = wlan->prot;
|
||||
handler = RT_NULL;
|
||||
prot = RT_NULL;
|
||||
switch (event)
|
||||
{
|
||||
case RT_WLAN_DEV_EVT_INIT_DONE:
|
||||
{
|
||||
LOG_D("L%d event: INIT_DONE", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_INIT_DONE;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_CONNECT:
|
||||
{
|
||||
LOG_D("L%d event: CONNECT", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_CONNECT;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_DISCONNECT:
|
||||
{
|
||||
LOG_D("L%d event: DISCONNECT", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_DISCONNECT;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_AP_START:
|
||||
{
|
||||
LOG_D("L%d event: AP_START", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_AP_START;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_AP_STOP:
|
||||
{
|
||||
LOG_D("L%d event: AP_STOP", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_AP_STOP;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_AP_ASSOCIATED:
|
||||
{
|
||||
LOG_D("L%d event: AP_ASSOCIATED", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_AP_ASSOCIATED;
|
||||
break;
|
||||
}
|
||||
case RT_WLAN_DEV_EVT_AP_DISASSOCIATED:
|
||||
{
|
||||
LOG_D("L%d event: AP_DISASSOCIATED", __LINE__);
|
||||
prot_event = RT_WLAN_PROT_EVT_AP_DISASSOCIATED;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if ((prot_event_tab[prot_event][i].handler != RT_NULL) &&
|
||||
(prot_event_tab[prot_event][i].prot->id == wlan_prot->id))
|
||||
{
|
||||
handler = prot_event_tab[prot_event][i].handler;
|
||||
prot = prot_event_tab[prot_event][i].prot;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (handler != RT_NULL)
|
||||
{
|
||||
handler(prot, wlan, prot_event);
|
||||
}
|
||||
}
|
||||
|
||||
static struct rt_wlan_device *rt_wlan_prot_find_by_name(const char *name)
|
||||
{
|
||||
rt_device_t device;
|
||||
|
||||
if (name == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d Parameter Wrongful", __FUNCTION__, __LINE__);
|
||||
return RT_NULL;
|
||||
}
|
||||
device = rt_device_find(name);
|
||||
if (device == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d not find wlan dev!! name:%s", __FUNCTION__, __LINE__, name);
|
||||
return RT_NULL;
|
||||
}
|
||||
return (struct rt_wlan_device *)device;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_attach(const char *dev_name, const char *prot_name)
|
||||
{
|
||||
struct rt_wlan_device *wlan;
|
||||
|
||||
wlan = rt_wlan_prot_find_by_name(dev_name);
|
||||
if (wlan == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
return rt_wlan_prot_attach_dev(wlan, prot_name);
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_detach(const char *name)
|
||||
{
|
||||
struct rt_wlan_device *wlan;
|
||||
|
||||
wlan = rt_wlan_prot_find_by_name(name);
|
||||
if (wlan == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
return rt_wlan_prot_detach_dev(wlan);
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_attach_dev(struct rt_wlan_device *wlan, const char *prot_name)
|
||||
{
|
||||
int i = 0;
|
||||
struct rt_wlan_prot *prot = wlan->prot;
|
||||
rt_wlan_dev_event_handler handler = rt_wlan_prot_event_handle;
|
||||
|
||||
if (wlan == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d wlan is null", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if (prot != RT_NULL &&
|
||||
(rt_strcmp(prot->name, prot_name) == 0))
|
||||
{
|
||||
LOG_D("prot is register");
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
/* if prot not NULL */
|
||||
if (prot != RT_NULL)
|
||||
rt_wlan_prot_detach_dev(wlan);
|
||||
|
||||
#ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
|
||||
if (rt_strcmp(RT_WLAN_PROT_LWIP_NAME, prot_name) != 0)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
#endif
|
||||
/* find prot */
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if ((_prot[i] != RT_NULL) && (rt_strcmp(_prot[i]->name, prot_name) == 0))
|
||||
{
|
||||
/* attach prot */
|
||||
wlan->prot = _prot[i]->ops->dev_reg_callback(_prot[i], wlan);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i >= RT_WLAN_PROT_MAX)
|
||||
{
|
||||
LOG_E("F:%s L:%d not find wlan protocol", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_CONNECT, handler, RT_NULL);
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_DISCONNECT, handler, RT_NULL);
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_START, handler, RT_NULL);
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_STOP, handler, RT_NULL);
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_ASSOCIATED, handler, RT_NULL);
|
||||
rt_wlan_dev_register_event_handler(wlan, RT_WLAN_DEV_EVT_AP_DISASSOCIATED, handler, RT_NULL);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_detach_dev(struct rt_wlan_device *wlan)
|
||||
{
|
||||
struct rt_wlan_prot *prot = wlan->prot;
|
||||
rt_wlan_dev_event_t event;
|
||||
|
||||
if (prot == RT_NULL)
|
||||
return RT_EOK;
|
||||
|
||||
for (event = RT_WLAN_DEV_EVT_INIT_DONE; event < RT_WLAN_DEV_EVT_MAX; event ++)
|
||||
{
|
||||
rt_wlan_dev_unregister_event_handler(wlan, event, rt_wlan_prot_event_handle);
|
||||
}
|
||||
|
||||
/* detach prot */
|
||||
prot->ops->dev_unreg_callback(prot, wlan);
|
||||
wlan->prot = RT_NULL;
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_regisetr(struct rt_wlan_prot *prot)
|
||||
{
|
||||
int i;
|
||||
rt_uint32_t id;
|
||||
static rt_uint8_t num;
|
||||
|
||||
/* Parameter checking */
|
||||
if ((prot == RT_NULL) ||
|
||||
(prot->ops->prot_recv == RT_NULL) ||
|
||||
(prot->ops->dev_reg_callback == RT_NULL))
|
||||
{
|
||||
LOG_E("F:%s L:%d Parameter Wrongful", __FUNCTION__, __LINE__);
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
/* save prot */
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if (_prot[i] == RT_NULL)
|
||||
{
|
||||
id = (RT_LWAN_ID_PREFIX << 16) | num;
|
||||
prot->id = id;
|
||||
_prot[i] = prot;
|
||||
num ++;
|
||||
break;
|
||||
}
|
||||
else if (rt_strcmp(_prot[i]->name, prot->name) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* is full */
|
||||
if (i >= RT_WLAN_PROT_MAX)
|
||||
{
|
||||
LOG_E("F:%s L:%d Space full", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_event_register(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event, rt_wlan_prot_event_handler handler)
|
||||
{
|
||||
int i;
|
||||
|
||||
if ((prot == RT_NULL) || (handler == RT_NULL))
|
||||
{
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if (prot_event_tab[event][i].handler == RT_NULL)
|
||||
{
|
||||
prot_event_tab[event][i].handler = handler;
|
||||
prot_event_tab[event][i].prot = prot;
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_event_unregister(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (prot == RT_NULL)
|
||||
{
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if ((prot_event_tab[event][i].handler != RT_NULL) &&
|
||||
(prot_event_tab[event][i].prot == prot))
|
||||
{
|
||||
rt_memset(&prot_event_tab[event][i], 0, sizeof(struct rt_wlan_prot_event_des));
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_prot_transfer_dev(struct rt_wlan_device *wlan, void *buff, int len)
|
||||
{
|
||||
if (wlan->ops->wlan_send != RT_NULL)
|
||||
{
|
||||
return wlan->ops->wlan_send(wlan, buff, len);
|
||||
}
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_dev_transfer_prot(struct rt_wlan_device *wlan, void *buff, int len)
|
||||
{
|
||||
struct rt_wlan_prot *prot = wlan->prot;
|
||||
|
||||
if (prot != RT_NULL)
|
||||
{
|
||||
return prot->ops->prot_recv(wlan, buff, len);
|
||||
}
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
extern int rt_wlan_prot_ready_event(struct rt_wlan_device *wlan, struct rt_wlan_buff *buff);
|
||||
int rt_wlan_prot_ready(struct rt_wlan_device *wlan, struct rt_wlan_buff *buff)
|
||||
{
|
||||
return rt_wlan_prot_ready_event(wlan, buff);
|
||||
}
|
||||
|
||||
void rt_wlan_prot_dump(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
rt_kprintf(" name id \n");
|
||||
rt_kprintf("-------- --------\n");
|
||||
for (i = 0; i < RT_WLAN_PROT_MAX; i++)
|
||||
{
|
||||
if (_prot[i] != RT_NULL)
|
||||
{
|
||||
rt_kprintf("%-8.8s ", _prot[i]->name);
|
||||
rt_kprintf("%08x\n", _prot[i]->id);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
83
components/drivers/wlan/wlan_prot.h
Normal file
83
components/drivers/wlan/wlan_prot.h
Normal file
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-14 tyx the first version
|
||||
*/
|
||||
|
||||
#ifndef __WLAN_PROT_H__
|
||||
#define __WLAN_PROT_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_PROT_NAME_LEN
|
||||
#define RT_WLAN_PROT_NAME_LEN (8)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_PROT_MAX
|
||||
#define RT_WLAN_PROT_MAX (1)
|
||||
#endif
|
||||
|
||||
#define RT_LWAN_ID_PREFIX (0x5054)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_WLAN_PROT_EVT_INIT_DONE = 0,
|
||||
RT_WLAN_PROT_EVT_CONNECT,
|
||||
RT_WLAN_PROT_EVT_DISCONNECT,
|
||||
RT_WLAN_PROT_EVT_AP_START,
|
||||
RT_WLAN_PROT_EVT_AP_STOP,
|
||||
RT_WLAN_PROT_EVT_AP_ASSOCIATED,
|
||||
RT_WLAN_PROT_EVT_AP_DISASSOCIATED,
|
||||
RT_WLAN_PROT_EVT_MAX,
|
||||
} rt_wlan_prot_event_t;
|
||||
|
||||
struct rt_wlan_prot;
|
||||
struct rt_wlan_prot_ops
|
||||
{
|
||||
rt_err_t (*prot_recv)(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
struct rt_wlan_prot *(*dev_reg_callback)(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan);
|
||||
void (*dev_unreg_callback)(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan);
|
||||
};
|
||||
|
||||
struct rt_wlan_prot
|
||||
{
|
||||
char name[RT_WLAN_PROT_NAME_LEN];
|
||||
rt_uint32_t id;
|
||||
const struct rt_wlan_prot_ops *ops;
|
||||
};
|
||||
|
||||
typedef void (*rt_wlan_prot_event_handler)(struct rt_wlan_prot *port, struct rt_wlan_device *wlan, int event);
|
||||
|
||||
rt_err_t rt_wlan_prot_attach(const char *dev_name, const char *prot_name);
|
||||
|
||||
rt_err_t rt_wlan_prot_attach_dev(struct rt_wlan_device *wlan, const char *prot_name);
|
||||
|
||||
rt_err_t rt_wlan_prot_detach(const char *dev_name);
|
||||
|
||||
rt_err_t rt_wlan_prot_detach_dev(struct rt_wlan_device *wlan);
|
||||
|
||||
rt_err_t rt_wlan_prot_regisetr(struct rt_wlan_prot *prot);
|
||||
|
||||
rt_err_t rt_wlan_prot_transfer_dev(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
|
||||
rt_err_t rt_wlan_dev_transfer_prot(struct rt_wlan_device *wlan, void *buff, int len);
|
||||
|
||||
rt_err_t rt_wlan_prot_event_register(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event, rt_wlan_prot_event_handler handler);
|
||||
|
||||
rt_err_t rt_wlan_prot_event_unregister(struct rt_wlan_prot *prot, rt_wlan_prot_event_t event);
|
||||
|
||||
int rt_wlan_prot_ready(struct rt_wlan_device *wlan, struct rt_wlan_buff *buff);
|
||||
|
||||
void rt_wlan_prot_dump(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
101
components/drivers/wlan/wlan_workqueue.c
Normal file
101
components/drivers/wlan/wlan_workqueue.c
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-19 tyx the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <wlan_workqueue.h>
|
||||
#include <ipc/workqueue.h>
|
||||
|
||||
#define DBG_TAG "WLAN.work"
|
||||
#define DBG_LVL DBG_INFO
|
||||
#include <rtdbg.h>
|
||||
|
||||
#ifdef RT_WLAN_WORK_THREAD_ENABLE
|
||||
|
||||
struct rt_wlan_work
|
||||
{
|
||||
struct rt_work work;
|
||||
void (*fun)(void *parameter);
|
||||
void *parameter;
|
||||
};
|
||||
|
||||
static struct rt_workqueue *wlan_workqueue;
|
||||
|
||||
static void rt_wlan_workqueue_fun(struct rt_work *work, void *work_data)
|
||||
{
|
||||
struct rt_wlan_work *wlan_work = work_data;
|
||||
|
||||
wlan_work->fun(wlan_work->parameter);
|
||||
rt_free(wlan_work);
|
||||
}
|
||||
|
||||
struct rt_workqueue *rt_wlan_get_workqueue(void)
|
||||
{
|
||||
return wlan_workqueue;
|
||||
}
|
||||
|
||||
rt_err_t rt_wlan_workqueue_dowork(void (*func)(void *parameter), void *parameter)
|
||||
{
|
||||
struct rt_wlan_work *wlan_work;
|
||||
rt_err_t err = RT_EOK;
|
||||
|
||||
LOG_D("F:%s is run", __FUNCTION__);
|
||||
if (func == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d func is null", __FUNCTION__, __LINE__);
|
||||
return -RT_EINVAL;
|
||||
}
|
||||
|
||||
if (wlan_workqueue == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d not init wlan work queue", __FUNCTION__, __LINE__);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
wlan_work = rt_malloc(sizeof(struct rt_wlan_work));
|
||||
if (wlan_work == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d create work failed", __FUNCTION__, __LINE__);
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
wlan_work->fun = func;
|
||||
wlan_work->parameter = parameter;
|
||||
rt_work_init(&wlan_work->work, rt_wlan_workqueue_fun, wlan_work);
|
||||
err = rt_workqueue_dowork(wlan_workqueue, &wlan_work->work);
|
||||
if (err != RT_EOK)
|
||||
{
|
||||
LOG_E("F:%s L:%d do work failed", __FUNCTION__, __LINE__);
|
||||
rt_free(wlan_work);
|
||||
return err;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int rt_wlan_workqueue_init(void)
|
||||
{
|
||||
static rt_int8_t _init_flag = 0;
|
||||
|
||||
if (_init_flag == 0)
|
||||
{
|
||||
wlan_workqueue = rt_workqueue_create(RT_WLAN_WORKQUEUE_THREAD_NAME, RT_WLAN_WORKQUEUE_THREAD_SIZE,
|
||||
RT_WLAN_WORKQUEUE_THREAD_PRIO);
|
||||
if (wlan_workqueue == RT_NULL)
|
||||
{
|
||||
LOG_E("F:%s L:%d wlan work queue create failed", __FUNCTION__, __LINE__);
|
||||
return -1;
|
||||
}
|
||||
_init_flag = 1;
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
INIT_PREV_EXPORT(rt_wlan_workqueue_init);
|
||||
|
||||
#endif
|
42
components/drivers/wlan/wlan_workqueue.h
Normal file
42
components/drivers/wlan/wlan_workqueue.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-19 tyx the first version
|
||||
*/
|
||||
|
||||
#ifndef __WLAN_WORKQUEUE_H__
|
||||
#define __WLAN_WORKQUEUE_H__
|
||||
|
||||
#include <ipc/workqueue.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_WORKQUEUE_THREAD_NAME
|
||||
#define RT_WLAN_WORKQUEUE_THREAD_NAME ("wlan_job")
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_WORKQUEUE_THREAD_SIZE
|
||||
#define RT_WLAN_WORKQUEUE_THREAD_SIZE (2048)
|
||||
#endif
|
||||
|
||||
#ifndef RT_WLAN_WORKQUEUE_THREAD_PRIO
|
||||
#define RT_WLAN_WORKQUEUE_THREAD_PRIO (20)
|
||||
#endif
|
||||
|
||||
int rt_wlan_workqueue_init(void);
|
||||
|
||||
rt_err_t rt_wlan_workqueue_dowork(void (*func)(void *parameter), void *parameter);
|
||||
|
||||
struct rt_workqueue *rt_wlan_get_workqueue(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue