杂记

来源:互联网 发布:逐鹿seo 编辑:程序博客网 时间:2024/05/03 06:44


正则表达式:

字符串倒序
: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配置方法:


启动supplicantcli


./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:



cfg80211_init()


  -Initialization function


register_pernet_device()


  -register a network device


wiphy_sysfs_init()


  -register a ieee80211 class


register_netdevice_notifier()


  -register callback function to netdev_chain(Sends notifications about the registration status ofnetwork devices)


nl80211_init()


  -kernel netlinkinitializaion


debugfs_create_dir()


  -create a root dir in debug filesystem for debugging


create_singlethread_workqueue()


  -create a workqueue


p2p_find:



Send flow:


  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


Receive flow:


  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; 
}









 


0 0
原创粉丝点击