int Domain_query_Process() { int i; int Operation_Mode=0; int WLAN_Mode=0; unsigned char LAN_Mac[12]; char cmdBuffer[100]; int lan_dhcp=0; char lan_domain_name[ MAX_NAME_LEN]={0}; unsigned char Confirm_Threshold=0; int Type=0; int Check_status=0; apmib_get( MIB_DOMAIN_NAME, (void *)lan_domain_name); if(Start_Domain_Query_Process==0 ||isFileExist("/var/system/start_init") || !lan_domain_name[0]){//during init procedure //printf("web init return directly\n"); return 0; } apmib_get( MIB_OP_MODE, (void *)&Operation_Mode); apmib_get( MIB_WLAN_MODE, (void *)&WLAN_Mode); apmib_get( MIB_DHCP, (void *)&lan_dhcp); if(Operation_Mode==1 && ((WLAN_Mode == 1 && lan_dhcp==15)|| (WLAN_Mode == 0 && lan_dhcp==15))){ //in bridge mode and wlan ap/client mode if(CurrentTime < WAIT_TIME){ //it time to check wlan connected or not /*if wlan is connected will not start dhcp server*/ Check_status = Check_Wlan_isConnected(WLAN_Mode); if( Check_status==1 && DHCPD_State==1){ //wlan connetced //printf("wlan connected within WAIT_TIME and start dhcpc\n"); system("killall -9 udhcpd 2> /dev/null"); system("killall -9 udhcpc 2> /dev/null"); system("echo 1 > /proc/pocket/en_filter"); //start to filter dhcp discover in bridge if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 0\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 0\" > /proc/pocket/filter_conf"); } system("rm -f /var/run/udhcpd.pid 2> /dev/null"); system("rm -f /etc/udhcpc/udhcpc-br0.pid 2> /dev/null"); #if defined(LOGDEBUG_ENABLED) if(WLAN_Mode == 1){ syslog(LOG_INFO, "klogd: DNQP: Connected within WAIT_TIME, Start DHCP Client\n"); printf("DNQP: Connected within WAIT_TIME, Start DHCP Client\n"); } #endif set_lan_dhcpc("br0"); DHCPC_State=2; // start DHCP client DHCPD_State=0; WLAN_State=1; if(WLAN_Mode == 0){ #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, within WAIT_TIME, Start DHCP Client, shutdown wlan first\n"); printf("DNQP: AP mode, within WAIT_TIME, Start DHCP Client, shutdown wlan first\n"); #endif system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } wlan_iface_state=1; }else if(Check_status ==0 && DHCPD_State==1){ if(isFileExist(DHCPD_PID_FILE)==0){ system("killall -9 udhcpd 2> /dev/null"); system("rm -f /var/run/udhcpd.pid 2> /dev/null"); system("echo 1 > /proc/pocket/en_filter"); //start to filter dhcp discover in bridge if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 2\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 2\" > /proc/pocket/filter_conf"); } #if defined(LOGDEBUG_ENABLED) if(WLAN_Mode == 1){ syslog(LOG_INFO, "klogd: DNQP: Disconnected within WAIT_TIME, Start DHCP Server\n"); printf("DNQP: Disconnected within WAIT_TIME, Start DHCP Server\n"); } #endif set_lan_dhcpd("br0", 2); for(i=0;i<3;i++){ if(isFileExist(DHCPD_PID_FILE)){ break; }else{ sleep(1); } } if(WLAN_Mode == 1){ system("ifconfig eth0 down"); //system("ifconfig eth1 down"); sleep(5); system("ifconfig eth0 up"); //system("ifconfig eth1 up"); } else if(WLAN_Mode == 0) { #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, within WAIT_TIME, Start DHCP Server, shutdown wlan first\n"); printf("DNQP: AP mode, within WAIT_TIME, Start DHCP Server, shutdown wlan first\n"); #endif system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } start_dnrd(); wlan_iface_state=1; system("iptables -F INPUT"); WLAN_State=0; } } }else if(CurrentTime >= WAIT_TIME){ //it's time to check wlan connect or not Check_status = Check_Wlan_isConnected(WLAN_Mode); if(Check_status ==0){ //wlan/eth1 is not connetced //disconnect state if(isFileExist(DHCPD_PID_FILE)==0){ //dhcp server is not running if(WLAN_Mode==0) Confirm_Threshold=0; if(WLAN_Mode==1) Confirm_Threshold=20; if(WLAN_State==1 && Confirm_Time < Confirm_Threshold){ Confirm_Time++; goto ToNext; } Confirm_Time=0; if(isFileExist("/etc/udhcpc/udhcpc-br0.pid")){ system("killall -9 udhcpc 2> /dev/null"); system("rm -f /etc/udhcpc/udhcpc-br0.pid 2> /dev/null"); } sleep(1); system("killall -9 udhcpd 2> /dev/null"); system("rm -f /var/run/udhcpd.pid 2> /dev/null"); #if defined(LOGDEBUG_ENABLED) if(WLAN_Mode == 1){ syslog(LOG_INFO, "klogd: DNQP: Disconnected after WAIT_TIME, Start DHCP Server\n"); printf("DNQP: Disconnected after WAIT_TIME, Start DHCP Server\n"); } #endif set_lan_dhcpd("br0", 2); for(i=0;i<3;i++){ if(isFileExist(DHCPD_PID_FILE)){ break; }else{ sleep(1); } } system("echo 1 > /proc/pocket/en_filter"); //start to filter dhcp discover in bridge if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 2\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 2\" > /proc/pocket/filter_conf"); } if(WLAN_Mode == 1){ system("ifconfig eth0 down"); //system("ifconfig eth1 down"); sleep(5); system("ifconfig eth0 up"); //system("ifconfig eth1 up"); } else if(WLAN_Mode == 0) { #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, after WAIT_TIME, Start DHCP Server, shutdown wlan first\n"); printf("DNQP: AP mode, after WAIT_TIME, Start DHCP Server, shutdown wlan first\n"); #endif system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } start_dnrd(); wlan_iface_state=1; system("iptables -F INPUT"); if(WLAN_Mode == 0){ WLAN_State=0; } }else{ //dhcp server is running, and not connected if(isFileExist("/etc/udhcpc/udhcpc-br0.pid")){ system("killall -9 udhcpc 2> /dev/null"); system("rm -f /etc/udhcpc/udhcpc-br0.pid 2> /dev/null"); if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 2\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 2\" > /proc/pocket/filter_conf"); } }else{ Type = getFilter_Type(); if(Type==0){ #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: Disconnected after WAIT_TIME, Filter state is 0, reset to 2 in DHCP server state\n"); printf("DNQP: AP mode, Disconnected after WAIT_TIME, Filter state is 0, reset to 2 in DHCP server state\n"); #endif system("echo \"00000000 000000000000 2\" > /proc/pocket/filter_conf"); }else if(Type==2 && WLAN_State==1){ Renew_State++; } if(WLAN_Mode == 0 && Renew_State >= 1 && WLAN_State==1){ WLAN_State=0; Renew_State=0; #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, Disconnected after WAIT_TIME, LastState is Connected, clean WLAN_State to cause start DHCP client when Connect again\n"); printf("DNQP: AP mode, Disconnected after WAIT_TIME, LastState is Connected, clean WLAN_State to cause start DHCP client when Connect again\n"); #endif } } } }else{ //connected state if(WLAN_State ==0){ system("killall -9 udhcpd 2> /dev/null"); system("killall -9 udhcpc 2> /dev/null"); system("rm -f /var/run/udhcpd.pid 2> /dev/null"); system("rm -f /etc/udhcpc/udhcpc-br0.pid 2> /dev/null"); system("echo 1 > /proc/pocket/en_filter"); //start to filter dhcp discover in bridge if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 0\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 0\" > /proc/pocket/filter_conf"); } #if defined(LOGDEBUG_ENABLED) if(WLAN_Mode == 1){ syslog(LOG_INFO, "klogd: DNQP: Connected after WAIT_TIME, Start DHCP Client\n"); printf("DNQP: Connected after WAIT_TIME, Start DHCP Client\n"); } #endif set_lan_dhcpc("br0"); DHCPC_State=2; // start DHCP client system("iptables -A INPUT -p icmp --icmp-type echo-request -i br0 -j DROP"); // sleep(1); WLAN_State=1; Restore_IptablesRule=1; check_count=0; if(WLAN_Mode == 0){ #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, after WAIT_TIME, Start DHCP Client, shutdown wlan first\n"); printf("DNQP: AP mode, after WAIT_TIME, Start DHCP Client, shutdown wlan first\n"); #endif system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } wlan_iface_state=1; }else{ if(Restore_IptablesRule==1){ if(isFileExist(DHCPD_PID_FILE)){ unlink(DHCPD_PID_FILE); } if(check_count > 5){ system("iptables -F INPUT"); Restore_IptablesRule=0; }else{ check_count++; } } if(getFilter_Type()==0){ if(Confirm_DHCP_Time >= DHCPC_WAIT_TIME && (DHCPC_State==1 || DHCPC_State==2)){ system("killall -9 udhcpd 2> /dev/null"); system("killall -9 udhcpc 2> /dev/null"); sleep(1); system("rm -f /var/run/udhcpd.pid 2> /dev/null"); system("rm -f /etc/udhcpc/udhcpc-br0.pid 2> /dev/null"); #if defined(LOGDEBUG_ENABLED) if(WLAN_Mode == 1){ syslog(LOG_INFO, "klogd: DNQP: Connected after WAIT_TIME, DHCP Client start, and CanNOT get ip after 20 seconds, Start DHCP Server\n"); printf("DNQP: Connected after WAIT_TIME, DHCP Client start, and CanNOT get ip after 20 seconds, Start DHCP Server\n"); } #endif set_lan_dhcpd("br0", 2); for(i=0;i<3;i++){ if(isFileExist(DHCPD_PID_FILE)){ break; }else{ sleep(1); } } system("echo 1 > /proc/pocket/en_filter"); //start to filter dhcp discover in bridge if(getLan_MacAddress(LAN_Mac)){ sprintf(cmdBuffer, "echo \"00000000 %s 2\" > /proc/pocket/filter_conf", LAN_Mac); system(cmdBuffer); }else{ system("echo \"00000000 000000000000 2\" > /proc/pocket/filter_conf"); } if(WLAN_Mode == 1){ system("ifconfig eth0 down"); //system("ifconfig eth1 down"); sleep(5); system("ifconfig eth0 up"); //system("ifconfig eth1 up"); } else if(WLAN_Mode == 0) { #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: AP mode, Connected after WAIT_TIME, DHCP Client start, and CanNOT get ip after 20 seconds, Start DHCP Server, shutdown wlan first\n"); printf("DNQP: AP mode, Connected after WAIT_TIME, DHCP Client start, and CanNOT get ip after 20 seconds, Start DHCP Server, shutdown wlan first\n"); #endif system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } start_dnrd(); wlan_iface_state=1; system("iptables -F INPUT"); if(WLAN_State==0) WLAN_State=1; DHCPC_State=0; }else Confirm_DHCP_Time++; }else{ Confirm_DHCP_Time=0; if (DHCPC_State == 2) { if(WLAN_Mode == 1){ system("ifconfig eth0 down"); //system("ifconfig eth1 down"); sleep(5); system("ifconfig eth0 up"); //system("ifconfig eth1 up"); } if(WLAN_Mode == 0){ system("ifconfig wlan0 down"); #if defined (CONFIG_RTL_92D_SUPPORT) system("ifconfig wlan1 down"); #endif Kill_Wlan_Applications(); } wlan_iface_state=1; system("iptables -F INPUT"); } DHCPC_State=1; } } if(WLAN_Mode ==1){ if(WLAN_State==1 && (Confirm_Time >= 3 && Confirm_Time < 20) &&getFilter_Type()==1){ //printf("client ever disconnect for 3~20 seconds, we should update our ip address\n"); #if defined(LOGDEBUG_ENABLED) syslog(LOG_INFO, "klogd: DNQP: Client mode, client ever disconnect for 3~20 seconds, we should update our ip address\n"); printf("DNQP: Client mode, client ever disconnect for 3~20 seconds, we should update our ip address\n"); #endif WLAN_State=0; Confirm_Time=0; } } } } ToNext: if(CurrentTime > WAIT_TIME+5) CurrentTime=WAIT_TIME; else CurrentTime++; if(wlan_iface_state==1){ Type = getFilter_Type(); if(Type==2 ||Type==1 ){ //dhcp server state, we wait 8 seconds, type=2:server state, type=1:dhcp client and got ip address confirm_wlan_iface_state++; if(confirm_wlan_iface_state >=8){ if(WLAN_Mode == 0){ #if defined(LOGDEBUG_ENABLED) if(Type==2){ syslog(LOG_INFO, "klogd: DNQP: AP mode, Up wlan interface when dhcp server started\n"); printf("DNQP: AP mode, Up wlan interface when dhcp server started\n"); }else if (Type==1){ syslog(LOG_INFO, "klogd: DNQP: AP mode, Up wlan interface when dhcp client got ip\n"); printf("DNQP: AP mode, Up wlan interface when dhcp client got ip\n"); } #endif system("ifconfig wlan0 up"); #if defined (CONFIG_RTL_92D_SUPPORT) if(isBandModeBoth()) { system("ifconfig wlan1 up"); } #endif sleep(1); Start_Wlan_Applications(); } wlan_iface_state=0; confirm_wlan_iface_state=0; } } } #if 0 if(WLAN_State==1 && check_ssid() && CurrentTime >= WAIT_TIME){ WLAN_State=0;//restart all procedure system("iptables -F INPUT");//to avoid add iptables rule duplicate } #endif }else{ system("echo 0 > /proc/pocket/en_filter"); } return 0; }
static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, const u8 *ies, size_t ies_len, int reassoc) { struct ieee802_11_elems elems; u16 resp; const u8 *wpa_ie; size_t wpa_ie_len; if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_INFO, "Station sent an invalid " "association request"); return WLAN_STATUS_UNSPECIFIED_FAILURE; } resp = check_ssid(hapd, sta, elems.ssid, elems.ssid_len); if (resp != WLAN_STATUS_SUCCESS) return resp; resp = check_wmm(hapd, sta, elems.wmm, elems.wmm_len); if (resp != WLAN_STATUS_SUCCESS) return resp; resp = copy_supp_rates(hapd, sta, &elems); if (resp != WLAN_STATUS_SUCCESS) return resp; #ifdef CONFIG_IEEE80211N resp = copy_sta_ht_capab(sta, elems.ht_capabilities, elems.ht_capabilities_len); if (resp != WLAN_STATUS_SUCCESS) return resp; #endif /* CONFIG_IEEE80211N */ if ((hapd->conf->wpa & WPA_PROTO_RSN) && elems.rsn_ie) { wpa_ie = elems.rsn_ie; wpa_ie_len = elems.rsn_ie_len; } else if ((hapd->conf->wpa & WPA_PROTO_WPA) && elems.wpa_ie) { wpa_ie = elems.wpa_ie; wpa_ie_len = elems.wpa_ie_len; } else { wpa_ie = NULL; wpa_ie_len = 0; } #ifdef CONFIG_WPS sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); if (hapd->conf->wps_state && elems.wps_ie) { wpa_printf(MSG_DEBUG, "STA included WPS IE in (Re)Association " "Request - assume WPS is used"); sta->flags |= WLAN_STA_WPS; wpabuf_free(sta->wps_ie); sta->wps_ie = ieee802_11_vendor_ie_concat(ies, ies_len, WPS_IE_VENDOR_TYPE); wpa_ie = NULL; wpa_ie_len = 0; } else if (hapd->conf->wps_state && wpa_ie == NULL) { wpa_printf(MSG_DEBUG, "STA did not include WPA/RSN IE in " "(Re)Association Request - possible WPS use"); sta->flags |= WLAN_STA_MAYBE_WPS; } else #endif /* CONFIG_WPS */ if (hapd->conf->wpa && wpa_ie == NULL) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_INFO, "No WPA/RSN IE in association request"); return WLAN_STATUS_INVALID_IE; } if (hapd->conf->wpa && wpa_ie) { int res; wpa_ie -= 2; wpa_ie_len += 2; if (sta->wpa_sm == NULL) sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, sta->addr); if (sta->wpa_sm == NULL) { wpa_printf(MSG_WARNING, "Failed to initialize WPA " "state machine"); return WLAN_STATUS_UNSPECIFIED_FAILURE; } res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm, wpa_ie, wpa_ie_len, elems.mdie, elems.mdie_len); if (res == WPA_INVALID_GROUP) resp = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; else if (res == WPA_INVALID_PAIRWISE) resp = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; else if (res == WPA_INVALID_AKMP) resp = WLAN_STATUS_AKMP_NOT_VALID; else if (res == WPA_ALLOC_FAIL) resp = WLAN_STATUS_UNSPECIFIED_FAILURE; #ifdef CONFIG_IEEE80211W else if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION) resp = WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION; else if (res == WPA_INVALID_MGMT_GROUP_CIPHER) resp = WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION; #endif /* CONFIG_IEEE80211W */ else if (res == WPA_INVALID_MDIE) resp = WLAN_STATUS_INVALID_MDIE; else if (res != WPA_IE_OK) resp = WLAN_STATUS_INVALID_IE; if (resp != WLAN_STATUS_SUCCESS) return resp; #ifdef CONFIG_IEEE80211W if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out && sta->sa_query_count > 0) ap_check_sa_query_timeout(hapd, sta); if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out && (!reassoc || sta->auth_alg != WLAN_AUTH_FT)) { /* * STA has already been associated with MFP and SA * Query timeout has not been reached. Reject the * association attempt temporarily and start SA Query, * if one is not pending. */ if (sta->sa_query_count == 0) ap_sta_start_sa_query(hapd, sta); return WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY; } if (wpa_auth_uses_mfp(sta->wpa_sm)) sta->flags |= WLAN_STA_MFP; else sta->flags &= ~WLAN_STA_MFP; #endif /* CONFIG_IEEE80211W */ #ifdef CONFIG_IEEE80211R if (sta->auth_alg == WLAN_AUTH_FT) { if (!reassoc) { wpa_printf(MSG_DEBUG, "FT: " MACSTR " tried " "to use association (not " "re-association) with FT auth_alg", MAC2STR(sta->addr)); return WLAN_STATUS_UNSPECIFIED_FAILURE; } resp = wpa_ft_validate_reassoc(sta->wpa_sm, ies, ies_len); if (resp != WLAN_STATUS_SUCCESS) return resp; } #endif /* CONFIG_IEEE80211R */ #ifdef CONFIG_IEEE80211N if ((sta->flags & WLAN_STA_HT) && wpa_auth_get_pairwise(sta->wpa_sm) == WPA_CIPHER_TKIP) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_INFO, "Station tried to use TKIP with HT " "association"); return WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; } #endif /* CONFIG_IEEE80211N */ } else wpa_auth_sta_no_wpa(sta->wpa_sm); return WLAN_STATUS_SUCCESS; }