wireless-tools源码分析-iwpriv

iwpriv是Wireless Extensions的一部分,用于访问特定驱动的私有功能。本文深入分析iwpriv的源码,包括其主要函数如print_info、get_priv、set_priv等,详细阐述如何通过ioctl获取和设置无线驱动的私有数据和配置,进一步理解无线设备驱动的工作原理。
摘要由CSDN通过智能技术生成

iwpriv是Wireless Extensions 操作的特定驱动。通过iwpriv,可以得到AP的一些参数设置,也可以设置自己的WIFI参数。

[root@root- /]#iwpriv
wlan0     Available private ioctls :
      extscan          (8BFA) : set   0 int   & get   2 char
      hostcmd          (8BE4) : set 2047 byte  & get 2047 byte
      arpfilter        (8BE6) : set 2047 byte  & get 2047 byte
      regrdwr          (8BE3) : set 256 char  & get 256 char
      sdcmd52rw        (8BFE) : set   7 byte  & get   7 byte
      sdcmd53rw        (8BFF) : set   0 char  & get   0 char
      setgetconf       (8BEA) : set 2000 byte  & get 2000 byte
      getcis           (8BE1) : set   0       & get 512 byte
      scantype         (8BEB) : set   8 char  & get   8 char
      deauth           (0001) : set   1 addr  & get   0
      getNF            (0001) : set   1 int   & get   1 int
      getRSSI          (0002) : set   1 int   & get   1 int
      bgscan           (0004) : set   1 int   & get   1 int
      enable11d        (0005) : set   1 int   & get   1 int
      adhocgrate       (0006) : set   1 int   & get   1 int
      sdioclock        (0007) : set   1 int   & get   1 int
      wmm              (0008) : set   1 int   & get   1 int
      uapsdnullgen     (000A) : set   1 int   & get   1 int
      setcoalescing    (000B) : set   1 int   & get   1 int
      adhocgprot       (000C) : set   1 int   & get   1 int
      disable_chsw     (000F) : set   1 int   & get   1 int
      setpowercons     (0001) : set   1 int   & get   1 int
      wmm_qosinfo      (0002) : set   1 int   & get   1 int
      lolisteninter    (0003) : set   1 int   & get   1 int
      psnullinterval   (0005) : set   1 int   & get   1 int
      bcnmisto         (0006) : set   1 int   & get   1 int
      ldocfg           (0008) : set   1 int   & get   1 int
      rtsctsctrl       (000F) : set   1 int   & get   1 int
      moduletype       (000B) : set   1 int   & get   1 int
      autodeepsleep    (000C) : set   1 int   & get   1 int
      enhanceps        (000D) : set   1 int   & get   1 int
      wakeupmt         (000E) : set   1 int   & get   1 int
      setrxant         (0001) : set   1 int   & get   0
      settxant         (0002) : set   1 int   & get   0
      authalgs         (0004) : set   1 int   & get   0
      encryptionmode   (0005) : set   1 int   & get   0
      setregioncode    (0006) : set   1 int   & get   0
      setlisteninter   (0007) : set   1 int   & get   0
      setmultipledtim  (0008) : set   1 int   & get   0
      setbcnavg        (0009) : set   1 int   & get   0
      setdataavg       (000A) : set   1 int   & get   0
      associate        (000B) : set   1 int   & get   0
      getregioncode    (0001) : set   0       & get   1 int
      getlisteninter   (0002) : set   0       & get   1 int
      getmultipledtim  (0003) : set   0       & get   1 int
      gettxrate        (0004) : set   0       & get   1 int
      getbcnavg        (0005) : set   0       & get   1 int
      getdataavg       (0006) : set   0       & get   1 int
      getauthtype      (0007) : set   0       & get   1 int
      getrsnmode       (0008) : set   0       & get   1 int
      act_paircipher   (0009) : set   0       & get   1 int
      act_groupcipher  (000A) : set   0       & get   1 int
      getdtim          (000B) : set   0       & get   1 int
      getrxant         (0001) : set   0       & get  12 char
      gettxant         (0002) : set   0       & get  12 char
      gettsf           (0003) : set   0       & get  12 char
      wpssession       (0004) : set   0       & get  12 char
      deepsleep        (8BFB) : set   1 char  & get   6 char
      adhocstop        (0004) : set   0       & get   0
      radioon          (0001) : set   0       & get   0
      radiooff         (0002) : set   0       & get   0
      rmaeskey         (0003) : set   0       & get   0
      crypto_test      (0006) : set   0       & get   0
      reasso-on        (0007) : set   0       & get   0
      reasso-off       (0008) : set   0       & get   0
      wlanidle-on      (0009) : set   0       & get   0
      wlanidle-off     (000A) : set   0       & get   0
      softreset        (000C) : set   0       & get   0
      sleepparams      (0002) : set  64 char  & get  64 char
      requesttpc       (0004) : set  64 char  & get  64 char
      powercap         (0005) : set  64 char  & get  64 char
      measreq          (000C) : set  64 char  & get  64 char
      bca-ts           (0003) : set  64 char  & get  64 char
      scanmode         (0006) : set  64 char  & get  64 char
      getadhocstatus   (0009) : set  64 char  & get  64 char
      setgenie         (000A) : set  64 char  & get  64 char
      getgenie         (000B) : set  64 char  & get  64 char
      qstatus          (000D) : set  64 char  & get  64 char
      ts_status        (000E) : set  64 char  & get  64 char
      setaeskey        (0001) : set  32 char  & get   0
      getaeskey        (0001) : set   1 int   & get 128 char
      version          (0002) : set   1 int   & get 128 char
      verext           (0003) : set   1 int   & get 128 char
      setwpaie         (8BE0) : set  24 char  & get   0
      setband          (0001) : set  10 char  & get   0
      setadhocch       (0002) : set  10 char  & get   0
      chanswann        (0003) : set  10 char  & get   0
      getband          (0001) : set   0       & get  10 char
      getadhocch       (0002) : set   0       & get  10 char
      getlog           (8BE9) : set   0       & get 512 char
      tpccfg           (0001) : set  16 int   & get  16 int
      scanprobes       (0006) : set  16 int   & get  16 int
      ledgpio          (0005) : set  16 int   & get  16 int
      sleeppd          (0007) : set  16 int   & get  16 int
      rateadapt        (0008) : set  16 int   & get  16 int
      getSNR           (0009) : set  16 int   & get  16 int
      getrate          (000A) : set  16 int   & get  16 int
      getrxinfo        (000B) : set  16 int   & get  16 int
      atimwindow       (000C) : set  16 int   & get  16 int
      bcninterval      (000D) : set  16 int   & get  16 int
      sdiopullctrl     (000E) : set  16 int   & get  16 int
      scantime         (000F) : set  16 int   & get  16 int
      sysclock         (0010) : set  16 int   & get  16 int
      txcontrol        (0012) : set  16 int   & get  16 int
      hscfg            (0014) : set  16 int   & get  16 int
      hssetpara        (0015) : set  16 int   & get  16 int
      inactoext        (0016) : set  16 int   & get  16 int
      dbgscfg          (0017) : set  16 int   & get  16 int
      drvdbg           (0018) : set  16 int   & get  16 int
      drvdelaymax      (001A) : set  16 int   & get  16 int
      intfctrl         (001B) : set  16 int   & get  16 int
      setquietie       (001C) : set  16 int   & get  16 int
      ctspowerctrl     (001E) : set  16 int   & get  16 int
      psmode           (001F) : set  16 int   & get  16 int
      setuserscan      (0001) : set 2000 byte  & get 2000 byte
      getscantable     (0002) : set 2000 byte  & get 2000 byte
      setmrvltlv       (0003) : set 2000 byte  & get 2000 byte
      getassocrsp      (0004) : set 2000 byte  & get 2000 byte
      addts            (0005) : set 2000 byte  & get 2000 byte
      delts            (0006) : set 2000 byte  & get 2000 byte
      qconfig          (0007) : set 2000 byte  & get 2000 byte
      qstats           (0008) : set 2000 byte  & get 2000 byte
      txpktstats       (000C) : set 2000 byte  & get 2000 byte
      getcfptable      (0009) : set 2000 byte  & get 2000 byte
      mefcfg           (000A) : set 2000 byte  & get 2000 byte
      getmem           (000B) : set 2000 byte  & get 2000 byte

iwpriv源码中的main函数,内容如下:

/*------------------------------------------------------------------*/
/*
 * The main !
 */
int
main(int    argc,
     char **    argv)
{
  int skfd;     /* generic raw socket desc. */
  int goterr = 0;

  /* Create a channel to the NET kernel. */
  if((skfd = iw_sockets_open()) < 0)
    {
      perror("socket");
      return(-1);
    }

  /* No argument : show the list of all devices + ioctl list */
  if(argc == 1)
    iw_enum_devices(skfd, &print_priv_info, NULL, 0);
  else
    /* Special cases take one... */
    /* All */
    if((!strncmp(argv[1], "-a", 2)) || (!strcmp(argv[1], "--all")))
      iw_enum_devices(skfd, &print_priv_all, NULL, 0);
    else
      /* Help */
      if((!strncmp(argv[1], "-h", 2)) || (!strcmp(argv[1],
`iwpriv`命令的源码主要位于Linux内核源代码树中的`net/wireless/wext-core.c`文件中,以下是该文件中`ioctl_standard_iwpriv`函数的源码解析: ```c static int ioctl_standard_iwpriv(struct net_device *dev, struct iwreq *iwr, u32 cmd) { /* 通过命令码cmd解析出设备驱动程序中相应的命令处理函数 */ struct iw_priv_args *priv; struct iw_handler_def *iwe; int i, count; struct iw_priv_args user_priv; void __user *argp = iwr->u.name; int (*handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, struct iw_priv_args *); union iwreq_data wrqu; int ret = 0; /* 遍历设备驱动程序中支持的所有IWPRIV命令 */ for (i = 0; i < dev->ieee80211_ptr->priv_args_count; i++) { priv = &dev->ieee80211_ptr->priv_args[i]; if ((!priv->name) || (!priv->set)) { continue; } if (strcmp(priv->name, iwr->u.name) == 0) { /* 找到要执行的IWPRIV命令 */ iwe = priv->handler; count = iwe->num_standard; /* 该命令支持的标准命令个数 */ if (iwe->flags & IW_HANDLER_SPECIAL) { /* 特殊处理的IWPRIV命令 */ handler = iwe->standard[count].handler; if (!handler) return -EOPNOTSUPP; ret = handler(dev, NULL, &wrqu, priv); } else { /* 标准IWPRIV命令 */ handler = iwe->standard[IW_PRIV_CMD_GET].handler; if (!handler) return -EOPNOTSUPP; /* 解析参数 */ if (iwe->standard[IW_PRIV_CMD_SET].handler) { if (copy_from_user(&user_priv, argp, sizeof(user_priv))) return -EFAULT; wrqu.data.pointer = user_priv.pointer; wrqu.data.length = user_priv.length; wrqu.data.flags = user_priv.flags; } /* 调用设备驱动程序中的命令处理函数 */ ret = handler(dev, NULL, &wrqu, priv); /* 将处理结果返回给用户空间 */ if (iwe->standard[IW_PRIV_CMD_GET].handler) { if (copy_to_user(argp, &user_priv, sizeof(user_priv))) return -EFAULT; } } break; } } if (i == dev->ieee80211_ptr->priv_args_count) /* 没有找到要执行的IWPRIV命令 */ ret = -EOPNOTSUPP; return ret; } ``` `ioctl_standard_iwpriv`函数主要实现了`iwpriv`命令的功能。它通过解析`iwr->u.name`中的命令参数,找到对应的设备驱动程序中的命令处理函数,并通过调用该函数完成相应的操作。该函数的主要步骤包括: 1. 遍历设备驱动程序中支持的所有IWPRIV命令,找到要执行的IWPRIV命令。 2. 解析命令参数,根据命令处理函数的要求设置对应的参数值。 3. 调用设备驱动程序中的命令处理函数,完成相应的操作。 4. 将处理结果返回给用户空间。 在该函数中,命令处理函数主要分为两种类型:标准IWPRIV命令和特殊处理的IWPRIV命令。对于标准IWPRIV命令,用户空间可以通过`ioctl`系统调用的`arg`参数向内核空间传递一些参数,内核空间则通过解析这些参数来执行相应的操作;对于特殊处理的IWPRIV命令,用户空间直接调用该命令即可,不需要传递任何参数。 总的来说,`ioctl_standard_iwpriv`函数的实现比较复杂,需要涉及到内核空间和用户空间之间的数据传输、命令参数的解析和处理等方面的问题。如果您想要深入了解该函数的实现细节,可以仔细阅读该函数的源码,并结合相关的内核文档进行学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值