[DeviceDriver][wlan] 已知问题修复

1.Kconfig添加DEBUG选项
2.函数入参检查
3.修复拼写错误及逻辑错误
4.低功耗可以设定等级
5.移除残留中文注释
This commit is contained in:
tangyuxin 2018-09-19 15:06:05 +08:00
parent 324bfc5897
commit f7423741f2
11 changed files with 246 additions and 176 deletions

View File

@ -205,11 +205,11 @@ menu "Using WiFi"
if RT_USING_WIFI
config RT_WLAN_DEVICE_STA_NAME
string "the WiFi device name for station"
string "The WiFi device name for station"
default "wlan0"
config RT_WLAN_DEVICE_AP_NAME
string "the WiFi device name for ap"
string "The WiFi device name for ap"
default "wlan1"
config RT_WLAN_DEFAULT_PROT
@ -217,11 +217,11 @@ menu "Using WiFi"
default "lwip"
config RT_WLAN_SCAN_WAIT_MS
int "Scan timeout time"
int "Set scan timeout time(ms)"
default 10000;
config RT_WLAN_CONNECT_WAIT_MS
int "connect timeout time"
int "Set connect timeout time(ms)"
default 10000;
config RT_WLAN_SSID_MAX_LENGTH
@ -259,6 +259,36 @@ menu "Using WiFi"
config RT_WLAN_PROT_LWIP_PBUF_FORCE
bool "Forced use of PBUF transmission"
default n
menuconfig RT_WLAN_DEBUG
bool "Enable WLAN Debugging Options"
default n
if RT_WLAN_DEBUG
config RT_WLAN_CMD_DEBUG
bool "Enable Debugging of wlan_cmd.c"
default n
config RT_WLAN_MGNT_DEBUG
bool "Enable Debugging of wlan_mgnt.c"
default n
config RT_WLAN_DEV_DEBUG
bool "Enable Debugging of wlan_dev.c"
default n
config RT_WLAN_PROT_DEBUG
bool "Enable Debugging of wlan_prot.c"
default n
config RT_WLAN_CFG_DEBUG
bool "Enable Debugging of wlan_cfg.c"
default n
config RT_WLAN_LWIP_DEBUG
bool "Enable Debugging of wlan_lwip.c"
default n
endif
endif
endmenu

View File

@ -12,11 +12,22 @@
#include <wlan_cfg.h>
#define DBG_ENABLE
#ifdef RT_WLAN_CFG_DEBUG
#define DBG_LEVEL DBG_LOG
#else
#define DBG_LEVEL DBG_INFO
#endif
#define DBG_SECTION_NAME "WLAN.cfg"
#define DBG_COLOR
#include <rtdbg.h>
#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;
@ -31,9 +42,6 @@ struct rt_wlan_cfg_des
struct rt_wlan_cfg_info *cfg_info;
};
#define WLAN_CFG_LOCK() (rt_mutex_take(&cfg_mutex, RT_WAITING_FOREVER))
#define WLAN_CFG_UNLOCK() (rt_mutex_release(&cfg_mutex))
static struct rt_wlan_cfg_des *cfg_cache;
static const struct rt_wlan_cfg_ops *cfg_ops;
static struct rt_mutex cfg_mutex;
@ -230,7 +238,7 @@ int rt_wlan_cfg_read(struct rt_wlan_cfg_info *cfg_info, int num)
{
rt_wlan_cfg_init();
if (num <= 0)
if ((cfg_info == RT_NULL) || (num <= 0))
return 0;
/* copy data */
WLAN_CFG_LOCK();
@ -308,7 +316,7 @@ int rt_wlan_cfg_read_index(struct rt_wlan_cfg_info *cfg_info, int index)
{
rt_wlan_cfg_init();
if (index < 0)
if ((cfg_info == RT_NULL) || (index < 0))
return 0;
WLAN_CFG_LOCK();

View File

@ -21,10 +21,6 @@ extern "C" {
#define RT_WLAN_CFG_INFO_MAX (3) /* min is 1 */
#endif
#if RT_WLAN_CFG_INFO_MAX < 1
#error "The minimum configuration is 1"
#endif
#define RT_WLAN_CFG_MAGIC (0x426f6d62)
struct rt_wlan_cfg_info

View File

@ -24,12 +24,13 @@ 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 list_sta(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[]);
static int wifi_debug(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[]);
@ -37,6 +38,7 @@ 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[] =
@ -46,13 +48,16 @@ static const struct wifi_cmd_des cmd_tab[] =
{"status", wifi_status},
{"join", wifi_join},
{"ap", wifi_ap},
{"list_sta", list_sta},
{"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[] =
{
@ -64,6 +69,7 @@ static const struct wifi_cmd_des debug_tab[] =
{"prot", wifi_debug_set_prot},
{"auto", wifi_debug_set_autoconnect},
};
#endif
static int wifi_help(int argc, char *argv[])
{
@ -76,7 +82,9 @@ static int wifi_help(int argc, char *argv[])
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;
}
@ -272,7 +280,7 @@ static int wifi_ap(int argc, char *argv[])
return 0;
}
static int list_sta(int argc, char *argv[])
static int wifi_list_sta(int argc, char *argv[])
{
struct rt_wlan_info *sta_info;
int num, i;
@ -320,6 +328,7 @@ static int wifi_ap_stop(int argc, char *argv[])
return 0;
}
#ifdef RT_WLAN_CMD_DEBUG
/* just for debug */
static int wifi_debug_help(int argc, char *argv[])
{
@ -509,6 +518,7 @@ static int wifi_debug(int argc, char *argv[])
}
return 0;
}
#endif
static int wifi_msh(int argc, char *argv[])
{
@ -551,4 +561,6 @@ static int wifi_msh(int argc, char *argv[])
return 0;
}
#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
FINSH_FUNCTION_EXPORT_ALIAS(wifi_msh, __cmd_wifi, wifi command.);
#endif

View File

@ -14,7 +14,11 @@
#include <wlan_prot.h>
#define DBG_ENABLE
#ifdef RT_WLAN_DEV_DEBUG
#define DBG_LEVEL DBG_LOG
#else
#define DBG_LEVEL DBG_INFO
#endif
#define DBG_SECTION_NAME "WLAN.dev"
#define DBG_COLOR
#include <rtdbg.h>
@ -26,6 +30,22 @@
#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;
@ -137,7 +157,7 @@ rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info
rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device)
{
rt_err_t result = 0;
rt_err_t result = RT_EOK;
if (device == RT_NULL)
{
@ -150,7 +170,7 @@ 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])
{
rt_err_t result = 0;
rt_err_t result = RT_EOK;
if (device == RT_NULL)
{
@ -176,7 +196,7 @@ int rt_wlan_dev_get_rssi(struct rt_wlan_device *device)
rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
{
rt_err_t result = 0;
rt_err_t result = RT_EOK;
if (device == RT_NULL)
{
@ -200,32 +220,31 @@ rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
return result;
}
rt_err_t rt_wlan_dev_enable_powersave(struct rt_wlan_device *device)
rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level)
{
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_POWERSAVE, &enable);
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_POWERSAVE, &level);
return result;
}
rt_err_t rt_wlan_dev_disable_powersave(struct rt_wlan_device *device)
int rt_wlan_dev_get_powersave(struct rt_wlan_device *device)
{
rt_err_t result = RT_EOK;
int enable = 0;
int level = 0;
if (device == RT_NULL)
{
return -RT_EIO;
return -1;
}
result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_POWERSAVE, &enable);
return result;
rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_POWERSAVE, &level);
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)
@ -279,7 +298,7 @@ rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_
if (device->handler_table[event][i].handler == handler)
{
rt_memset(&device->handler_table[event][i], 0, sizeof(struct rt_wlan_dev_event_desc));
rt_exit_critical();
rt_hw_interrupt_enable(level);
return RT_EOK;
}
}
@ -323,7 +342,7 @@ void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_de
}
}
rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device)
rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device)
{
rt_err_t result = RT_EOK;
int enable = 1;
@ -337,7 +356,7 @@ rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device)
return result;
}
rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device)
rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device)
{
rt_err_t result = RT_EOK;
int enable = 0;
@ -351,7 +370,7 @@ rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device)
return result;
}
rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
{
if (device == RT_NULL)
{
@ -362,7 +381,7 @@ rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan
return RT_EOK;
}
void rt_wlan_dev_pormisc_handler(struct rt_wlan_device *device, void *data, int len)
void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len)
{
rt_wlan_pormisc_callback_t callback;
@ -616,13 +635,22 @@ static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args)
*rssi = wlan->ops->wlan_get_rssi(wlan);
break;
}
case RT_WLAN_CMD_POWERSAVE:
case RT_WLAN_CMD_SET_POWERSAVE:
{
rt_bool_t enable = *((rt_bool_t *)args);
int level = *((int *)args);
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_POWERSAVE, "RT_WLAN_CMD_POWERSAVE");
if (wlan->ops->wlan_powersave)
wlan->ops->wlan_powersave(wlan, enable);
LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_POWERSAVE, "RT_WLAN_CMD_SET_POWERSAVE");
if (wlan->ops->wlan_set_powersave)
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_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:

View File

@ -34,7 +34,8 @@ typedef enum
RT_WLAN_CMD_AP_DEAUTH,
RT_WLAN_CMD_SCAN_STOP,
RT_WLAN_CMD_GET_RSSI, /* get sensitivity (dBm) */
RT_WLAN_CMD_POWERSAVE,
RT_WLAN_CMD_SET_POWERSAVE,
RT_WLAN_CMD_GET_POWERSAVE,
RT_WLAN_CMD_CFG_PROMISC, /* start/stop minitor */
RT_WLAN_CMD_CFG_FILTER,
RT_WLAN_CMD_SET_CHANNEL,
@ -89,22 +90,6 @@ typedef enum
#define RT_WLAN_DEV_EVENT_NUM (2) /* EVENT GROUP MAX NUM */
#endif
#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
/**
* Enumeration of Wi-Fi security modes
*/
@ -499,7 +484,8 @@ struct rt_wlan_dev_ops
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_powersave)(struct rt_wlan_device *wlan, rt_bool_t enable);
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_set_channel)(struct rt_wlan_device *wlan, int channel);
@ -512,60 +498,84 @@ struct rt_wlan_dev_ops
int (*wlan_send)(struct rt_wlan_device *wlan, void *buff, int 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_disconnect(struct rt_wlan_device *device);
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]);
int rt_wlan_dev_get_rssi(struct rt_wlan_device *device);
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]);
rt_err_t rt_wlan_dev_enable_powersave(struct rt_wlan_device *device);
rt_err_t rt_wlan_dev_disable_powersave(struct rt_wlan_device *device);
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);
rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device);
rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device);
rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback);
void rt_wlan_dev_pormisc_handler(struct rt_wlan_device *device, void *data, int len);
rt_err_t rt_wlan_dev_cfg_filter(struct rt_wlan_device *device, struct rt_wlan_filter *filter);
rt_err_t rt_wlan_dev_set_channel(struct rt_wlan_device *device, int channel);
rt_err_t rt_wlan_dev_get_channel(struct rt_wlan_device *device);
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 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);
rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int len);
/*
* 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);
rt_err_t 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
*/
struct rt_wlan_device *rt_wlan_dev_register(const char *name, const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data);
#ifdef __cplusplus

View File

@ -13,6 +13,7 @@
#include <wlan_dev.h>
#include <wlan_prot.h>
#include <wlan_workqueue.h>
#ifdef RT_USING_LWIP
#include <netif/ethernetif.h>
#include <lwip/netifapi.h>
@ -21,7 +22,11 @@
#endif
#define DBG_ENABLE
#ifdef RT_WLAN_LWIP_DEBUG
#define DBG_LEVEL DBG_LOG
#else
#define DBG_LEVEL DBG_INFO
#endif
#define DBG_SECTION_NAME "WLAN.lwip"
#define DBG_COLOR
#include <rtdbg.h>

View File

@ -17,7 +17,11 @@
#include <wlan_workqueue.h>
#define DBG_ENABLE
#ifdef RT_WLAN_MGNT_DEBUG
#define DBG_LEVEL DBG_LOG
#else
#define DBG_LEVEL DBG_INFO
#endif
#define DBG_SECTION_NAME "WLAN.mgnt"
#define DBG_COLOR
#include <rtdbg.h>
@ -51,6 +55,10 @@
#define DISCONNECT_RESPONSE_TICK (2000)
#if RT_WLAN_EBOX_NUM < 1
#error "event box num Too little"
#endif
struct rt_wlan_mgnt_des
{
struct rt_wlan_device *device;
@ -108,8 +116,6 @@ static struct rt_wlan_event_desc event_tab[RT_WLAN_EVT_MAX];
static struct rt_wlan_complete_des *complete_tab[5];
static struct rt_mutex complete_mutex;
static rt_mailbox_t event_box;
static struct rt_timer reconnect_time;
rt_inline int _sta_is_null(void)
@ -153,7 +159,7 @@ static rt_err_t rt_wlan_send_msg(rt_wlan_dev_event_t event, void *buff, int len)
msg = rt_malloc(sizeof(struct rt_wlan_msg) + len);
if (msg == RT_NULL)
{
RT_WLAN_LOG_E("No memory");
RT_WLAN_LOG_E("wlan mgnt send msg err! No memory");
return -RT_ENOMEM;
}
rt_memset(msg, 0, sizeof(struct rt_wlan_msg) + len);
@ -352,12 +358,12 @@ static rt_err_t rt_wlan_sta_info_del(struct rt_wlan_info *info, int timeout)
return err;
}
static rt_err_t rt_wlan_sta_info_del_all(void)
static rt_err_t rt_wlan_sta_info_del_all(int timeout)
{
struct rt_wlan_sta_list *sta_list, *sta_next;
rt_err_t err = RT_EOK;
err = rt_mutex_take(&sta_info_mutex, rt_tick_from_millisecond(200));
err = rt_mutex_take(&sta_info_mutex, rt_tick_from_millisecond(timeout));
if (err == RT_EOK)
{
/* traversing the list */
@ -370,7 +376,9 @@ static rt_err_t rt_wlan_sta_info_del_all(void)
rt_mutex_release(&sta_info_mutex);
}
if (sta_info.num != 0)
rt_kprintf("zha guo zha guo zha guo\n");
{
RT_WLAN_LOG_W("\n\n!!!Program runing exception!!!\n\n");
}
sta_info.num = 0;
sta_info.node = RT_NULL;
return err;
@ -414,7 +422,7 @@ static void rt_wlan_auto_connect_run(struct rt_work *work, void *parameter)
}
rt_wlan_connect_adv(&cfg_info.info, password);
exit:
MGNT_UNLOCK();
rt_mutex_release(&mgnt_mutex);
level = rt_hw_interrupt_disable();
rt_memset(work, 0, sizeof(struct rt_work));
rt_hw_interrupt_enable(level);
@ -466,24 +474,6 @@ static void rt_wlan_mgnt_work(void *parameter)
}
break;
}
case RT_WLAN_DEV_EVT_AP_ASSOCIATED:
{
/* save sta info */
if (msg->len > 0)
{
rt_wlan_sta_info_add(msg->buff, RT_WAITING_FOREVER);
}
break;
}
case RT_WLAN_DEV_EVT_AP_DISASSOCIATED:
{
/* delete sta info */
if (msg->len > 0)
{
rt_wlan_sta_info_del(msg->buff, RT_WAITING_FOREVER);
}
break;
}
default :
break;
}
@ -558,11 +548,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
RT_WLAN_LOG_D("event: AP_STOP");
_ap_mgnt.state &= ~RT_WLAN_STATE_ACTIVE;
user_event = RT_WLAN_EVT_AP_STOP;
err = rt_wlan_sta_info_del_all();
err = rt_wlan_sta_info_del_all(RT_WAITING_FOREVER);
if (err != RT_NULL)
{
RT_WLAN_LOG_W("AP_STOP event handle fail");
rt_wlan_send_msg(event, RT_NULL, 0);
}
user_buff.data = &_ap_mgnt.info;
user_buff.len = sizeof(struct rt_wlan_info);
@ -574,11 +563,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
user_event = RT_WLAN_EVT_AP_ASSOCIATED;
if (user_buff.len != sizeof(struct rt_wlan_info))
break;
err = rt_wlan_sta_info_add(user_buff.data, 200);
err = rt_wlan_sta_info_add(user_buff.data, RT_WAITING_FOREVER);
if (err != RT_EOK)
{
RT_WLAN_LOG_W("AP_ASSOCIATED event handle fail");
rt_wlan_send_msg(event, user_buff.data, sizeof(struct rt_wlan_info));
}
break;
}
@ -588,11 +576,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
user_event = RT_WLAN_EVT_AP_DISASSOCIATED;
if (user_buff.len != sizeof(struct rt_wlan_info))
break;
err = rt_wlan_sta_info_del(user_buff.data, 200);
err = rt_wlan_sta_info_del(user_buff.data, RT_WAITING_FOREVER);
if (err != RT_EOK)
{
RT_WLAN_LOG_W("AP_DISASSOCIATED event handle fail");
rt_wlan_send_msg(event, user_buff.data, sizeof(struct rt_wlan_info));
}
break;
}
@ -637,7 +624,7 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
}
}
COMPLETE_UNLOCK();
/* 取出用户回调 */
/* Get user callback */
if (user_event < RT_WLAN_EVT_MAX)
{
level = rt_hw_interrupt_disable();
@ -1147,28 +1134,28 @@ rt_err_t rt_wlan_disconnect(void)
return err;
}
int rt_wlan_is_connected(void)
rt_bool_t rt_wlan_is_connected(void)
{
int _connect = 0;
rt_bool_t _connect;
if (_sta_is_null())
{
return 0;
return RT_FALSE;
}
_connect = _sta_mgnt.state & RT_WLAN_STATE_CONNECT ? 1 : 0;
_connect = _sta_mgnt.state & RT_WLAN_STATE_CONNECT ? RT_TRUE : RT_FALSE;
RT_WLAN_LOG_D("%s is run : %s", __FUNCTION__, _connect ? "connect" : "disconnect");
return _connect;
}
int rt_wlan_is_ready(void)
rt_bool_t rt_wlan_is_ready(void)
{
int _ready = 0;
rt_bool_t _ready;
if (_sta_is_null())
{
return 0;
return RT_FALSE;
}
_ready = _sta_mgnt.state & RT_WLAN_STATE_READY ? 1 : 0;
_ready = _sta_mgnt.state & RT_WLAN_STATE_READY ? RT_TRUE : RT_FALSE;
RT_WLAN_LOG_D("%s is run : %s", __FUNCTION__, _ready ? "ready" : "not ready");
return _ready;
}
@ -1392,7 +1379,6 @@ rt_err_t rt_wlan_ap_stop(void)
}
RT_WLAN_LOG_D("%s is run", __FUNCTION__);
/* 调用dev层接口 */
MGNT_LOCK();
/* create event wait complete */
complete = rt_wlan_complete_create("stop_ap");
@ -1435,12 +1421,11 @@ rt_err_t rt_wlan_ap_get_info(struct rt_wlan_info *info)
}
RT_WLAN_LOG_D("%s is run", __FUNCTION__);
/* 返回暂存的ap info */
*info = _ap_mgnt.info;
return RT_EOK;
}
/* 获得sta连接数量 */
/* get sta number */
int rt_wlan_ap_get_sta_num(void)
{
int sta_num = 0;
@ -1452,14 +1437,14 @@ int rt_wlan_ap_get_sta_num(void)
return sta_num;
}
/* 获得sta信息 */
/* get sta info */
int rt_wlan_ap_get_sta_info(struct rt_wlan_info *info, int num)
{
int sta_num = 0, i = 0;
struct rt_wlan_sta_list *sta_list;
STAINFO_LOCK();
/* 找出 num 与 sta_info.num 中较小的那个 */
/* sta_num = min(sta_info.num, num) */
sta_num = sta_info.num > num ? num : sta_info.num;
for (sta_list = sta_info.node; sta_list != RT_NULL && i < sta_num; sta_list = sta_list->next)
{
@ -1471,7 +1456,7 @@ int rt_wlan_ap_get_sta_info(struct rt_wlan_info *info, int num)
return i;
}
/* 踢掉某个sta */
/* deauth sta */
rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
{
rt_err_t err = RT_EOK;
@ -1500,7 +1485,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
}
STAINFO_LOCK();
/* 重缓存中查询有没有这个sta */
/* Search for MAC address from sta list */
for (sta_list = sta_info.node; sta_list != RT_NULL; sta_list = sta_list->next)
{
if (rt_memcmp(&sta_list->info.bssid[0], &mac[0], RT_WLAN_BSSID_MAX_LENGTH) == 0)
@ -1511,7 +1496,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
}
STAINFO_UNLOCK();
/* 没有找个这个sta退出 */
/* No MAC address was found. return */
if (find_flag != RT_TRUE)
{
RT_WLAN_LOG_E("Not find mac addr");
@ -1519,7 +1504,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
return -RT_ERROR;
}
/* 调用dev层接口提到sta */
/* Kill STA */
err = rt_wlan_dev_ap_deauth(AP_DEVICE(), mac);
if (err != RT_NULL)
{
@ -1767,7 +1752,7 @@ int rt_wlan_scan_find_cache(struct rt_wlan_info *info, struct rt_wlan_info *out_
return count;
}
rt_err_t rt_wlan_enable_powersave(void)
rt_err_t rt_wlan_set_powersave(int level)
{
rt_err_t err = RT_EOK;
@ -1777,24 +1762,24 @@ rt_err_t rt_wlan_enable_powersave(void)
}
RT_WLAN_LOG_D("%s is run", __FUNCTION__);
MGNT_LOCK();
err = rt_wlan_dev_enable_powersave(STA_DEVICE());
err = rt_wlan_dev_set_powersave(STA_DEVICE(), level);
MGNT_UNLOCK();
return err;
}
rt_err_t rt_wlan_disable_powersave(void)
int rt_wlan_get_powersave(void)
{
rt_err_t err = RT_EOK;
int level;
if (_sta_is_null())
{
return -RT_EIO;
return -1;
}
RT_WLAN_LOG_D("%s is run", __FUNCTION__);
MGNT_LOCK();
err = rt_wlan_dev_disable_powersave(STA_DEVICE());
level = rt_wlan_dev_get_powersave(STA_DEVICE());
MGNT_UNLOCK();
return err;
return level;
}
rt_err_t rt_wlan_register_event_handler(rt_wlan_event_t event, rt_wlan_event_handler handler, void *parameter)
@ -1890,10 +1875,6 @@ int rt_wlan_init(void)
rt_mutex_init(&complete_mutex, "complete", RT_IPC_FLAG_FIFO);
rt_timer_init(&reconnect_time, "wifi_tim", rt_wlan_cyclic_check, RT_NULL, DISCONNECT_RESPONSE_TICK, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
rt_timer_start(&reconnect_time);
/* create event */
event_box = rt_mb_create("wlan", RT_WLAN_EBOX_NUM, RT_IPC_FLAG_FIFO);
if (event_box == RT_NULL)
RT_ASSERT(event_box != RT_NULL);
_init_flag = 1;
}
return 0;

View File

@ -37,21 +37,17 @@ extern "C" {
#define RT_WLAN_EBOX_NUM (10)
#endif
#if RT_WLAN_EBOX_NUM < 1
#error "event box num Too little"
#endif
/*state fot station*/
#define RT_WLAN_STATE_CONNECT (0x1 << 0)
#define RT_WLAN_STATE_CONNECTING (0x1 << 1)
#define RT_WLAN_STATE_READY (0x1 << 2)
#define RT_WLAN_STATE_POWERSAVE (0x1 << 3)
#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 (0x1 << 0)
#define RT_WLAN_STATE_AUTOEN (1UL << 0)
/*state fot ap*/
#define RT_WLAN_STATE_ACTIVE (0x1 << 0)
#define RT_WLAN_STATE_ACTIVE (1UL << 0)
typedef enum
{
@ -89,8 +85,8 @@ rt_wlan_mode_t rt_wlan_get_mode(const char *dev_name);
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);
int rt_wlan_is_connected(void);
int rt_wlan_is_ready(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);
@ -132,8 +128,8 @@ rt_bool_t rt_wlan_get_autoreconnect_mode(void);
/*
* wifi power management interface
*/
rt_err_t rt_wlan_enable_powersave(void);
rt_err_t rt_wlan_disable_powersave(void);
rt_err_t rt_wlan_set_powersave(int level);
int rt_wlan_get_powersave(void);
/*
* wifi event management interface

View File

@ -14,11 +14,19 @@
#include <wlan_prot.h>
#define DBG_ENABLE
#ifdef RT_WLAN_PROT_DEBUG
#define DBG_LEVEL DBG_LOG
#else
#define DBG_LEVEL DBG_INFO
#endif
#define DBG_SECTION_NAME "WLAN.prot"
#define DBG_COLOR
#include <rtdbg.h>
#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;

View File

@ -25,10 +25,6 @@ extern "C" {
#define RT_LWAN_ID_PREFIX (0x5054)
#if RT_WLAN_PROT_NAME_LEN < 4
#error "The name is too short"
#endif
#define RT_WLAN_PROT_LWIP ("lwip")
typedef enum