diff --git a/components/drivers/wlan/wlan_dev.c b/components/drivers/wlan/wlan_dev.c index cbfd50a6c36e86765253c673c5d99cd34ea997f7..4241476a2bcca1f118cd6d5172c8aeb072f3938a 100644 --- a/components/drivers/wlan/wlan_dev.c +++ b/components/drivers/wlan/wlan_dev.c @@ -574,6 +574,77 @@ rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int #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; @@ -716,6 +787,15 @@ static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args) 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; diff --git a/components/drivers/wlan/wlan_dev.h b/components/drivers/wlan/wlan_dev.h index 43d6506d6f470110ef88bf4f89bd4ce1e44d2ed7..3019afb19d7a52750923e1dc591995b6a1c7d7e4 100644 --- a/components/drivers/wlan/wlan_dev.h +++ b/components/drivers/wlan/wlan_dev.h @@ -37,7 +37,8 @@ typedef enum 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_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, @@ -360,6 +361,8 @@ typedef void (*rt_wlan_dev_event_handler)(struct rt_wlan_device *device, rt_wlan 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; @@ -445,6 +448,7 @@ struct rt_wlan_device 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; @@ -495,6 +499,7 @@ struct rt_wlan_dev_ops 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); @@ -503,6 +508,7 @@ struct rt_wlan_dev_ops 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); }; /*