sdk说明
** Gateway/AP firmware v3.4.14b – Aug 26, 2019**
Wireless LAN driver changes as:
Refine WiFi Stability and Performance
Add 8812F MU-MIMO
Add 97G/8812F multiple mac-clone
Add 97G 2T3R antenna diversity
Fix 97G/8812F/8814B MP issues
Add CH144 DFS support for JP
Fix PPPOE Dial on dial-on-demand abnormal when dual stack
Fix Ethernet padding info disclosure
Add WPA3 WEB UI
Add RealSON support
Add EasyMesh supports
AP说明
802.11 a/b/g/n/ac compatible
AP mode and client mode support
Security support 64/128 bits WEP, WPA, and WPA2 (TKIP and AES-CCMP)
Auto rate adaptive
Wireless MAC address filter
Broadcast SSID control
IAPP (802.11f) support
Auto channel selection
Driver based MP functions
WDS function support
Universal repeater mode support
WMM supported for AP mode
Support WLAN ASIC of 8192CE, 8188RE, 8192DE, 8188ER, 8812E, 8192ER, 8881A, 8814AR, 8194AR, 8812BR, 8197F
WPS function support
WAPI function support
Set WMM parameters manually
功能描述
WiFi 防暴力破解功能说明,当一个终端用户连续输入错误密码超过100次,就将这个终端拉黑处理,拉黑期间即使终端输入正确的密码也不允许连接,拉黑5min之后自动将终端释放
功能实现
驱动修改
iff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
index 0f26cb2..b6b54f8 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
@@ -235,6 +235,8 @@
#include "core_ofld_data.h"
#include "core_ofld_host.h"
#endif
+#define PROC_STA_CONN_FAIL_INFO
+
#ifdef DOT11K
#define MAX_REPORT_FRAME_SIZE (PRE_ALLOCATED_BUFSIZE*4)
@@ -4595,6 +4597,7 @@
unsigned char used;
unsigned char error_state;
unsigned char addr[MACADDRLEN];
+ unsigned int count;
};
#endif
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
index e726e25..9724816 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
@@ -1431,6 +1431,10 @@
#else
{"acs_type", INT_T, _OFFSET(dot11RFEntry.acs_type), _SIZE(dot11RFEntry.acs_type), 1},
#endif
+ {"deny_mac_count", INT_T, _OFFSET(dot11RFEntry.deny_mac_count), _SIZE(dot11RFEntry.deny_mac_count), 100},
+ {"deny_connect_pid", INT_T, _OFFSET(dot11RFEntry.deny_connect_pid), _SIZE(dot11RFEntry.deny_connect_pid), 65530},
+ {"empty_sta_conn_fail_flag", INT_T, _OFFSET(dot11RFEntry.empty_sta_conn_fail_flag), _SIZE(dot11RFEntry.empty_sta_conn_fail_flag), 0},
+ {"deny_interface_name", SSID_STRING_T, _OFFSET(dot11RFEntry.deny_interface_name), _SIZE(dot11RFEntry.deny_interface_name), 0},
// struct Dot11StationConfigEntry
{"ssid", SSID_STRING_T, _OFFSET(dot11StationConfigEntry.dot11DesiredSSID), _SIZE(dot11StationConfigEntry.dot11DesiredSSID), 0},
{"defssid", DEF_SSID_STRING_T, _OFFSET(dot11StationConfigEntry.dot11DefaultSSID), _SIZE(dot11StationConfigEntry.dot11DefaultSSID), 0},
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
index fa4f859..ff12549 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
@@ -1977,8 +1977,11 @@
PRINT_SINGL_ARG(" rfe_type: ", priv->pmib->dot11RFEntry.rfe_type, "%u");
#endif
PRINT_SINGL_ARG(" pa_type: ", priv->pmib->dot11RFEntry.pa_type, "%d");
- PRINT_SINGL_ARG(" acs_type: ", priv->pmib->dot11RFEntry.acs_type, "%d");
-
+ PRINT_SINGL_ARG(" acs_type: ", priv->pmib->dot11RFEntry.acs_type, "%d");
+ PRINT_SINGL_ARG(" deny_mac_count: ", priv->pmib->dot11RFEntry.deny_mac_count, "%d");
+ PRINT_SINGL_ARG(" deny_connect_pid: ", priv->pmib->dot11RFEntry.deny_connect_pid, "%d");
+ PRINT_SINGL_ARG(" empty_sta_conn_fail_flag: ", priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag, "%d");
+ PRINT_SINGL_ARG(" deny_interface_name: ", priv->pmib->dot11RFEntry.deny_interface_name, "%s");
#if (defined(CONFIG_SLOT_0_8192EE) && defined(CONFIG_SLOT_0_EXT_LNA))||(defined(CONFIG_SLOT_1_8192EE) && defined(CONFIG_SLOT_1_EXT_LNA))
PRINT_SINGL_ARG(" lna_type: ", priv->pshare->rf_ft_var.lna_type, "%d");
#endif
@@ -2408,11 +2411,19 @@
for (i=0; i<64; i++) {
if (priv->sta_conn_fail[i].used) {
- PRINT_ARRAY_ARG(" MAC addr: ", priv->sta_conn_fail[i].addr, "%02x", MACADDRLEN);
+ PRINT_ARRAY_ARG(" MACaddr:", priv->sta_conn_fail[i].addr, "%02x", MACADDRLEN);
PRINT_SINGL_ARG(" Error state: ", priv->sta_conn_fail[i].error_state, "%d");
+ PRINT_SINGL_ARG(" MIC Error count: ", priv->sta_conn_fail[i].count, "%d");
}
}
- memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64);
+ if (priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag == 1)
+ {
+ //printk("Function:%s Line:%d g_total_count=%d g_deny_mac=%s\n",__func__,__LINE__,g_total_count,g_deny_mac);
+ priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag = 0;
+ memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64);
+ memset(g_deny_mac,0,sizeof(g_deny_mac));
+ g_total_count = 0;
+ }
return pos;
}
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
index 53ba304..a89fbfc 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
@@ -55,8 +55,39 @@
#include "./8192cd_11r_cli.h"
#endif
#endif
+#include <linux/pid.h>
+#include <linux/signal.h>
+char g_deny_mac[16] = {0};
+int g_total_count = 0;
+char g_dev_name[16] = {0};
+int send_signal_to_userspace(unsigned int deny_connect_pid)
+{
+ struct pid *pid_struct;
+ struct task_struct *task;
+ int ret;
-//#define DEBUG_PSK
+ if (deny_connect_pid < 0) {
+ printk("Invalid PID\n");
+ return -EINVAL;
+ }
+ pid_struct = find_get_pid(deny_connect_pid);
+ task = pid_task(pid_struct, PIDTYPE_PID);
+ if (!task) {
+ printk("No such process\n");
+ return -ESRCH;
+ }
+
+ ret = send_sig(SIGUSR1, task, 0); //send SIGUSR1 to userspace
+ if (ret < 0) {
+ printk("Error sending signal\n");
+ return ret;
+ }
+
+ printk("Signal sent to process %d SIGUSR1=%d\n", deny_connect_pid,SIGUSR1);
+ return 0;
+}
#define ETHER_ADDRLEN 6
#define PMK_EXPANSION_CONST "Pairwise key expansion"
@@ -4353,6 +4384,25 @@
else {
if (!memcmp(priv->sta_conn_fail[i].addr, pstat->cmn_info.mac_addr, MACADDRLEN)) {
priv->sta_conn_fail[i].error_state = RSN_MIC_failure;
+ if( priv->sta_conn_fail[i].count != priv->pmib->dot11RFEntry.deny_mac_count)
+ priv->sta_conn_fail[i].count++;
+ g_total_count++;
+ if(g_total_count >= priv->pmib->dot11RFEntry.deny_mac_count)
+ {
+ send_signal_to_userspace(priv->pmib->dot11RFEntry.deny_connect_pid);
+ printk("4-2: ERROR_MIC_FAIL priv->sta_conn_fail[%d].count=%u\n",i,priv->sta_conn_fail[i].count);
+ snprintf(g_deny_mac,sizeof(g_deny_mac),"%02x%02x%02x%02x%02x%02x",
+ pstat->cmn_info.mac_addr[0],
+ pstat->cmn_info.mac_addr[1],
+ pstat->cmn_info.mac_addr[2],
+ pstat->cmn_info.mac_addr[3],
+ pstat->cmn_info.mac_addr[4],
+ pstat->cmn_info.mac_addr[5]);
+ strcpy(g_dev_name,priv->dev->name);
+ strcpy(priv->pmib->dot11RFEntry.deny_interface_name,priv->dev->name);
+ printk("Function:%s Line:%d priv->dev->name:%s priv->pmib->dot11RFEntry.deny_interface_name=%s\n",
+ __func__,__LINE__,priv->dev->name,priv->pmib->dot11RFEntry.deny_interface_name);
+ }
break;
}
}
@@ -5876,6 +5926,42 @@
#endif // CONFIG_IEEE80211W
+int check_mac_is_or_not_in_deny_list(struct rtl8192cd_priv *priv, char *mac)
+{
+
+ int i;
+
+ printk("Function:%s Line:%d g_dev_name=%s priv->dev->name=%s g_total_count=%d priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag=%d\n",
+ __func__,__LINE__,g_dev_name,priv->dev->name,g_total_count,priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag );
+
+ if ( priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag == 1){
+ memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64);
+ printk("Function:%s Line:%d empty sta conn fail list g_deny_mac=%s g_total_count=%d\n",
+ __func__,__LINE__,g_deny_mac,g_total_count);
+ priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag = 0;
+ memset(g_deny_mac,0,sizeof(g_deny_mac));
+ g_total_count = 0;
+ return 0;
+ }
+ if(strlen(g_deny_mac)){
+ if(!strncmp(mac,g_deny_mac,sizeof(g_deny_mac))){
+ printk("Auth Mac:%s g_deny_mac:%s \n",mac,g_deny_mac);
+ return 1;
+ }
+ }
+ for (i=0; i<64; i++) {
+ if (!memcmp(priv->sta_conn_fail[i].addr, mac, MACADDRLEN) && g_total_count >=priv->pmib->dot11RFEntry.deny_mac_count)
+ {
+ printk("Auth Mac:%s sta_conn_fail Mac[%d]:%s\n",mac,i,priv->sta_conn_fail[i].addr);
+ return 1;
+ }
+ }
+
+
+ return 0;
+}
+
+
int psk_indicate_evt(struct rtl8192cd_priv *priv, int id, unsigned char *mac, unsigned char *msg, int len)
{
struct stat_info *pstat;
@@ -5900,6 +5986,13 @@
#endif
pstat = get_stainfo(priv, mac);
+
+ if(check_mac_is_or_not_in_deny_list(priv,pstat->cmn_info.mac_addr))
+ {
+ printk("Auth Mac %s in deny mac lists\n",pstat->cmn_info.mac_addr);
+ ToDrv_DisconnectSTA(priv, pstat, RSN_MIC_failure);
+ return -1;
+ }
// button 2009.05.21
#if 0
if (pstat == NULL)
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
index f095eb5..b45fb6b 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
@@ -10,6 +10,9 @@
#ifndef _8192CD_PSK_H_
#define _8192CD_PSK_H_
+extern char g_deny_mac[16];
+extern int g_total_count;
+extern char g_dev_name[16];
#define GMK_LEN 32
#define GTK_LEN 32
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
index c928555..7148f37 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
@@ -518,6 +518,10 @@
unsigned char txpwr_reduction;
unsigned char rfe_type;
unsigned int acs_type;
+ unsigned int deny_mac_count;
+ unsigned int deny_connect_pid;
+ unsigned int empty_sta_conn_fail_flag;
+ char deny_interface_name[16];
//NHM_ACS2_SUPPORT start
unsigned int acs2_dis_clean_channel;
unsigned int acs2_round; // 200ms per round <SS_AUTO_CHNL_ACS2_TO>
应用层修改
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <signal.h>
+#include <errno.h>
+#define BLACK_MAC_DENY_FILE "/tmp/.hostapd_black_mac"
+int g_black_time = 5*60; //5min
+int g_black_count = 100; //100 time
+char g_old_deny_mac[18] = {0};
+int add_black_mac_to_file(char *mac);
+void remove_mac_from_black_acl(void);
+int find_and_del_mac_from_old_file(char *mac);
+void sigcallback(int sigo);
+int get_deny_mac(char *mac, int len, char *value, char *ifname);
+int find_mac_from_file(char *mac);
+void del_ebtables_wifi_crak(void);
+void init_ebtables_wifi_crak(char *mac);
+int update_connect_pid_to_wifi(void);
+void update_deny_mac_count_to_mib(void);
+void disable_acl_list(void);
+
+void disable_acl_list(void)
+{
+ char buf[128] = {0};
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan0",0);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan1",0);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan0-va0",0);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan1-va0",0);
+ system(buf);
+
+ return;
+}
+int update_acl_list_to_wifi(char *value, char *ifname)
+{
+ char buf[128] = {0};
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d",ifname,2);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv %s set_mib acladdr=%s",ifname,value);
+ system(buf);
+
+ return 0;
+}
+int update_connect_pid_to_wifi(void)
+{
+ pid_t process_id;
+ char buf[128] = {0};
+
+ process_id= getpid();
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib deny_connect_pid=%d",process_id);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib deny_connect_pid=%d",process_id);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib deny_connect_pid=%d",process_id);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib deny_connect_pid=%d",process_id);
+ system(buf);
+
+ return 0;
+}
+void update_deny_mac_count_to_mib(void)
+{
+ char buf[128] = {0};
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib deny_mac_count=%d",g_black_count);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib deny_mac_count=%d",g_black_count);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib deny_mac_count=%d",g_black_count);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib deny_mac_count=%d",g_black_count);
+ system(buf);
+
+ return;
+}
+void empty_sta_conn_fail(char *ifname,int flag)
+{
+ char buf[128] = {0};
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib empty_sta_conn_fail_flag=%d",flag);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib empty_sta_conn_fail_flag=%d",flag);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib empty_sta_conn_fail_flag=%d",flag);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib empty_sta_conn_fail_flag=%d",flag);
+ system(buf);
+
+ system("rm -rf /tmp/.hostapd_black_mac");
+
+ return;
+}
+void del_ebtables_wifi_crak(void)
+{
+ system("ebtables -D INPUT -j WiFI_CRACK");
+ system("ebtables -F WiFI_CRACK");
+ system("ebtables -X WiFI_CRACK");
+
+ return;
+}
+void init_ebtables_wifi_crak(char *mac)
+{
+ char buf[128] = {0};
+
+ system("ebtables -N WiFI_CRACK");
+ system("ebtables -I INPUT -j WiFI_CRACK");
+ system("ebtables -A WiFI_CRACK -j RETURN");
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"ebtables -t filter -I WiFI_CRACK -s %s -j DROP",mac);
+ system(buf);
+
+ return;
+}
+void remove_mac_from_black_acl(void)
+{
+ char buf[128] = {0};
+ char mac[18] = {0};
+ char value[16] = {0};
+ char ifname[16] = {0};
+ int black_time = g_black_time;
+
+ get_deny_mac(mac, sizeof(mac),value,ifname);
+ while(black_time--)
+ {
+ sleep(1);
+ printf("remove_mac_from_black_acl sleep black_time:%d mac:%s ifname:%s\n",black_time,mac,ifname);
+ }
+
+ if(find_mac_from_file(mac))
+ {
+ find_and_del_mac_from_old_file(mac);
+ }
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"ebtables -t filter -D WiFI_CRACK -s %s -j DROP",g_old_deny_mac);
+ system(buf);
+
+ memset(buf,0,sizeof(buf));
+ snprintf(buf,sizeof(buf),"echo \"del mac=%s\" >/tmp/blcakmac.log",g_old_deny_mac);
+ system(buf);
+
+ del_ebtables_wifi_crak();
+ disable_acl_list();
+ empty_sta_conn_fail(ifname,1);
+ printf("release client %s\r\n",g_old_deny_mac);
+
+ return;
+}
+int find_mac_from_file(char *mac)
+{
+ char buf[8192] = {0};
+ char *p = NULL;
+ char result[8192] = {0};
+
+ int ret = 0;
+ FILE * fp = fopen(BLACK_MAC_DENY_FILE,"r+");
+
+ if(fp == NULL)
+ {
+ printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+ return 0;
+ }
+ else
+ {
+ fgets(buf,sizeof(buf),fp);
+ if(strlen(buf) == 0)
+ {
+ fclose(fp);
+ printf("%s is empty\n",BLACK_MAC_DENY_FILE);
+ return 0;
+ }
+ if(p = strstr(buf,mac))
+ {
+ strncpy(result,p,17);
+ printf("find mac is %s\n",mac);
+ ret = 1;
+ }
+ fclose(fp);
+ }
+
+ return ret;
+}
+int find_and_del_mac_from_old_file(char *mac)
+{
+ char buf[8192] = {0};
+ char cmd[9000] = {0};
+ char *p = NULL;
+ char *q = NULL;
+
+ char result[8192] = {0};
+ int ret = 0;
+ FILE * fp = fopen(BLACK_MAC_DENY_FILE,"r+");
+
+ if(fp == NULL)
+ {
+ printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+ return 0;
+ }
+ else
+ {
+ fgets(buf,sizeof(buf),fp);
+ if(strlen(buf) == 0)
+ {
+ fclose(fp);
+ printf("%s is empty\n",BLACK_MAC_DENY_FILE);
+ return 0;
+ }
+ if(p = strstr(buf,mac))
+ {
+ if(q = strstr(p,";"))
+ {
+ q = q + 1;
+ strncpy(result,buf,strlen(buf)-strlen(p));
+ ret = 1;
+ }
+ if(strlen(result) || strlen(q))
+ {
+ memset(cmd,0,sizeof(cmd));
+ snprintf(cmd, sizeof(cmd),"echo -n \"%s%s;\" > %s", result,q,BLACK_MAC_DENY_FILE);
+ system(cmd);
+ }
+ else
+ {
+ memset(cmd,0,sizeof(cmd));
+ snprintf(cmd, sizeof(cmd),"echo -n \"\" > %s", BLACK_MAC_DENY_FILE);
+ system(cmd);
+ }
+ printf("delete mac is %s\n",mac);
+ }
+ fclose(fp);
+ }
+
+ return ret;
+}
+
+int add_black_mac_to_file(char *mac)
+{
+ char tmpbuf[8192] = {0};
+ char buf[8192] = {0};
+ char cmd[9000] = {0};
+ char *p = NULL;
+
+ FILE * fp = fopen(BLACK_MAC_DENY_FILE,"a+");
+
+ if(fp == NULL)
+ {
+ printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+ return 0;
+ }
+ else
+ {
+ fgets(buf,sizeof(buf),fp);
+ if(p = strstr(buf,mac))
+ {
+ printf("mac had existed in file\n");
+ fclose(fp);
+ return 1;
+ }
+ else
+ {
+ mac[18] = '\0';
+
+ sprintf(tmpbuf,"%s%s;",buf,mac);
+ printf("tmpbuf=%s\n",tmpbuf);
+ if(strlen(tmpbuf) > 8100)
+ {
+ fclose(fp);
+ memset(cmd,0,sizeof(cmd));
+ snprintf(cmd,sizeof(cmd),"rm -rf %s",BLACK_MAC_DENY_FILE);
+ system(cmd);
+ return 1;
+ }
+ snprintf(cmd, sizeof(cmd),"echo -n \"%s\" > %s", tmpbuf,BLACK_MAC_DENY_FILE);
+ system(cmd);
+ }
+ fclose(fp);
+ }
+
+ return 0;
+}
+
+int get_deny_mac(char *mac,int len,char *value,char *ifname)
+{
+ char macaddr[18] = {0};
+ char line[128] = {0};
+ int i =0;
+ //char value[128] = {0};
+ char wifi_info_file[64] = {0};
+ FILE *fp = NULL;
+ char *p = NULL;
+ char *q = NULL;
+ int found = 0;
+ char ifacename[4][16] = {"wlan0","wlan0-va0","wlan1","wlan1-va0"};
+
+ for(i = 0;i <4; i++)
+ {
+ memset(wifi_info_file,0,sizeof(wifi_info_file));
+ snprintf (wifi_info_file, sizeof(wifi_info_file),"/proc/%s/sta_conn_fail", ifacename[i]);
+ fp = fopen (wifi_info_file, "r");
+ if(fp != NULL)
+ {
+ while(fgets(line, sizeof(line), fp))
+ {
+ if (p = strstr (line, "MACaddr:"))
+ {
+ q = p + 8;
+ strncpy(value,q,12);
+
+ for (i = 0; i < 12; i+=2)
+ {
+ if(i < 10)
+ snprintf(macaddr + strlen(macaddr),sizeof(macaddr)-strlen(macaddr), "%c%c:", value[i], value[i+1]);
+ else
+ snprintf(macaddr + strlen(macaddr),sizeof(macaddr)-strlen(macaddr), "%c%c", value[i], value[i+1]);
+ }
+ strncpy(ifname,ifacename[i],strlen(ifacename[i]));
+ macaddr[17] = '\0';
+ found = 1;
+ printf("Found macaddr is %s ifname=%s\n",macaddr,ifname);
+ }
+ }
+ fclose(fp);
+ if(found)
+ {
+ printf("Found macaddr is %s\n",macaddr);
+ strncpy(mac,macaddr,strlen(macaddr));
+ printf("Found mac is %s\n",mac);
+ break;
+ }
+ }
+ }
+
+ return found;
+}
+
+void sigcallback(int sigo)
+{
+ char mac[18] = {0};
+ char buf[256] = {0};
+ char value[16] = {0};
+ char ifname[16] = {0};
+
+ if(sigo == SIGUSR1)
+ {
+ printf("recv signo is SIGUSR1[%d]\n",sigo);
+ get_deny_mac(mac, sizeof(mac),value,ifname);
+ if(strlen(g_old_deny_mac) == 0)
+ {
+ strncpy(g_old_deny_mac,mac,strlen(mac));
+ }
+
+ if(strncmp(mac,g_old_deny_mac,strlen(g_old_deny_mac)) != 0)
+ {
+
+ strncpy(g_old_deny_mac,mac,strlen(mac));
+ }
+ printf("get deny mac from hostapd and mac is %s\r\n",mac);
+ snprintf(buf,sizeof(buf),"echo \"recv signo from hostapd and mac:%s g_old_deny_mac=%s\" >>/tmp/blcakmac.log",
+ mac,g_old_deny_mac);
+ system(buf);
+
+
+ printf("g_black_time:%d\r\n",g_black_time);
+ del_ebtables_wifi_crak();
+ init_ebtables_wifi_crak(mac);
+ update_acl_list_to_wifi(value,ifname);
+ add_black_mac_to_file(mac);
+ pthread_t gtid = 0;
+ pthread_create(>id, NULL, remove_mac_from_black_acl, NULL);
+ pthread_detach(gtid);
+ }
+ printf("get deny mac from driver and mac is %s\r\n",mac);
+}
+
+int main(int argc, char *argv[])
+{
+ printf("------------------------->argc %d<------------------------------\r\n",argc);
+ if(argc == 4)
+ {
+ char buf[128] = {0};
+ g_black_time = atoi(argv[2]);
+ g_black_count = atoi(argv[3]);
+ printf("argv[2]:%s argv[3]:%s g_black_time:%d g_black_count=%d\n", argv[2],argv[3],g_black_time,g_black_count);
+ }
+ update_deny_mac_count_to_mib();
+ update_connect_pid_to_wifi();
+ signal(SIGUSR1, sigcallback);
+ while(1)
+ {
+ sleep(10);
+ }
+}
测试工具
https://github.com/baihengaead/wifi-crack-tool