static int wps_find_out_triger_wps_AP(char *target_ssid, u16 config_method) { internal_wps_scan_handler_arg_t wps_arg = {0}; wps_password_id = 0xFF; wps_arg.isoverlap = -1; wps_arg.config_method = config_method; wps_arg.target_ssid = target_ssid; rtw_init_sema(&wps_arg.scan_sema, 0); if(wps_arg.scan_sema == NULL) return RTW_ERROR; if(wifi_scan_networks(wps_scan_result_handler, &wps_arg ) != RTW_SUCCESS){ printf("\n\rERROR: wifi scan failed"); goto exit; } if(rtw_down_timeout_sema(&wps_arg.scan_sema, SCAN_LONGEST_WAIT_TIME) == RTW_FALSE){ printf("\r\nWPS scan done early!\r\n"); } exit: rtw_free_sema(&wps_arg.scan_sema); return wps_arg.isoverlap; }
void Ticker::ticker_init(void) { rtw_init_sema(&this->ticker_thread_sema, 0); tasklet.pthread = (os_pthread)(&ticker_thread); tasklet.tpriority = osPriorityRealtime; tasklet.stacksize = DEFAULT_STACK_SIZE; tasklet.stack_pointer = &this->stack[0]; _tid = osThreadCreate(&this->tasklet, this); }
int wifi_connect_bssid( unsigned char bssid[ETH_ALEN], char *ssid, rtw_security_t security_type, char *password, int bssid_len, int ssid_len, int password_len, int key_id, void *semaphore) { xSemaphoreHandle join_semaphore; rtw_result_t result = RTW_SUCCESS; #if CONFIG_JD_SMART send_wifi_network_status(2);//connecting with ap #endif rtw_join_status = 0;//clear for last connect status error_flag = 0 ;//clear for last connect status internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t)); if(!join_result) { return RTW_NOMEM; } if(ssid_len && ssid){ join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len; rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len); } rtw_memcpy(join_result->network_info.bssid.octet, bssid, bssid_len); if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) || ( password_len < RTW_MIN_PSK_LEN ) ) && ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) || ( security_type == RTW_SECURITY_WPA_AES_PSK ) || ( security_type == RTW_SECURITY_WPA2_AES_PSK ) || ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) || ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )|| (((password_len != 5)&& (password_len != 13))&& ((security_type == RTW_SECURITY_WEP_PSK)|| (security_type ==RTW_SECURITY_WEP_SHARED ) ))) { return RTW_INVALID_KEY; } join_result->network_info.password_len = password_len; if(password_len) { /* add \0 to the end */ join_result->network_info.password = rtw_zmalloc(password_len + 1); if(!join_result->network_info.password) { return RTW_NOMEM; } rtw_memcpy(join_result->network_info.password, password, password_len); } join_result->network_info.security_type = security_type; join_result->network_info.key_id = key_id; if(semaphore == NULL) { rtw_init_sema( &join_result->join_sema, 0 ); if(!join_result->join_sema){ return RTW_NORESOURCE; } join_semaphore = join_result->join_sema; } else { join_result->join_sema = semaphore; } wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL); wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL); wifi_connect_bssid_local(&join_result->network_info); join_user_data = join_result; if(semaphore == NULL) { if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) { printf("RTW API: Join bss timeout\r\n"); if(password_len) { rtw_free(join_result->network_info.password); } rtw_free((u8*)join_result); rtw_free_sema( &join_semaphore); result = RTW_TIMEOUT; goto error; } else { rtw_free_sema( &join_semaphore ); if(join_result->network_info.password_len) { rtw_free(join_result->network_info.password); } rtw_free((u8*)join_result); if(wifi_is_connected_to_ap( ) != RTW_SUCCESS) { result = RTW_ERROR; goto error; } } } result = RTW_SUCCESS; #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART restore_wifi_info_to_flash(); #endif error: join_user_data = NULL; wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl); wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl); wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl); return result; }
//----------------------------------------------------------------------------// int wifi_connect( char *ssid, rtw_security_t security_type, char *password, int ssid_len, int password_len, int key_id, void *semaphore) { xSemaphoreHandle join_semaphore; rtw_result_t result = RTW_SUCCESS; u8 wep_hex = 0; u8 wep_pwd[14] = {0}; #if CONFIG_JD_SMART send_wifi_network_status(2);//connecting with ap #endif rtw_join_status = 0;//clear for last connect status error_flag = RTW_UNKNOWN ;//clear for last connect status internal_join_result_t *join_result = (internal_join_result_t *)rtw_zmalloc(sizeof(internal_join_result_t)); if(!join_result) { return RTW_NOMEM; } join_result->network_info.ssid.len = ssid_len > 32 ? 32 : ssid_len; rtw_memcpy(join_result->network_info.ssid.val, ssid, ssid_len); if ( ( ( ( password_len > RTW_MAX_PSK_LEN ) || ( password_len < RTW_MIN_PSK_LEN ) ) && ( ( security_type == RTW_SECURITY_WPA_TKIP_PSK ) || ( security_type == RTW_SECURITY_WPA_AES_PSK ) || ( security_type == RTW_SECURITY_WPA2_AES_PSK ) || ( security_type == RTW_SECURITY_WPA2_TKIP_PSK ) || ( security_type == RTW_SECURITY_WPA2_MIXED_PSK ) ) )) { error_flag = RTW_WRONG_PASSWORD; return RTW_INVALID_KEY; } if ((security_type == RTW_SECURITY_WEP_PSK)|| (security_type ==RTW_SECURITY_WEP_SHARED)) { if ((password_len != 5) && (password_len != 13) && (password_len != 10)&& (password_len != 26)) { error_flag = RTW_WRONG_PASSWORD; return RTW_INVALID_KEY; } else { if(password_len == 10) { u32 p[5]; u8 i = 0; sscanf((const char*)password, "%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4]); for(i=0; i< 5; i++) wep_pwd[i] = (u8)p[i]; wep_pwd[5] = '\0'; password_len = 5; wep_hex = 1; } else if (password_len == 26) { u32 p[13]; u8 i = 0; sscanf((const char*)password, "%02x%02x%02x%02x%02x%02x%02x"\ "%02x%02x%02x%02x%02x%02x", &p[0], &p[1], &p[2], &p[3], &p[4],\ &p[5], &p[6], &p[7], &p[8], &p[9], &p[10], &p[11], &p[12]); for(i=0; i< 13; i++) wep_pwd[i] = (u8)p[i]; wep_pwd[13] = '\0'; password_len = 13; wep_hex = 1; } } } join_result->network_info.password_len = password_len; if(password_len) { /* add \0 to the end */ join_result->network_info.password = rtw_zmalloc(password_len + 1); if(!join_result->network_info.password) { return RTW_NOMEM; } if (0 == wep_hex) rtw_memcpy(join_result->network_info.password, password, password_len); else rtw_memcpy(join_result->network_info.password, wep_pwd, password_len); } join_result->network_info.security_type = security_type; join_result->network_info.key_id = key_id; if(semaphore == NULL) { rtw_init_sema( &join_result->join_sema, 0 ); if(!join_result->join_sema) { return RTW_NORESOURCE; } join_semaphore = join_result->join_sema; } else { join_result->join_sema = semaphore; } wifi_reg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl,NULL); wifi_reg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, wifi_disconn_hdl, NULL); wifi_reg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl, NULL); wifi_connect_local(&join_result->network_info); join_user_data = join_result; if(semaphore == NULL) { if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) { printf("RTW API: Join bss timeout\r\n"); if(password_len) { rtw_free(join_result->network_info.password); } result = RTW_TIMEOUT; goto error; } else { if(join_result->network_info.password_len) { rtw_free(join_result->network_info.password); } if(wifi_is_connected_to_ap( ) != RTW_SUCCESS) { result = RTW_ERROR; goto error; } } } result = RTW_SUCCESS; #if CONFIG_EXAMPLE_WLAN_FAST_CONNECT || CONFIG_JD_SMART restore_wifi_info_to_flash(); #endif error: if(semaphore == NULL){ join_user_data = NULL; rtw_free((u8*)join_result); rtw_free_sema( &join_semaphore); wifi_unreg_event_handler(WIFI_EVENT_CONNECT, wifi_connected_hdl); wifi_unreg_event_handler(WIFI_EVENT_NO_NETWORK,wifi_no_network_hdl); wifi_unreg_event_handler(WIFI_EVENT_FOURWAY_HANDSHAKE_DONE, wifi_handshake_done_hdl); } return result; }
int wifi_scan_networks(rtw_scan_result_handler_t results_handler, void* user_data) { unsigned int max_ap_size = 64; #if SCAN_USE_SEMAPHORE rtw_bool_t result; if(NULL == scan_result_handler_ptr.scan_semaphore) rtw_init_sema(&scan_result_handler_ptr.scan_semaphore, 1); scan_result_handler_ptr.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(&scan_result_handler_ptr.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(&scan_result_handler_ptr.scan_semaphore); return RTW_TIMEOUT; } #else if(scan_result_handler_ptr.scan_running){ int count = 100; while(scan_result_handler_ptr.scan_running && count > 0) { rtw_msleep_os(20); count --; } if(count == 0){ printf("\n\r[%d]WiFi: Scan is running. Wait 2s timeout.", rtw_get_current_time()); return RTW_TIMEOUT; } } scan_result_handler_ptr.scan_start_time = rtw_get_current_time(); scan_result_handler_ptr.scan_running = 1; #endif scan_result_handler_ptr.gscan_result_handler = results_handler; scan_result_handler_ptr.max_ap_size = max_ap_size; scan_result_handler_ptr.ap_details = (rtw_scan_result_t*)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t)); if(scan_result_handler_ptr.ap_details == NULL){ goto error_with_result_ptr; } rtw_memset(scan_result_handler_ptr.ap_details, 0, max_ap_size*sizeof(rtw_scan_result_t)); scan_result_handler_ptr.pap_details = (rtw_scan_result_t**)rtw_zmalloc(max_ap_size*sizeof(rtw_scan_result_t*)); if(scan_result_handler_ptr.pap_details == NULL) return RTW_ERROR; rtw_memset(scan_result_handler_ptr.pap_details, 0, max_ap_size); scan_result_handler_ptr.scan_cnt = 0; scan_result_handler_ptr.scan_complete = RTW_FALSE; scan_result_handler_ptr.user_data = user_data; if (wifi_scan( RTW_SCAN_COMMAMD<<4 | RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, NULL) != RTW_SUCCESS) { goto error_with_result_ptr; } return RTW_SUCCESS; error_with_result_ptr: rtw_free((u8*)scan_result_handler_ptr.pap_details); scan_result_handler_ptr.pap_details = NULL; return RTW_ERROR; }