#include "sys_config.h" #include "typesdef.h" #include "list.h" #include "dev.h" #include "devid.h" #include "osal/string.h" #include "osal/semaphore.h" #include "osal/mutex.h" #include "osal/irq.h" #include "osal/task.h" #include "osal/sleep.h" #include "osal/timer.h" #include "hal/gpio.h" #include "hal/uart.h" #include "hal/netdev.h" #include "lib/common/common.h" #include "lib/umac/umac.h" #include "lib/syscfg/syscfg.h" #include "lib/atcmd/libatcmd.h" #include "lwip/ip_addr.h" #include "lwip/netdb.h" #include "syscfg.h" #include "osal/work.h" #include "lib/common/dsleepdata.h" #ifdef CONFIG_SLEEP #include "lib/lmac/lmac_dsleep.h" #endif #ifndef QC_STA_NAME #define QC_STA_NAME "BGN_test" #endif #ifndef QC_STA_PW #define QC_STA_PW "12345678" #endif #ifndef QC_SCAN_TIME #define QC_SCAN_TIME 200 #endif #ifndef QC_SCAN_CNT #define QC_SCAN_CNT 10 #endif #ifndef QC_SCAN_CHANNEL #define QC_SCAN_CHANNEL 0x010 #endif #define SYSCFG_WIFI_MODE(mode) ((mode) == WIFI_MODE_STA ? "sta" : ((mode) == WIFI_MODE_AP ? "ap" : "apsta")) struct sys_config sys_cfgs = { .cfg_ver = CFG_VERSION_NUM, .default_wifi_mode = WIFI_MODE_AP, .channel = CHANNEL_DEFAULT, .beacon_int = 100, .dtim_period = 1, .bss_max_idle = 300, .key_mgmt = WPA_KEY_MGMT_NONE, .ipaddr = IP_ADDR_DEFAULT, .netmask = NET_MASK_DEFAULT, .gw_ip = GW_IP_DEFAULT, .dhcpd_startip = DHCP_START_IP_DEFAULT, .dhcpd_endip = DHCP_END_IP_DEFAULT, .dhcpd_lease_time = 3600, .dhcpd_en = 1, .dhcpc_en = 1, .ble_pair_status = 0,//ble 默认是0,没有配网,设置为1的时候,代表已经配过网络 .wireless_paircode = 0, .net_pair_switch = 0, }; uint32 syscfg_key_mgmt_get(void){ return (sys_cfgs.key_mgmt != WPA_KEY_MGMT_NONE); } int32 syscfg_save(void) { return syscfg_write(&sys_cfgs, sizeof(sys_cfgs)); } void syscfg_save_AP_msg(uint8_t *bssid,uint8_t station_channel,struct ieee80211_bss_wpadata *bss_data) { //原来参数一样,需要重新保存 if(memcmp(bssid,sys_cfgs.bssid,6) == 0 && station_channel == sys_cfgs.station_channel && memcmp(bss_data,&sys_cfgs.bss_data,sizeof(struct ieee80211_bss_wpadata)) == 0) { return; } else { memcpy(sys_cfgs.bssid,bssid,6); sys_cfgs.station_channel = station_channel; memcpy(&sys_cfgs.bss_data,bss_data,sizeof(struct ieee80211_bss_wpadata)); syscfg_save(); return; } } extern uint8 sta_ps[8][6]; void syscfg_dump(void) { _os_printf("SYSCFG\r\n"); _os_printf(" mode:%s, channel:%d, key_mgmt:%x\r\n", SYSCFG_WIFI_MODE(sys_cfgs.wifi_mode), sys_cfgs.channel, sys_cfgs.key_mgmt); _os_printf(" bssid:"MACSTR", mac:"MACSTR"\r\n", MAC2STR(sys_cfgs.bssid), MAC2STR(sys_cfgs.mac)); _os_printf(" ssid:%s, passwd:%s\r\n", sys_cfgs.ssid, sys_cfgs.passwd); _os_printf(" bss_max_idle:%d, beacon_int:%d, ack_tmo:%d, dtim_period:%d\r\n", sys_cfgs.bss_max_idle, sys_cfgs.beacon_int, sys_cfgs.ack_tmo, sys_cfgs.dtim_period); } #ifdef CONFIG_UMAC4 void qc_wifi_config(void) { wifi_create_station(QC_STA_NAME,QC_STA_PW,WPA_KEY_MGMT_PSK); } int32 wifi_qc_scan(uint8 ifidx) { int32 ret = 0; uint8 bss_num = 0; uint8 *bss_data; struct hgic_bss_info* bss_map; struct ieee80211_scandata scan_param; bss_data = malloc(32*sizeof(struct hgic_bss_info)); scan_param.chan_bitmap = QC_SCAN_CHANNEL; scan_param.scan_time = QC_SCAN_TIME; scan_param.scan_cnt = QC_SCAN_CNT; ieee80211_scan(ifidx,1,&scan_param); //ieee80211_scan(ifidx,0,NULL); os_sleep_ms(QC_SCAN_TIME*QC_SCAN_CNT+10); ret = ieee80211_get_bsslist((struct hgic_bss_info *)bss_data, 32, 1); for (bss_num = 0;bss_num < 32;bss_num++) { bss_map = (struct hgic_bss_info *)(bss_data + bss_num*sizeof(struct hgic_bss_info)); os_printf("[%d]===>%s\r\n",bss_num,bss_map->ssid); if (! strcasecmp( (const char *)bss_map->ssid, QC_STA_NAME ) ) { free(bss_data); return 1; } } free(bss_data); return 0; } int get_rssi_msg(uint8_t *sta,char* ifname) { int ret = - 70; struct ieee80211_stainfo stainfo; if(sys_cfgs.wifi_mode == WIFI_MODE_STA) { ret = ieee80211_conf_get_stainfo(WIFI_MODE_STA,0,NULL,&stainfo); if (ret == 0) { ret = stainfo.rssi; } else { ret = -70; } } return ret; } void wifi_create_ap(char *ssid,char *password,int key_mode,int channel) { uint8 key[32]; ieee80211_conf_set_channel(WIFI_MODE_AP, channel); ieee80211_conf_set_ssid(WIFI_MODE_AP, (uint8*)ssid); ieee80211_conf_set_keymgmt(WIFI_MODE_AP, key_mode); if (key_mode != WPA_KEY_MGMT_NONE) { wpa_passphrase((uint8*)ssid, password, key); ieee80211_conf_set_psk(WIFI_MODE_AP, key); ieee80211_conf_set_passwd(WIFI_MODE_AP, password); } } void wifi_create_station(char *ssid,char *password,int key_mode) { uint8 key[32]; ieee80211_conf_set_ssid(WIFI_MODE_STA, (uint8*)ssid); ieee80211_conf_set_keymgmt(WIFI_MODE_STA, key_mode); if (key_mode != WPA_KEY_MGMT_NONE) { wpa_passphrase((uint8*)ssid, password, key); ieee80211_conf_set_psk(WIFI_MODE_STA, key); ieee80211_conf_set_passwd(WIFI_MODE_STA, password); } } int32 wificfg_flush(uint8 ifidx) { ieee80211_conf_set_mac(ifidx, sys_cfgs.mac); //station的时候,全信道扫描 if(WIFI_MODE_STA == ifidx) { if(sys_cfgs.station_channel) { ieee80211_bss_add_manualAP(sys_cfgs.ssid,sys_cfgs.bssid,sys_cfgs.station_channel,IEEE80211_BAND_2GHZ,&sys_cfgs.bss_data); } ieee80211_conf_set_channel(ifidx, 0); } else { ieee80211_conf_set_channel(ifidx, sys_cfgs.channel); } ieee80211_conf_set_beacon_int(ifidx, sys_cfgs.beacon_int); ieee80211_conf_set_dtim_int(ifidx, sys_cfgs.dtim_period); ieee80211_conf_set_bss_max_idle(ifidx, sys_cfgs.bss_max_idle); ieee80211_conf_set_ssid(ifidx, sys_cfgs.ssid); ieee80211_conf_set_keymgmt(ifidx, sys_cfgs.key_mgmt); ieee80211_conf_set_psk(ifidx, sys_cfgs.psk); ieee80211_conf_set_passwd(ifidx, sys_cfgs.passwd); ieee80211_conf_set_psdata_cnt(ifidx,40); if(ifidx == WIFI_MODE_AP){ if(sys_cfgs.channel==0 && sys_status.channel){ ieee80211_conf_set_channel(ifidx, sys_status.channel); }else{ ieee80211_conf_set_channel(ifidx, sys_cfgs.channel); } } return 0; } void sta_ps_mode_enter(uint16 aid) { } void sta_ps_mode_exit(uint16 aid) { } void aid_to_mac(uint16 aid, uint8* mac) { struct ieee80211_stainfo stainfo; ieee80211_conf_get_stainfo(WIFI_MODE_AP,aid,NULL,&stainfo); memcpy(mac,stainfo.addr,6); } #else //hgics configs. struct umac_config umac_cfg; struct umac_config *sys_get_umaccfg() { struct umac_config *cfg = &umac_cfg; int hg0_sz = 0; uint8 channel = 0 ; cfg->bss_bw = 8; cfg->tx_mcs = 7; cfg->primary_chan = 1; cfg->chan_cnt = 2; cfg->chan_list[0] = 9020; cfg->chan_list[1] = 9100; if (sys_cfgs.wifi_mode == WIFI_MODE_STA) { hg0_sz += (int)os_sprintf(cfg->hg0, "update_config=1\n" \ "network={\n" \ "proto=WPA RSN\n"\ "key_mgmt=WPA-PSK\n" \ "pairwise=TKIP CCMP\n" \ "group=TKIP CCMP\n" \ ); hg0_sz += (int)os_sprintf(&cfg->hg0[hg0_sz], "ssid=\"%s\"\n", "BGN_test"); hg0_sz += (int)os_sprintf(&cfg->hg0[hg0_sz], "psk=\"%s\"\n", "12345678"); hg0_sz += (int)os_strcpy(&cfg->hg0[hg0_sz], "}\n"); _os_printf("cfg->hg0:%s\r\n", cfg->hg0); } else { hg0_sz += (int)os_sprintf(cfg->hg0, "country_code=CN\n"); hg0_sz += (int)os_sprintf(&cfg->hg0[hg0_sz], "ssid=%s\n", sys_cfgs.ssid); if (sys_cfgs.channel == 0) { } else { channel = sys_cfgs.channel; } hg0_sz += (int)os_sprintf(&cfg->hg0[hg0_sz], "channel=%d\n", channel); if (sys_cfgs.key_mgmt == WPA_KEY_MGMT_NONE) { hg0_sz += (int)os_strcpy(&cfg->hg0[hg0_sz], "wpa=0\n" \ "hw_mode=g\n"\ ); } else { hg0_sz += (int)os_sprintf(&cfg->hg0[hg0_sz], "wpa_passphrase=%s\n", sys_cfgs.key); hg0_sz += (int)os_strcpy(&cfg->hg0[hg0_sz], "wpa=2\n" \ "wpa_key_mgmt=WPA-PSK\n" \ "wpa_pairwise=CCMP\n" \ "hw_mode=g\n"\ "ieee80211n=1\n" \ "ht_capab=\n"\ ); } } return cfg; } //save hgics configs into system. int sys_save_umaccfg(struct umac_config *cfg) { return 0; } void sta_ps_mode_enter(char *addr) { } void sta_ps_mode_exit(char *addr) { } void aid_to_mac(uint16 aid, uint8* mac) { } #endif void syscfg_set_default_val() { sysctrl_efuse_mac_addr_calc(sys_cfgs.mac); if (IS_ZERO_ADDR(sys_cfgs.mac)) { os_random_bytes(sys_cfgs.mac, 6); sys_cfgs.mac[0] &= 0xfe; os_printf("use random mac "MACSTR"\r\n", MAC2STR(sys_cfgs.mac)); } os_sprintf(sys_cfgs.ssid,"%s%02x%02x%02x",SSID_DEFAULT,sys_cfgs.mac[5],sys_cfgs.mac[4],sys_cfgs.mac[3]); os_sprintf(sys_cfgs.passwd,"%s","12345678"); #ifdef CONFIG_UMAC4 wpa_passphrase(sys_cfgs.ssid, sys_cfgs.passwd, sys_cfgs.psk); #else os_strcpy(sys_cfgs.key, "12345678"); #endif } uint8 get_sys_cfgs_ble_pair_status() { return sys_cfgs.ble_pair_status; } #ifdef CONFIG_SLEEP int32 wificfg_set_wkupdata_mask(uint8 ifidx, uint8 offset, uint8 *mask, uint32 mask_len) { uint8 len = mask_len > (LMAC_WKDATA_SIZE/8) ? (LMAC_WKDATA_SIZE/8) : mask_len; struct lmac_wkdata_param *wkdata = sys_sleepdata_request(SYSTEM_SLEEPDATA_ID_WKDATA, sizeof( struct lmac_wkdata_param)); os_printf("%s:%d\r\n", __func__, __LINE__); if(wkdata){ wkdata->count = LMAC_WKDATA_COUNT; wkdata->wkdata_size = LMAC_WKDATA_SIZE; wkdata->data[0].offset = offset;//offset from ether hdr os_memset(wkdata->data[0].mask, 0, sizeof(wkdata->data[0].mask)); os_memcpy(wkdata->data[0].mask, mask, len); os_printf(KERN_NOTICE"set wkdata mask, offset=%d \r\n", wkdata->data[0].offset); return RET_OK; } return -ENOTSUPP; } int32 wificfg_set_wakeup_data(uint8 ifidx, uint8 *data, uint32 data_len) { uint8 len = data_len > LMAC_WKDATA_SIZE ? LMAC_WKDATA_SIZE : data_len; struct lmac_wkdata_param *wkdata = sys_sleepdata_request(SYSTEM_SLEEPDATA_ID_WKDATA, sizeof( struct lmac_wkdata_param)); os_printf("%s:%d\r\n", __func__, __LINE__); if(wkdata){ wkdata->count = LMAC_WKDATA_COUNT; wkdata->wkdata_size = LMAC_WKDATA_SIZE; wkdata->data[0].wkdata_len = len; os_memcpy(wkdata->data[0].wkdata, data, len); os_printf(KERN_NOTICE"set wkdata, len=%d \r\n", len); return RET_OK; } return -ENOTSUPP; } int32 wificfg_set_wkdata_svr_ip(uint8 ifidx, uint32 svr_ip) { struct lmac_wkdata_param *wkdata = sys_sleepdata_request(SYSTEM_SLEEPDATA_ID_WKDATA, sizeof( struct lmac_wkdata_param)); os_printf("%s:%d\r\n", __func__, __LINE__); if(wkdata){ wkdata->count = LMAC_WKDATA_COUNT; wkdata->wkdata_size = LMAC_WKDATA_SIZE; wkdata->data[0].sip = svr_ip; os_printf(KERN_NOTICE"set wkdata sip="IPSTR"\r\n", IP2STR_N(svr_ip)); return RET_OK; } return -ENOTSUPP; } #endif