正则表达式:
字符串倒序
:s/\(\s\+\)\(\w\w\)\(\w\w\)\(\w\w\)\(\w\w\)/ \5\4\3\2/g
wifi配置命令
usb_start.sh
驱动装载:
insmod compat.ko
insmod cfg80211.ko
insmod ath6kl_usb.ko ath6kl_p2p=0x19debug_quirks=0x200 dongle_type=1
wlan0配置方法:
启动supplicant和cli
./wpa_supplicant -i wlan0 -Dnl80211-t -c wpa-sta.conf &
./wpa_cli -i wlan0
在cli下的命令行:
scan
scan-result
add_network 0
set_network 0 ssid "ZHANTING"
set_network 0 key_mgmt WPA-PSK
set_network 0 psk "20160226"
select_network 0
q
shell下的命令(申请ip)
udhcpc -i wlan0
ping
p2p配置方法:
shell下的命令
ifconfig p2p0 192.168.49.1
udhcpd dhcpd.p2p.conf –f &
./wpa_supplicant -i p2p0 -Dnl80211 -t -c p2pdev_dual.conf &
./wpa_cli -i p2p0
在Cli下执行的命令行
p2p_find
p2p_stop_find
p2p_connect “dst device mac” pbcgo_intent=15
q
shell下的命令(分ip)
ping
wifi code flow:
-Initialization function
-register a network device
-register a ieee80211 class
-register callback function to netdev_chain(Sends notifications about the registration status ofnetwork devices)
-kernel netlink initializaion
-create a root dir in debug filesystem for debugging
-create a workqueue
p2p_find:
netlink_unicast->netlink_unicast_kernel-> genl_rcv-> netlink_rcv_skb-> genl_rcv_msg-> nl80211_trigger_scan->
ath6kl_cfg80211_scan->_ath6kl_cfg80211_scan-> ath6kl_wmi_startscan_cmd->ath6kl_wmi_cmd_send-> ath6kl_control_tx-> ath6kl_htc_tx->ath6kl_htc_pipe_tx-> htc_send_packets_multiple-> htc_try_send ->htc_issue_packets ->ath6kl_hif_pipe_send
htc_rx_completion->recv_packet_completion->do_recv_completion->ath6kl_rx->ath6kl_wmi_control_rx->ath6kl_wmi_scan_complete_rx->ath6kl_cfg80211_scan_complete_event->cfg80211_scan_done->__cfg80211_scan_done->nl80211_send_scan_done
ethernet loopback routine:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/mii.h>
#define IOCTL_READ_REGISTER SIOCDEVPRIVATE+1
#define IOCTL_WRITE_REGISTER SIOCDEVPRIVATE+2
#define IOCTL_PHY_LOOPBACK_SETUP SIOCDEVPRIVATE+8
#define IOCTL_SS_SELF_TEST_MODE_ON_OFF SIOCDEVPRIVATE+9
#define IOCTL_SS_SELF_TEST_SEND SIOCDEVPRIVATE+10
#define IOCTL_SS_SELF_TEST_GET_RESULT SIOCDEVPRIVATE+11
#define IOCTL_SS_SELF_TEST_SET_FRAME SIOCDEVPRIVATE+12
#define TEST_FRAME_LEN 1472
#define FUNCTION_NUM 4
int g_stopTest = 0;
unsigned int Test_Frame[TEST_FRAME_LEN];
FILE *fp;
struct ifr_data_struct
{
unsigned int unit;
unsigned int addr;
unsigned int data;
unsigned int len;
};
int get_PHY_register(unsigned short reg, unsigned short *value){
char *iface = "eth0";//Nvt have only one Eth port
int sock;
struct ifreq ifr;
struct mii_ioctl_data *mii = (struct mii_ioctl_data*)(&ifr.ifr_data);
/* open socket */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket");
return -1;
}
/* get the details of the iface */
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, iface, IFNAMSIZ);
if (ioctl(sock, SIOCGMIIPHY, &ifr) < 0) {
perror("SIOCGMIIPHY");
return -1;
}
mii->reg_num = reg;
mii->val_in = 0;
mii->val_out = 0;
if (ioctl(sock, SIOCGMIIREG, &ifr) < 0) {
perror("SIOCGMIIREG");
printf("Access PHY error, try again\n");
return -1;
}
*value = mii->val_out;
close(sock);
//printf("reg %X value 0x%04X\n", reg, *value);
return 0;
}
#define PHY_STATUS_REG_AN_DONE 0x0020 //bit 5
unsigned short check_AN_done_loop(int switchMode){
unsigned int an_done = 0, threshould = 500;
int rv=(-1);
unsigned short value;
if(switchMode)
printf("Please wait until PHY stable \n");
while( (threshould > 0) && (an_done == 0)){
if(!get_PHY_register(0x1, &value)){
if((value & PHY_STATUS_REG_AN_DONE)){
an_done = 1;
}
}
threshould --;
usleep(10000); // 10ms
if(threshould%20==0){
if(switchMode)
printf(".");
}
}
if(switchMode){
if(an_done)
printf("AN_DONE\n");
}
return an_done;
}
int Enable_LoopbackMode(unsigned int enable)
{
int ctrlSock=0;
struct ifreq ifr;
struct ifr_data_struct ctrl_data;
if(enable>1)
enable = 1;
if((ctrlSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
printf("[Eth_MT]: Open setup socket fail\n");
return -1;
}
memset(&ifr, 0, sizeof(struct ifreq));
strcpy(ifr.ifr_name, "eth0");
ifr.ifr_addr.sa_family = AF_INET;
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
ctrl_data.unit = enable;
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_SS_SELF_TEST_MODE_ON_OFF, &ifr)) {
printf("[Eth_MT]: IOCTL_SS_SELF_TEST_MODE_OFF fail \n");
close(ctrlSock);
return -1;
}
close(ctrlSock);
return 0;
}
int Enable_LoopbackMode_MAC(int enable)
{
int ctrlSock=0;
struct ifreq ifr;
struct ifr_data_struct ctrl_data;
if((ctrlSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
printf("[Eth_MT]: Open setup socket fail\n");
return -1;
}
memset(&ifr, 0, sizeof(struct ifreq));
strcpy(ifr.ifr_name, "eth0");
ifr.ifr_addr.sa_family = AF_INET;
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
ctrl_data.unit = 0; // 0: Read Mac Register, 1: Read DMA Register
ctrl_data.addr = 0; // GmacConfig
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_READ_REGISTER, &ifr)) {
printf("[Eth_MT]: IOCTL_READ_REGISTER fail \n");
close(ctrlSock);
return -1;
}
//printf("[Eth_MT]: IOCTL_READ_REGISTER data = %x\n", ctrl_data.data);
ctrl_data.unit = 0; // 0: Write Mac Register, 1: Write DMA Register
ctrl_data.addr = 0; // GmacConfig
if (enable)
{
ctrl_data.data |= 0x00001000; // GmacLoopback
}else{
ctrl_data.data &= ~(0x00001000);
}
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_WRITE_REGISTER, &ifr)) {
printf("[Eth_MT]: IOCTL_WRITE_REGISTER fail \n");
close(ctrlSock);
return -1;
}
close(ctrlSock);
return 0;
}
int Enable_LoopbackMode_Phy(int enable)
{
int ctrlSock=0;
struct ifreq ifr;
struct ifr_data_struct ctrl_data;
if((ctrlSock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
printf("[Eth_MT]: Open setup socket fail\n");
return -1;
}
memset(&ifr, 0, sizeof(struct ifreq));
strcpy(ifr.ifr_name, "eth0");
ifr.ifr_addr.sa_family = AF_INET;
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
//ctrl_data.unit = 1;
ctrl_data.unit = enable;
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_PHY_LOOPBACK_SETUP, &ifr)) {
printf("[Eth_MT]: IOCTL_PHY_LOOPBACK_SETUP fail \n");
close(ctrlSock);
return -1;
}
close(ctrlSock);
return 0;
}
int loopBackTest(int times)
{
int ctrlSock=0;
int i=0, testNum=0, timeout = 50;
int pkt_Total=0, pkt_Pass=0, pkt_Err=0, pkt_Timeout=0;
struct ifreq ifr;
struct ifr_data_struct ctrl_data;
int rv=0;
for(i=0 ; i<TEST_FRAME_LEN; i++){
Test_Frame[i] = 0xa55aa55a;
}
if((ctrlSock = socket(AF_INET, SOCK_DGRAM, 0))== -1){
printf("[Eth_MT]: Open setup socket fail\n");
return -1;
}
memset(&ifr, 0, sizeof(struct ifreq));
strcpy(ifr.ifr_name, "eth0");
ifr.ifr_addr.sa_family = AF_INET;
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
while(g_stopTest)
{
for(testNum=0; testNum < times; testNum++)
{
Test_Frame[0] = testNum + 0xa55aa000;
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
ctrl_data.len = TEST_FRAME_LEN;
ctrl_data.addr =(unsigned int)(Test_Frame);
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_SS_SELF_TEST_SET_FRAME, &ifr)) {
printf("[Eth_MT]: Set Test Frame fail.\n");
break;
}
/*
if(!check_AN_done_loop(0)){
printf(" ERROR: AN FAIL.\n");
//return -1;
}
*/
usleep(10000); // Waitting 10ms
if (ioctl(ctrlSock, IOCTL_SS_SELF_TEST_SEND, &ifr)) {
printf("[Eth_MT]: Self Test Send fail fail \n");
break;
}
#if 1
for(i=0; i < timeout; i++)
{
memset(&ctrl_data, 0, sizeof(struct ifr_data_struct));
ifr.ifr_data = &ctrl_data;
if (ioctl(ctrlSock, IOCTL_SS_SELF_TEST_GET_RESULT, &ifr)) {
printf("[Eth_MT]: Self Test Get Result fail \n");
break;
}
// printf("Get Result ctrl_data.data=%d \n",ctrl_data.unit);
if(ctrl_data.unit == 1)
{
pkt_Pass++;
break;
}
else if(ctrl_data.unit == 2)
{
pkt_Err++;
break;
}
usleep(100000);
}
if(i == timeout){
printf("ERROR: Too many Timeout Packets in ROUND %d\n",testNum);
pkt_Timeout++;
if (pkt_Timeout >= 5){
/*
if (log)
fprintf(fp, "ERROR: Too many Timeout Packets!\n");
else
printf("ERROR: Too many Timeout Packets!\n");
*/
break;
}
}
#endif
pkt_Total++;
if (pkt_Pass %20 == 0)
printf("Pass Packets number: %d\n", pkt_Pass);
}
/*
if( testNum == times)
{
if (log) {
fprintf(fp, "\n============= Test Result Record ==============\n");
fprintf(fp, "Total Send:%d, Pass:%d, Error:%d, Timeout:%d\n",
pkt_Total, pkt_Pass, pkt_Err, pkt_Timeout);
fprintf(fp, "\n===============================================\n");
}
else
{
printf("\n============= Test Result Record ==============\n");
printf("Total Send:%d, Pass:%d, Error:%d, Timeout:%d\n",
pkt_Total, pkt_Pass, pkt_Err, pkt_Timeout);
printf("\n===============================================\n");
}
}
*/
g_stopTest = 0;
}
close(ctrlSock);
if((pkt_Pass == 0) || (pkt_Pass != pkt_Total))
return -1;
else
return 0;
}
int main(int argc, char *argv[])
{
int i,rv=-1,x;
int test_Fail = 0;
unsigned int test_Times = 1;
//int err_argv;
int Do_mac = 0, Do_phy = 0, Do_wire = 0, Do_log = 0;
int ret = -1;
char path[512] = "";
char logfile[] = "MAC2PHY_Result.log";
struct stat buf;
unsigned short value;
char *helpString[FUNCTION_NUM] = {
" -w : Loopback mode: Wired (Please plug Tx/Rx short cable first.)",
" -m : Loopback mode: MAC",
" -p : Loopback mode: Phy",
" -t : Set test times for Wired Loopback test, ex, -t 10."
};
if(argc == 1)
{
for(i=0; i<FUNCTION_NUM; i++){
printf("%s\n", helpString[i]);
}
printf("[%s][%s]\n",__DATE__,__TIME__);
}
else
{
for (i=1; i < argc; i++) {
if (strcmp(argv[i], "-m") == 0)
Do_mac = 1;
else if (strcmp(argv[i], "-p") == 0)
Do_phy = 1;
else if (strcmp(argv[i], "-w") == 0)
Do_wire = 1;
else if (strcmp(argv[i], "-t") == 0)
{
if (argv[i+1] != NULL)
{
test_Times = atoi(argv[i+1]);
i++;
}
}
else{
printf("Invalid option\n");
return 0;
}
}
if( (Do_wire == 0) && (Do_mac == 0) && (Do_phy == 0) && (test_Times > 1)){
Do_wire = 1;
}
Enable_LoopbackMode(1);
for(i = 0; i < test_Times; i++)
{
if (Do_mac == 1){
printf("\033[1;34m==MAC LOOPBACK <#%d>==\033[0m\n",i+1);
Enable_LoopbackMode_MAC(1);
g_stopTest = 1;
ret = loopBackTest(100);
Enable_LoopbackMode_MAC(0); //recovery
if (ret < 0) {
test_Fail = 1;
printf(" ERROR: Eth-Loopback test Fail in MAC.\n");
break;
}
}
if (Do_phy == 1){
printf("\033[1;34m==PHY LOOPBACK <#%d>==\033[0m\n",i+1);
Enable_LoopbackMode_Phy(1);
if(!check_AN_done_loop(1)){
printf(" ERROR: AN FAIL.\n");
return 0;
}
//usleep(500000); //500ms
g_stopTest = 1;
ret = loopBackTest(100);
Enable_LoopbackMode_Phy(0); //recovery
if (ret < 0) {
test_Fail = 1;
printf(" ERROR: Eth-Loopback test Fail in Phy.\n");
Enable_LoopbackMode_Phy(0);
break;
}
}
if (Do_wire == 1){
printf("\033[1;34m==WIRED LOOPBACK <#%d>==\033[0m\n",i+1);
if(!check_AN_done_loop(1)){
printf(" ERROR: AN FAIL.\n");
return 0;
}
g_stopTest = 1;
ret = loopBackTest(100);
if (ret < 0) {
test_Fail = 1;
printf(" ERROR: Eth-Loopback test Fail in Wired.\n");
break;
}
}
} // for
printf("[INFO:MAC2PHY] Total: %d, OK: %d, Fail: %d\n", test_Times, (i), test_Fail);
//Enable_LoopbackMode(0);
}
return 0;
}