mirror of
https://github.com/rtlduino/RTL8710AF_GCC.git
synced 2024-11-21 16:54:16 +00:00
delete joylink.
delete joylink
This commit is contained in:
parent
1f72b8d386
commit
eb2d46e3b2
3 changed files with 0 additions and 1839 deletions
|
@ -1,675 +0,0 @@
|
|||
/*******************************example_joinlink **************************/
|
||||
|
||||
#include "autoconf.h"
|
||||
#include "platform_stdlib.h"
|
||||
#include "wifi_conf.h"
|
||||
#include "wifi_structures.h"
|
||||
#include "osdep_service.h"
|
||||
#include "lwip_netconf.h"
|
||||
#include "task.h"
|
||||
#include "joinlink.h"
|
||||
#include "cJSON.h"
|
||||
|
||||
#include <lwip/sockets.h>
|
||||
#include <lwip/raw.h>
|
||||
#include <lwip/icmp.h>
|
||||
#include <lwip/inet_chksum.h>
|
||||
#include <platform/platform_stdlib.h>
|
||||
|
||||
#define MASK_SIZE_JOINLINK 3
|
||||
#define SOURCE_PORT 101
|
||||
|
||||
//gloable
|
||||
static unsigned char cur_channel = 1;
|
||||
static unsigned char lock_channel = 1;
|
||||
static _timer timer_handler_phase2;
|
||||
static _timer timer_handler_phase1;
|
||||
static u8 joinlink_finished = 0;
|
||||
static u8 security_type = 0xff;
|
||||
static u8 jl_rx_flag = 0;
|
||||
static rtw_scan_result_t *all_channel_scan_result = NULL;
|
||||
static rtw_scan_result_t *p_result = NULL;
|
||||
static int all_channel_ret = 0;
|
||||
static int phase1_finished = 0;
|
||||
static int phase2_started = 0;
|
||||
static u32 start_time = 0;
|
||||
static u32 current_time = 0;
|
||||
static int idx = 1;
|
||||
static int phase1_scanned_channel[14];
|
||||
static char ap_bssid[6];
|
||||
static char aes_key[] = "123456789";
|
||||
|
||||
static void* pre_scan_sema;
|
||||
static int ack_socket;
|
||||
static struct sockaddr_in to_addr;
|
||||
static struct sockaddr_in from_addr;
|
||||
static char header_cmd[] = "cmd";
|
||||
static cJSON *ack_content = NULL;
|
||||
extern struct netif xnetif[];
|
||||
|
||||
void example_joinlink(void);
|
||||
|
||||
static rtw_result_t joinlink_scan_result_handler(rtw_scan_handler_result_t* malloced_scan_result )
|
||||
{
|
||||
|
||||
static int ApNum = 0;
|
||||
//TODO: add timer of 2s, wf, 1021
|
||||
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 */
|
||||
++ApNum;
|
||||
|
||||
if(malloced_scan_result->user_data)
|
||||
memcpy((void *)((char *)malloced_scan_result->user_data+(ApNum-1)*sizeof(rtw_scan_result_t)), (char *)record, sizeof(rtw_scan_result_t));
|
||||
}
|
||||
// scan finished, wf, 1022
|
||||
else
|
||||
{
|
||||
rtw_up_sema(&pre_scan_sema);
|
||||
ApNum = 0;
|
||||
}
|
||||
return RTW_SUCCESS;
|
||||
}
|
||||
|
||||
void* joinlink_all_scan()
|
||||
{
|
||||
int ret = 0;
|
||||
rtw_scan_result_t *joinlink_scan_buf = NULL;
|
||||
|
||||
if(joinlink_scan_buf != NULL)
|
||||
free(joinlink_scan_buf);
|
||||
|
||||
joinlink_scan_buf = (rtw_scan_result_t *)malloc(65*sizeof(rtw_scan_result_t));
|
||||
if(joinlink_scan_buf == NULL){
|
||||
return 0;
|
||||
}
|
||||
memset(joinlink_scan_buf, 0, 65*sizeof(rtw_scan_result_t));
|
||||
|
||||
if((ret = wifi_scan_networks(joinlink_scan_result_handler, joinlink_scan_buf)) != RTW_SUCCESS){
|
||||
printf("[ATWS]ERROR: wifi scan failed\n\r");
|
||||
free(joinlink_scan_buf);
|
||||
return 0;
|
||||
}
|
||||
return joinlink_scan_buf;
|
||||
}
|
||||
|
||||
void joinlink_deinit_content()
|
||||
{
|
||||
rtw_del_timer(&timer_handler_phase2);
|
||||
rtw_del_timer(&timer_handler_phase1);
|
||||
if(all_channel_scan_result)
|
||||
{
|
||||
free(all_channel_scan_result);
|
||||
all_channel_scan_result = NULL;
|
||||
}
|
||||
rtw_free_sema(&pre_scan_sema);
|
||||
joinlink_deinit();
|
||||
|
||||
return;
|
||||
}
|
||||
static char *jl_itoa(int value)
|
||||
{
|
||||
char *val_str;
|
||||
int tmp = value, len = 1;
|
||||
|
||||
while((tmp /= 10) > 0)
|
||||
len ++;
|
||||
|
||||
val_str = (char *) malloc(len + 1);
|
||||
sprintf(val_str, "%d", value);
|
||||
|
||||
return val_str;
|
||||
}
|
||||
|
||||
static void get_ip_str(int *ip_int, char *ip_ch)
|
||||
{
|
||||
char *ip_single = NULL;
|
||||
u8 pos = 0, len = 0;
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
{
|
||||
ip_single = jl_itoa(ip_int[i]);
|
||||
len = strlen(ip_single);
|
||||
memcpy(ip_ch + pos, ip_single,len);
|
||||
free(ip_single);
|
||||
ip_single = NULL;
|
||||
pos += len;
|
||||
if(i == 3)
|
||||
{
|
||||
*(ip_ch + pos) = 0;
|
||||
break;
|
||||
}
|
||||
*(ip_ch + pos) = '.';
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
static int joinlink_set_ack_content(u8 check_sum)
|
||||
{
|
||||
cJSON_Hooks memoryHook;
|
||||
memoryHook.malloc_fn = malloc;
|
||||
memoryHook.free_fn = free;
|
||||
cJSON_InitHooks(&memoryHook);
|
||||
|
||||
if(ack_content != NULL)
|
||||
{
|
||||
cJSON_Delete(ack_content);
|
||||
ack_content = NULL;
|
||||
}
|
||||
if((ack_content = cJSON_CreateObject()) != NULL)
|
||||
{
|
||||
char mac_str[18];
|
||||
u8 pos = 0;
|
||||
memset(mac_str, 0, sizeof(mac_str));
|
||||
for(int i = 0; i < 6; i++)
|
||||
{
|
||||
sprintf(mac_str + pos, "%02x", xnetif[0].hwaddr[i]);
|
||||
pos += 2;
|
||||
if(i != 5)
|
||||
mac_str[pos++] = ':';
|
||||
}
|
||||
|
||||
cJSON_AddItemToObject(ack_content, "deviceid", cJSON_CreateString(mac_str));
|
||||
cJSON_AddItemToObject(ack_content, "code", cJSON_CreateNumber(check_sum));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("create jSON object failure\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 1
|
||||
|
||||
static void recv_cmd(void *para)
|
||||
{
|
||||
int rev_len = 0;
|
||||
char pkt_buf[16];
|
||||
while(1)
|
||||
{
|
||||
vTaskDelay(500);
|
||||
if((rev_len = recvfrom(ack_socket, pkt_buf, sizeof(pkt_buf), 0, NULL, NULL)) >= 0)
|
||||
{
|
||||
if(memcmp(pkt_buf, header_cmd, sizeof(header_cmd)) == 0)
|
||||
{
|
||||
printf("received reboot command, restart join_link process\n");
|
||||
// do we need to reboot?
|
||||
example_joinlink();
|
||||
close(ack_socket);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
static int send_ack(int *dest_ip, int dest_port, u8 sum)
|
||||
{
|
||||
#if CONFIG_LWIP_LAYER
|
||||
int ack_transmit_round;
|
||||
char ip[16];
|
||||
char *jsonString = NULL;
|
||||
int sended_data = 0;
|
||||
|
||||
if(joinlink_set_ack_content(sum) == -1)
|
||||
return -1;
|
||||
|
||||
jsonString = cJSON_Print(ack_content);
|
||||
if(jsonString == NULL)
|
||||
{
|
||||
printf("json string convert failure\n");
|
||||
cJSON_Delete(ack_content);
|
||||
return -1;
|
||||
}
|
||||
|
||||
get_ip_str(dest_ip, ip);
|
||||
|
||||
ack_socket = socket(PF_INET, SOCK_DGRAM, IP_PROTO_UDP);
|
||||
if (ack_socket == -1) {
|
||||
printf("create socket failure\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
FD_ZERO(&to_addr);
|
||||
to_addr.sin_family = AF_INET;
|
||||
to_addr.sin_port = htons(dest_port);
|
||||
to_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
FD_ZERO(&from_addr);
|
||||
from_addr.sin_family = AF_INET;
|
||||
from_addr.sin_port = htons(SOURCE_PORT);
|
||||
to_addr.sin_addr.s_addr = inet_addr(ip);
|
||||
|
||||
if(bind(ack_socket, (struct sockaddr *)&from_addr, sizeof(from_addr)) < 0)
|
||||
{
|
||||
printf("bind to source port error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (ack_transmit_round = 0; ack_transmit_round < 5; ack_transmit_round++) {
|
||||
sended_data = sendto(ack_socket, (unsigned char *)jsonString, strlen(jsonString), 0, (struct sockaddr *) &to_addr, sizeof(struct sockaddr));
|
||||
//printf("\r\nAlready send %d bytes data\n", sended_data);
|
||||
vTaskDelay(100); /* delay 100 ms */
|
||||
}
|
||||
|
||||
if(xTaskCreate(recv_cmd, (char const *)"recv_cmd", 1512, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)
|
||||
printf("%s xTaskCreate failed\n", __FUNCTION__);
|
||||
|
||||
close(ack_socket);
|
||||
if(jsonString)
|
||||
{
|
||||
free(jsonString);
|
||||
jsonString = NULL;
|
||||
}
|
||||
cJSON_Delete(ack_content);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
static void remove_filter()
|
||||
{
|
||||
wifi_disable_packet_filter(1);
|
||||
wifi_disable_packet_filter(2);
|
||||
wifi_remove_packet_filter(1);
|
||||
wifi_remove_packet_filter(2);
|
||||
}
|
||||
|
||||
int joinlink_finish(unsigned char security_type)
|
||||
{
|
||||
int ret = 0;
|
||||
int retry = 3;
|
||||
unsigned char pscan_config = 1;
|
||||
joinlink_result_t result;
|
||||
rtw_security_t security_mode;
|
||||
|
||||
wifi_set_promisc(RTW_PROMISC_DISABLE,NULL,0);
|
||||
remove_filter();
|
||||
|
||||
pscan_config = PSCAN_ENABLE | PSCAN_SIMPLE_CONFIG;
|
||||
ret = joinlink_get_result(&result);
|
||||
if (ret == 0) {
|
||||
printf("get result OK\n");
|
||||
//printf("\r\n joinlink get result ok,ssid = %s, pwd = %s,ssid length = %d,pwd length = %d",
|
||||
// result.ssid, result.pwd, result.ssid_length,result.pwd_length);
|
||||
}
|
||||
else{
|
||||
printf("joinlink result not get!\n");
|
||||
joinlink_deinit_content();
|
||||
return -1;
|
||||
}
|
||||
//ap security type
|
||||
switch(security_type){
|
||||
case RTW_ENCRYPTION_OPEN:
|
||||
security_mode = RTW_SECURITY_OPEN;
|
||||
break;
|
||||
case RTW_ENCRYPTION_WEP40:
|
||||
case RTW_ENCRYPTION_WEP104:
|
||||
security_mode = RTW_SECURITY_WEP_PSK;
|
||||
break;
|
||||
case RTW_ENCRYPTION_WPA_TKIP:
|
||||
case RTW_ENCRYPTION_WPA_AES:
|
||||
case RTW_ENCRYPTION_WPA2_TKIP:
|
||||
case RTW_ENCRYPTION_WPA2_AES:
|
||||
case RTW_ENCRYPTION_WPA2_MIXED:
|
||||
security_mode = RTW_SECURITY_WPA2_AES_PSK;
|
||||
break;
|
||||
case RTW_ENCRYPTION_UNKNOWN:
|
||||
case RTW_ENCRYPTION_UNDEF:
|
||||
default:
|
||||
printf("unknow security mode,connect fail!\n");
|
||||
}
|
||||
|
||||
#if 1
|
||||
while(1){
|
||||
if(wifi_set_pscan_chan(&lock_channel, &pscan_config, 1) < 0){
|
||||
printf("ERROR: wifi set partial scan channel fail\n");
|
||||
break;
|
||||
}
|
||||
printf("wifi_connect\n");
|
||||
//printf("ap_bssid: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", ap_bssid[0],ap_bssid[1],ap_bssid[2],ap_bssid[3],ap_bssid[4],ap_bssid[5]);
|
||||
|
||||
|
||||
ret = wifi_connect((unsigned char *)result.ssid, security_mode,
|
||||
(unsigned char *)result.pwd, result.ssid_length,
|
||||
result.pwd_length,
|
||||
0,NULL);
|
||||
|
||||
if(ret == RTW_SUCCESS){
|
||||
printf("Connect ok!\n");
|
||||
#if CONFIG_LWIP_LAYER
|
||||
/* If not rise priority, LwIP DHCP may timeout */
|
||||
vTaskPrioritySet(NULL, tskIDLE_PRIORITY + 3);
|
||||
/* Start DHCP Client */
|
||||
ret = LwIP_DHCP(0, DHCP_START);
|
||||
vTaskPrioritySet(NULL, tskIDLE_PRIORITY + 1);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if (retry == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
retry--;
|
||||
}
|
||||
if(send_ack(result.source_ip, result.source_port, result.sum) != 0)
|
||||
printf("send ack failure\n");
|
||||
#endif
|
||||
|
||||
joinlink_deinit_content();
|
||||
return 0;
|
||||
|
||||
}
|
||||
// handler for phase2
|
||||
void timer_handler_phase2_func(void *FunctionContext)
|
||||
{
|
||||
// do not switch channel while handle frames, wf, 1021
|
||||
if(jl_rx_flag){
|
||||
rtw_set_timer(&timer_handler_phase2, CHANNEL_SWITCH_TIME - 25);
|
||||
} else {
|
||||
if(cur_channel >= 13)
|
||||
{cur_channel = 1;}
|
||||
else
|
||||
cur_channel ++;
|
||||
wifi_set_channel(cur_channel);
|
||||
rtw_set_timer(&timer_handler_phase2, CHANNEL_SWITCH_TIME);
|
||||
}
|
||||
|
||||
//printf("phase2:wifi switch channel to %d\n",cur_channel);
|
||||
return;
|
||||
}
|
||||
|
||||
// timer handler for the 1st phase, wf, 1022
|
||||
void timer_handler_phase1_func(void *FunctionContext)
|
||||
{
|
||||
// do not switch channel while handle frames, wf, 1021
|
||||
if(jl_rx_flag){
|
||||
rtw_set_timer(&timer_handler_phase1, SSID_SWITCH_TIME - 25);
|
||||
}
|
||||
// switch ssid, wf, 1022
|
||||
else
|
||||
{
|
||||
if(idx >= 14)
|
||||
{
|
||||
phase1_finished = 1;
|
||||
printf("wifi: phase1 scan finished\n");
|
||||
printf("wifi: start phase2 scan\n");
|
||||
// move from pkt handler to here in case no pkt to trigue phase2
|
||||
#if 1
|
||||
if(phase1_finished)
|
||||
{
|
||||
phase1_finished = 0;
|
||||
phase2_started = 1;
|
||||
rtw_cancel_timer(&timer_handler_phase1);
|
||||
//start phase2 for ch1~ch13
|
||||
cur_channel = 1;
|
||||
wifi_set_channel(cur_channel);
|
||||
|
||||
rtw_init_timer(&timer_handler_phase2, NULL, &timer_handler_phase2_func, NULL, "phase_2");
|
||||
rtw_set_timer(&timer_handler_phase2, CHANNEL_SWITCH_TIME);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
while(idx < 14)
|
||||
{
|
||||
if(phase1_scanned_channel[idx])
|
||||
{
|
||||
wifi_set_channel(idx);
|
||||
rtw_set_timer(&timer_handler_phase1, SSID_SWITCH_TIME);
|
||||
//printf("phase1: wifi switch channel to %d\n",idx);
|
||||
idx++;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(idx == 13)
|
||||
rtw_set_timer(&timer_handler_phase1, SSID_SWITCH_TIME);
|
||||
idx++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static void rtl_frame_recv_handle(unsigned char *buf, int len, unsigned char *da, unsigned char *sa, void *user_data) {
|
||||
|
||||
int ret = 0;
|
||||
int fixed_channel;
|
||||
char scanned_ssid[50] = {0};
|
||||
unsigned char *current_bssid = NULL;
|
||||
int scanned_ssid_len = 0;
|
||||
|
||||
//set this flag prevent joinlink_recv interruptted by timer,since timer has higher priority
|
||||
jl_rx_flag = 1;
|
||||
if (joinlink_finished) {
|
||||
jl_rx_flag = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
ret = joinlink_recv(da, sa, len, user_data);
|
||||
if(ret == JOINLINK_STATUS_CHANNEL_LOCKED)
|
||||
{
|
||||
if(phase2_started)
|
||||
{
|
||||
phase2_started = 0;
|
||||
rtw_cancel_timer(&timer_handler_phase2);
|
||||
}
|
||||
else
|
||||
rtw_cancel_timer(&timer_handler_phase1);
|
||||
|
||||
lock_channel = cur_channel;
|
||||
security_type = ((ieee80211_frame_info_t *)user_data)->encrypt;
|
||||
printf("JoinLink locked to channel[%d]\n",lock_channel);
|
||||
|
||||
current_bssid = buf + 4 + ETH_ALEN;
|
||||
memcpy(ap_bssid, current_bssid, 6);
|
||||
|
||||
fixed_channel = promisc_get_fixed_channel(current_bssid, scanned_ssid, &scanned_ssid_len);
|
||||
if (fixed_channel != 0) {
|
||||
printf("JoinLink force fixed to channel[%d]\r\n",fixed_channel);
|
||||
printf("JoinLink ssid scanned[%s]\r\n",scanned_ssid);
|
||||
wifi_set_channel(fixed_channel);
|
||||
}
|
||||
|
||||
}
|
||||
else if(ret == JOINLINK_STATUS_COMPLETE){
|
||||
//wifi_set_promisc(RTW_PROMISC_DISABLE,NULL,0);
|
||||
joinlink_finished = 1;
|
||||
printf("quit promisc mode!\r\n");
|
||||
}
|
||||
//release flag
|
||||
jl_rx_flag = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// callback for promisc packets, like rtk_start_parse_packet in SC, wf, 1021
|
||||
void wifi_promisc_rx(unsigned char* buf, unsigned int len, void* user_data)
|
||||
{
|
||||
unsigned char * da = buf;
|
||||
unsigned char * sa = buf + ETH_ALEN;
|
||||
|
||||
if (joinlink_finished)
|
||||
return;
|
||||
|
||||
rtl_frame_recv_handle(buf, len, da, sa, user_data);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
// the entry point for joinlink
|
||||
void joinlink_process(void *param)
|
||||
{
|
||||
|
||||
while(1)
|
||||
{
|
||||
current_time = xTaskGetTickCount();
|
||||
|
||||
if(joinlink_finished)
|
||||
{
|
||||
printf("joinlink finished\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if((current_time - start_time) > JOINLINK_TIME * configTICK_RATE_HZ)
|
||||
{
|
||||
printf("joinlink timeout\n");
|
||||
break;
|
||||
}
|
||||
|
||||
vTaskDelay(500);
|
||||
}
|
||||
|
||||
joinlink_finish(security_type);
|
||||
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
int joinlink_init_content()
|
||||
{
|
||||
|
||||
int ret = 0;
|
||||
ret = joinlink_init();
|
||||
if(ret < 0){
|
||||
printf("JoinLink init failed!\n");
|
||||
return ret;
|
||||
}
|
||||
memset(phase1_scanned_channel, 0, sizeof(phase1_scanned_channel));
|
||||
security_type = 0xff;
|
||||
cur_channel = 1;
|
||||
lock_channel = 1;
|
||||
joinlink_finished = 0;
|
||||
jl_rx_flag = 0;
|
||||
p_result = NULL;
|
||||
all_channel_ret = 0;
|
||||
phase1_finished = 0;
|
||||
phase2_started = 0;
|
||||
idx = 1;
|
||||
rtw_init_sema(&pre_scan_sema, 0);
|
||||
memset(ap_bssid, 0, sizeof(ap_bssid));
|
||||
set_aes_key(aes_key, sizeof(aes_key) - 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ret:1 indicate suc, else fail
|
||||
int scan_all_channel()
|
||||
{
|
||||
all_channel_scan_result = (rtw_scan_result_t *)joinlink_all_scan();
|
||||
|
||||
if(all_channel_scan_result == NULL)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
void get_phase1_channel()
|
||||
{
|
||||
p_result = all_channel_scan_result;
|
||||
while(p_result->channel)
|
||||
{
|
||||
if((p_result->channel >= 1) && (p_result->channel <= 13))
|
||||
phase1_scanned_channel[p_result->channel] = 1;
|
||||
p_result++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// now only accept mcast and bcast pkt
|
||||
static void filter_add_enable()
|
||||
{
|
||||
u8 mask[MASK_SIZE_JOINLINK]={0xFF,0xFF,0xFF};
|
||||
u8 pattern[MASK_SIZE_JOINLINK]={0x01,0x00,0x5e};
|
||||
u8 pattern_bcast[MASK_SIZE_JOINLINK]={0xff,0xff,0xff};
|
||||
|
||||
rtw_packet_filter_pattern_t packet_filter;
|
||||
rtw_packet_filter_pattern_t packet_filter_bcast;
|
||||
rtw_packet_filter_rule_e rule;
|
||||
|
||||
packet_filter.offset = 0;
|
||||
packet_filter.mask_size = 3;
|
||||
packet_filter.mask = mask;
|
||||
packet_filter.pattern = pattern;
|
||||
|
||||
packet_filter_bcast.offset = 0;
|
||||
packet_filter_bcast.mask_size = 3;
|
||||
packet_filter_bcast.mask = mask;
|
||||
packet_filter_bcast.pattern = pattern_bcast;
|
||||
|
||||
rule = RTW_POSITIVE_MATCHING;
|
||||
|
||||
wifi_init_packet_filter();
|
||||
wifi_add_packet_filter(1, &packet_filter,rule);
|
||||
wifi_add_packet_filter(2, &packet_filter_bcast,rule);
|
||||
|
||||
wifi_enable_packet_filter(1);
|
||||
wifi_enable_packet_filter(2);
|
||||
}
|
||||
|
||||
|
||||
void joinlink_start(void *param)
|
||||
{
|
||||
joinlink_finished = 0;
|
||||
start_time = xTaskGetTickCount();
|
||||
|
||||
if(xTaskCreate(joinlink_process, (char const *)"JoinLink", 1512, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)
|
||||
printf("%s xTaskCreate failed\n", __FUNCTION__);
|
||||
|
||||
if (joinlink_init_content() < 0)
|
||||
printf("joinlink init fail!\n");
|
||||
while(1)
|
||||
{
|
||||
if(wifi_is_ready_to_transceive(RTW_STA_INTERFACE) == RTW_SUCCESS)
|
||||
break;
|
||||
else
|
||||
vTaskDelay(3000);
|
||||
}
|
||||
all_channel_ret = scan_all_channel();
|
||||
|
||||
if (rtw_down_sema(&pre_scan_sema) == _FAIL)
|
||||
printf("%s, Take Semaphore Fail\n", __FUNCTION__);
|
||||
|
||||
//printf("\npre scan finished\n");
|
||||
|
||||
//set wifi to station mode,enable promisc mode and timer to change channel
|
||||
wifi_enter_promisc_mode();
|
||||
filter_add_enable();
|
||||
|
||||
/* enable all 802.11 packets*/
|
||||
wifi_set_promisc(RTW_PROMISC_ENABLE, wifi_promisc_rx, 1);
|
||||
|
||||
//init timer handler,and set timer hanler funcion
|
||||
if(all_channel_ret)
|
||||
{
|
||||
printf("\nstart the phase1 scan\n");
|
||||
get_phase1_channel();
|
||||
rtw_init_timer(&timer_handler_phase1, NULL, &timer_handler_phase1_func, NULL, "phase1_timer");
|
||||
rtw_set_timer(&timer_handler_phase1, SSID_SWITCH_TIME);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("phase1 scan fail, start phase2 scan\n");
|
||||
rtw_init_timer(&timer_handler_phase2, NULL, &timer_handler_phase2_func, NULL, "phase2_timer");
|
||||
wifi_set_channel(cur_channel);
|
||||
rtw_set_timer(&timer_handler_phase2, CHANNEL_SWITCH_TIME);
|
||||
}
|
||||
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
void example_joinlink(void)
|
||||
{
|
||||
if(xTaskCreate(joinlink_start, (char const *)"JoinLink_entry", 1512, NULL, tskIDLE_PRIORITY + 2, NULL) != pdPASS)
|
||||
printf("%s xTaskCreate failed\n", __FUNCTION__);
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,64 +0,0 @@
|
|||
/******************************* joinlink **************************/
|
||||
#ifndef __JOINLINK_H
|
||||
#define __JOINLINK_H
|
||||
|
||||
#include "autoconf.h"
|
||||
#include "platform_stdlib.h"
|
||||
#include "wifi_conf.h"
|
||||
#include "wifi_structures.h"
|
||||
#include "osdep_service.h"
|
||||
#include "lwip_netconf.h"
|
||||
#include "task.h"
|
||||
#include "hal_crypto.h"
|
||||
|
||||
#define SSID_SWITCH_TIME 500 //ssid switch time in phase1,units:ms, 50
|
||||
#define CHANNEL_SWITCH_TIME 500 //channel switch time in phase2,units:ms, 50
|
||||
#define JOINLINK_TIME 120 //timeout for joinlink process, units: s
|
||||
|
||||
/*
|
||||
* store AP profile after successfully decode
|
||||
* SUM +£¨length£¬pass£©+£¨IP+Port£©+£¨length£¬SSID)
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned char sum;
|
||||
unsigned char pwd_length;
|
||||
char pwd[65];
|
||||
int source_ip[4];
|
||||
unsigned int source_port;
|
||||
unsigned char ssid_length;
|
||||
char ssid[65];
|
||||
} joinlink_result_t;
|
||||
|
||||
/*
|
||||
* return value of joinlink_recv()
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
JOINLINK_STATUS_CONTINUE = 0,
|
||||
JOINLINK_STATUS_CHANNEL_LOCKED = 1,
|
||||
JOINLINK_STATUS_COMPLETE = 2
|
||||
} joinlink_status_t;
|
||||
|
||||
//initialize the related data structure
|
||||
int joinlink_init();
|
||||
/*
|
||||
handler to decode pkt
|
||||
*/
|
||||
joinlink_status_t joinlink_recv(unsigned char *da, unsigned char *sa, int len, void *user_data);
|
||||
|
||||
/*
|
||||
* get the AP profile after decode
|
||||
*/
|
||||
int joinlink_get_result(joinlink_result_t *result);
|
||||
|
||||
/*
|
||||
* set the aes_key, the max len should be 16
|
||||
* ret 1: success; ret 0: the len is invalid;
|
||||
*/
|
||||
int set_aes_key(char *key, int len);
|
||||
|
||||
// call this after finish join_link process
|
||||
void joinlink_deinit();
|
||||
|
||||
#endif //__JOINLINK_H
|
Loading…
Reference in a new issue