This commit is contained in:
pvvx 2017-04-24 17:03:34 +03:00
parent f8449c5ae3
commit 01d402f038
16 changed files with 2552 additions and 2324 deletions

View file

@ -161,6 +161,7 @@
extern void *pvPortMalloc( size_t xWantedSize );
extern void vPortFree( void *pv );
#define malloc pvPortMalloc
#define zalloc pvPortZalloc
#define free vPortFree
#endif
#elif defined (CONFIG_PLATFORM_8711B)

View file

@ -69,7 +69,7 @@ extern struct netif xnetif[NET_IF_NUM];
/******************************************************
* Variables Definitions
******************************************************/
static internal_scan_handler_t scan_result_handler_ptr = {
internal_scan_handler_t scan_result_handler_ptr = {
0, 0, 0, RTW_FALSE, 0, 0, 0, 0, 0 };
static internal_join_result_t* join_user_data;
rtw_mode_t wifi_mode = RTW_MODE_NONE;
@ -1260,8 +1260,7 @@ int wifi_start_ap_with_hidden_ssid(char *ssid, rtw_security_t security_type,
}
*/
void wifi_scan_each_report_hdl(char* buf, int buf_len, int flags,
void* userdata) {
void wifi_scan_each_report_hdl(char* buf, int buf_len, int flags, void* userdata) {
int i = 0;
int j = 0;
int insert_pos = 0;

View file

@ -75,16 +75,16 @@ typedef struct {
typedef struct internal_scan_handler{
rtw_scan_result_t** pap_details;
rtw_scan_result_t * ap_details;
int scan_cnt;
rtw_bool_t scan_complete;
int scan_cnt;
rtw_bool_t scan_complete;
unsigned char max_ap_size;
rtw_scan_result_handler_t gscan_result_handler;
#if SCAN_USE_SEMAPHORE
void *scan_semaphore;
void * scan_semaphore;
#else
int scan_running;
int scan_running;
#endif
void* user_data;
void * user_data;
unsigned int scan_start_time;
} internal_scan_handler_t;

View file

@ -449,15 +449,17 @@ int wext_get_rssi(const char *ifname, int *rssi) {
return ret;
}
int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config,
__u8 length) {
int wext_set_pscan_channel(const char *ifname,
__u8 *ch,
__u8 *pscan_config,
__u8 length) {
struct iwreq iwr;
int ret = -1;
__u8 *para;
int i = 0;
memset(&iwr, 0, sizeof(iwr));
//Format of para:function_name num_channel chan1... pscan_config1 ...
para = pvPortMalloc((length + length + 1) + 12);//size:num_chan + num_time + length + function_name
para = pvPortMalloc((length + length + 1) + 12); //size:num_chan + num_time + length + function_name
if (para != NULL) {
//Cmd
snprintf((char*) para, 12, "PartialScan");
@ -480,6 +482,7 @@ int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config,
#endif
return ret;
}
int wext_set_channel(const char *ifname, __u8 ch) {
struct iwreq iwr;
memset(&iwr, 0, sizeof(iwr));

View file

@ -605,8 +605,8 @@ unsigned char *tab_txt_rtw_secyrity[] = {
"WEP SHARED", //2 WEP Security with shared authentication
"WPA TKIP", //3 WPA Security with TKIP
"WPA AES", //4 WPA Security with AES
"WPA2 AES", //5 WPA2 Security with TKIP
"WPA2 TKIP", //6 WPA2 Security with AES
"WPA2 TKIP", //5 WPA2 Security with TKIP
"WPA2 AES", //6 WPA2 Security with AES
"WPA2 Mixed", //7 WPA2 Security with AES & TKIP
"WPA/WPA2 AES", //8 WPA/WPA2 Security
"Unknown" //9
@ -625,6 +625,7 @@ unsigned int tab_code_rtw_secyrity[] = {
RTW_SECURITY_UNKNOWN //9
};
/*
unsigned char *tab_txt_rtw_eccryption[] = {
"Unknown",
"OPEN",
@ -638,19 +639,18 @@ unsigned char *tab_txt_rtw_eccryption[] = {
"WEP104",
"Udef" // 0xff
};
*/
rtw_security_t idx_to_rtw_security(unsigned char idx)
{
if(idx > 8) idx = 5;
if(idx > 8) idx = 5; // RTW_SECURITY_WPA2_MIXED_PSK
return (rtw_security_t)tab_code_rtw_secyrity[idx];
}
unsigned char rtw_security_to_idx(rtw_security_t rtw_sec_type)
{
unsigned char i = 0;
for(; rtw_sec_type != tab_code_rtw_secyrity[i] && tab_code_rtw_secyrity[i] != RTW_SECURITY_UNKNOWN; i++);
i++;
while(rtw_sec_type != tab_code_rtw_secyrity[i] && tab_code_rtw_secyrity[i] != RTW_SECURITY_UNKNOWN) i++;
return i;
}

View file

@ -30,6 +30,8 @@ extern char str_rom_57ch3Dch0A[]; // "==========================================
#define BID_ST_DHCP_CFG (1 << 3)
#define BID_WIFI_CFG (1 << 4)
#define BID_ALL_WIFI_CFG (BID_WIFI_AP_CFG|BID_WIFI_ST_CFG|BID_AP_DHCP_CFG|BID_ST_DHCP_CFG)
#define WLAN_ST_NETIF_NUM wlan_st_netifn
#define WLAN_AP_NETIF_NUM wlan_ap_netifn
//==== FEEP_ID ===========================
@ -122,7 +124,6 @@ uint32 write_wifi_cfg(uint32 flg);
int wifi_run(rtw_mode_t mode);
void wifi_init(void);
extern unsigned char *tab_txt_rtw_eccryption[];
rtw_security_t idx_to_rtw_security(unsigned char idx);
unsigned char rtw_security_to_idx(rtw_security_t rtw_sec_type);
unsigned char * rtw_security_to_str(rtw_security_t rtw_sec_type);

View file

@ -0,0 +1,224 @@
/*
* wifi_api_scan.c
*
* Created on: 23/04/2017
* Author: pvvx
*/
#include "FreeRTOS.h"
#include <autoconf.h>
#include "main.h"
#include <platform_opts.h>
#if CONFIG_EXAMPLE_WLAN_FAST_CONNECT
#error "Udnef CONFIG_EXAMPLE_WLAN_FAST_CONNECT!"
#endif
#ifndef USE_FLASH_EEP
#error "Define USE_FLASH_EEP!"
#endif
#include "task.h"
#include <platform/platform_stdlib.h>
#include <wifi/wifi_conf.h>
#include "flash_api.h"
#include <lwip_netconf.h>
#include "dhcp/dhcps.h"
#include "ethernetif.h"
#if CONFIG_ETHERNET
#include "ethernet_mii/ethernet_mii.h"
#endif
#include "wlan_lib.h"
#include "flash_eep.h"
#include "feep_config.h"
#include "wifi_api.h"
#include "main.h"
#include "wifi_user_set.h"
/******************************************************
* Constants
******************************************************/
#define SCAN_USE_SEMAPHORE 0
#define MAX_AP_SIZE 64
extern internal_scan_handler_t scan_result_handler_ptr;
void wifi_scan_each_report_hdl(char* buf, int buf_len, int flags, void* userdata);
/*
xQueueWiFiScan = xQueueCreate(25, sizeof(rtw_scan_result_t)); // Create a queue...
if(xQueueWebSrv) {
*/
LOCAL void _wifi_scan_done_hdl(char* buf, int buf_len, int flags, void* userdata) {
int i = 0;
internal_scan_handler_t * pscan_rec = &scan_result_handler_ptr;
rtw_scan_handler_result_t scan_result_report;
for (i = 0; i < pscan_rec->scan_cnt; i++) {
rtw_memcpy(&scan_result_report.ap_details,
pscan_rec->pap_details[i],
sizeof(rtw_scan_result_t));
scan_result_report.scan_complete = pscan_rec->scan_complete;
scan_result_report.user_data = pscan_rec->user_data;
(*pscan_rec->gscan_result_handler)(&scan_result_report);
}
pscan_rec->scan_complete = RTW_TRUE;
scan_result_report.scan_complete = RTW_TRUE;
(*pscan_rec->gscan_result_handler)(&scan_result_report);
rtw_free(pscan_rec->ap_details);
rtw_free(pscan_rec->pap_details);
#if SCAN_USE_SEMAPHORE
rtw_up_sema(&pscan_rec->scan_semaphore);
#else
pscan_rec->scan_running = 0;
#endif
wifi_unreg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl);
wifi_unreg_event_handler(WIFI_EVENT_SCAN_DONE, _wifi_scan_done_hdl);
return;
}
/* -------- WiFi Scan ------------------------------- */
LOCAL int _wifi_scan(rtw_scan_type_t scan_type, rtw_bss_type_t bss_type) {
int ret;
scan_buf_arg * pscan_buf;
u16 flags = scan_type | (bss_type << 8);
wifi_reg_event_handler(WIFI_EVENT_SCAN_RESULT_REPORT, wifi_scan_each_report_hdl, NULL);
wifi_reg_event_handler(WIFI_EVENT_SCAN_DONE, _wifi_scan_done_hdl, NULL);
return wext_set_scan(WLAN0_NAME, NULL, 0, flags);
}
/* -------- WiFi Scan ------------------------------- */
LOCAL int _wifi_scan_networks(rtw_scan_result_handler_t results_handler) {
internal_scan_handler_t * pscan_rec = &scan_result_handler_ptr;
#if SCAN_USE_SEMAPHORE
rtw_bool_t result;
if(NULL == pscan_rec->scan_semaphore)
rtw_init_sema(&pscan_rec->scan_semaphore, 1);
pscan_rec->scan_start_time = rtw_get_current_time();
/* Initialise the semaphore that will prevent simultaneous access - cannot be a mutex, since
* we don't want to allow the same thread to start a new scan */
result = (rtw_bool_t)rtw_down_timeout_sema(&pscan_rec->scan_semaphore, SCAN_LONGEST_WAIT_TIME);
if ( result != RTW_TRUE )
{
/* Return error result, but set the semaphore to work the next time */
rtw_up_sema(&pscan_rec->scan_semaphore);
return RTW_TIMEOUT;
}
#else
if (pscan_rec->scan_running) {
int count = 100;
while (pscan_rec->scan_running && count > 0) {
rtw_msleep_os(20);
count--;
}
if (count == 0) {
printf("[%d]WiFi: Scan is running. Wait 2s timeout.\n",
rtw_get_current_time());
return RTW_TIMEOUT;
}
}
pscan_rec->scan_start_time = rtw_get_current_time();
pscan_rec->scan_running = 1;
#endif
pscan_rec->gscan_result_handler = results_handler;
pscan_rec->max_ap_size = MAX_AP_SIZE;
pscan_rec->ap_details = (rtw_scan_result_t*) rtw_zmalloc(MAX_AP_SIZE * sizeof(rtw_scan_result_t) + MAX_AP_SIZE * sizeof(rtw_scan_result_t*));
if (pscan_rec->ap_details != NULL) {
pscan_rec->pap_details = (rtw_scan_result_t**) (&pscan_rec->ap_details[MAX_AP_SIZE]);
pscan_rec->scan_cnt = 0;
pscan_rec->scan_complete = RTW_FALSE;
pscan_rec->user_data = NULL; // ?????????
if (_wifi_scan(RTW_SCAN_COMMAMD << 4 | RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY) == RTW_SUCCESS) {
return RTW_SUCCESS;
};
rtw_free((u8*)pscan_rec->ap_details);
};
rtw_memset((void *) pscan_rec, 0, sizeof(internal_scan_handler_t));
return RTW_ERROR;
}
/* -------- WiFi Scan ------------------------------- */
#define scan_channels 14
/* -------- WiFi Scan ------------------------------- */
LOCAL int wext_set_pscan_channels(void) {
struct iwreq iwr;
int ret = -1;
__u8 *para;
int i = 0;
rtw_memset(&iwr, 0, sizeof(iwr));
//Format of para:function_name num_channel chan1... pscan_config1 ...
iwr.u.data.length = (scan_channels + scan_channels + 1) + 12;
para = pvPortMalloc((scan_channels + scan_channels + 1) + 12); //size:num_chan + num_time + length + function_name
iwr.u.data.pointer = para;
if (para != NULL) {
//Cmd
rtw_memcpy((char*) para, "PartialScan", 12);
//length
*(para + 12) = scan_channels;
for (i = 0; i < scan_channels; i++) {
*(para + 13 + i) = i + 1;
*((__u16 *) (para + 13 + scan_channels + i)) = PSCAN_ENABLE;
}
ret = iw_ioctl(WLAN0_NAME, SIOCDEVPRIVATE, &iwr);
vPortFree(para);
}
#if CONFIG_DEBUG_LOG > 3
else {
error_printf("%s: Can't malloc memory!\n", __func__);
}
#endif
return ret;
}
/* -------- WiFi Scan ------------------------------- */
LOCAL volatile uint8_t scan_end;
/* -------- WiFi Scan ------------------------------- */
LOCAL rtw_result_t _scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
{
if (malloced_scan_result->scan_complete != RTW_TRUE) {
rtw_scan_result_t* record = &malloced_scan_result->ap_details;
record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */
if(scan_end == 1) {
printf("\nScan networks:\n\n");
printf("N\tType\tMAC\t\t\tSignal\tCh\tWPS\tSecyrity\tSSID\n\n");
};
printf("%d\t", scan_end++);
printf("%s\t", (record->bss_type == RTW_BSS_TYPE_ADHOC)? "Adhoc": "Infra");
printf(MAC_FMT, MAC_ARG(record->BSSID.octet));
printf("\t%d\t", record->signal_strength);
printf("%d\t", record->channel);
printf("%d\t", record->wps_type);
{
uint8 * s = rtw_security_to_str(record->security);
printf("%s\t", s);
if(strlen(s) < 8) printf("\t");
}
printf("%s\n", record->SSID.val);
} else {
scan_end = 0;
printf("\n");
}
return RTW_SUCCESS;
}
/* -------- WiFi Scan ------------------------------- */
void api_wifi_scan(void)
{
scan_end = 1;
if(wext_set_pscan_channels() < 0){
error_printf("ERROR: wifi set partial scan channel fail\n");
} else if(_wifi_scan_networks(_scan_result_handler) != RTW_SUCCESS){
error_printf("ERROR: wifi scan failed\n");
} else {
int i = 300;
while(i-- && scan_end) {
vTaskDelay(10);
};
};
}

View file

@ -119,15 +119,15 @@ typedef enum
* AP mode support OPEN and WPA2.
*/
typedef enum {
RTW_SECURITY_OPEN = 0, /**< Open security */
RTW_SECURITY_WEP_PSK = WEP_ENABLED, /**< WEP Security with open authentication */
RTW_SECURITY_WEP_SHARED = ( WEP_ENABLED | SHARED_ENABLED ), /**< WEP Security with shared authentication */
RTW_SECURITY_WPA_TKIP_PSK = ( WPA_SECURITY | TKIP_ENABLED ), /**< WPA Security with TKIP */
RTW_SECURITY_WPA_AES_PSK = ( WPA_SECURITY | AES_ENABLED ), /**< WPA Security with AES */
RTW_SECURITY_WPA2_AES_PSK = ( WPA2_SECURITY | AES_ENABLED ), /**< WPA2 Security with AES */
RTW_SECURITY_WPA2_TKIP_PSK = ( WPA2_SECURITY | TKIP_ENABLED ), /**< WPA2 Security with TKIP */
RTW_SECURITY_WPA2_MIXED_PSK = ( WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA2 Security with AES & TKIP */
RTW_SECURITY_WPA_WPA2_MIXED = ( WPA_SECURITY | WPA2_SECURITY ), /**< WPA/WPA2 Security */
RTW_SECURITY_OPEN = 0, /*0*< Open security */
RTW_SECURITY_WEP_PSK = WEP_ENABLED, /*1*< WEP Security with open authentication */
RTW_SECURITY_WEP_SHARED = ( WEP_ENABLED | SHARED_ENABLED ), /*2*< WEP Security with shared authentication */
RTW_SECURITY_WPA_TKIP_PSK = ( WPA_SECURITY | TKIP_ENABLED ), /*3*< WPA Security with TKIP */
RTW_SECURITY_WPA_AES_PSK = ( WPA_SECURITY | AES_ENABLED ), /*4*< WPA Security with AES */
RTW_SECURITY_WPA2_AES_PSK = ( WPA2_SECURITY | AES_ENABLED ), /*5*< WPA2 Security with AES */
RTW_SECURITY_WPA2_TKIP_PSK = ( WPA2_SECURITY | TKIP_ENABLED ), /*6*< WPA2 Security with TKIP */
RTW_SECURITY_WPA2_MIXED_PSK = ( WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED ), /*7*< WPA2 Security with AES & TKIP */
RTW_SECURITY_WPA_WPA2_MIXED = ( WPA_SECURITY | WPA2_SECURITY ), /*8*< WPA/WPA2 Security */
RTW_SECURITY_WPS_OPEN = WPS_ENABLED, /**< WPS with open security */
RTW_SECURITY_WPS_SECURE = (WPS_ENABLED | AES_ENABLED), /**< WPS with AES security */

View file

@ -286,25 +286,25 @@ typedef long long __i64;
/* Informative stuff */
#define SIOCSIWRANGE 0x8B0A /* Unused */
#define SIOCGIWRANGE 0x8B0B /* Get range of parameters */
#define SIOCSIWPRIV 0x8B0C /* Unused */
#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */
#define SIOCSIWPRIV 0x8B0C /* Unused */
#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */
#define SIOCSIWSTATS 0x8B0E /* Unused */
#define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */
/* SIOCGIWSTATS is strictly used between user space and the kernel, and
* is never passed to the driver (i.e. the driver will never see it). */
/* Spy support (statistics per MAC address - used for Mobile IP support) */
#define SIOCSIWSPY 0x8B10 /* set spy addresses */
#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */
#define SIOCSIWSPY 0x8B10 /* set spy addresses */
#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */
#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */
#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */
/* Access Point manipulation */
#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */
#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */
#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */
#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */
#define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */
#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */
#define SIOCGIWSCAN 0x8B19 /* get scanning results */
#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */
#define SIOCGIWSCAN 0x8B19 /* get scanning results */
/* 802.11 specific support */
#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */
@ -316,12 +316,12 @@ typedef long long __i64;
* point to a string in user space, like it is done for RANGE... */
/* Other parameters useful in 802.11 and some other devices */
#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */
#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */
#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */
#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */
#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */
#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */
#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */
#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */
#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */
#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */
#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */
#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */
#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */
#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */
#define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -10,13 +10,13 @@
//=========================================
//==== Wlan Config ========================
#define DEF_WIFI_MODE RTW_MODE_STA // RTW_MODE_STA_AP, RTW_MODE_AP, RTW_MODE_STA
#define DEF_WIFI_AP_STATIONS 3 // Max number of STAs, should be 1..3, default is 3
#define DEF_WIFI_COUNTRY RTW_COUNTRY_RU
#define DEF_WIFI_MODE RTW_MODE_STA // Стартовый режим WiFi: RTW_MODE_STA_AP, RTW_MODE_AP, RTW_MODE_STA, RTW_MODE_NONE
#define DEF_WIFI_AP_STATIONS 3 // Max number of STAs, should be 1..3, default is 3
#define DEF_WIFI_COUNTRY RTW_COUNTRY_RU // Страна для установки органичений каналов и прочего...
#define DEF_WIFI_TX_PWR RTW_TX_PWR_PERCENTAGE_50 // RTW_TX_PWR_PERCENTAGE_75 // RTW_TX_PWR_PERCENTAGE_100
#define DEF_WIFI_BGN RTW_NETWORK_BGN // rtw_network_mode_t
#define DEF_WIFI_ST_SLEEP 0 // 0 - none, 1 - on
//#define USE_NETBIOS 3 // 0 - off, 1 - ST, 2 - AP, 3 - AP+ST
#define DEF_WIFI_ST_SLEEP 0 // 0 - none, 1 - on
#define DEF_LOAD_CFG ( 0 \
| BID_WIFI_AP_CFG \
| BID_WIFI_ST_CFG \