wireless-tools源码分析-iwlist

iwlist是一个用于显示无线网卡详细信息的Linux命令,包括扫描无线接入点、频率、频道、速率、加密等。其内部通过ioctl操作与驱动交互,获取并打印无线设备的各种状态和配置。
摘要由CSDN通过智能技术生成

iwlist

iwlist主要用来显示无线网卡的一些附加信息。
iwlist的用法:
这里写图片描述
useage: iwlist [interface] options
scanning 扫描一定范围内的无线接入点和Ad-Hoc单元信息,包括ESSID,信号质量,频段以及无线模式等
frequency 频率
channel显示设备支持的频道及当前所在的频道
rate/bitrate 设备支持的速率
encryption 加密
key 密钥
power 电源
txpower 发送功率
retry 重传机制
ap 本地无线接入点及信号质量
peers 直连
event 设备支持的无线事件
auth 当前设置的WPA认证参数
wpa 罗列设备上设置的所有WPA加密密钥
modu 罗列设备支持的调制模式及当前开启的调制模式

iwlist中的main函数,内容如下:

/*------------------------------------------------------------------*/
/*
 * The main !
 */
int
main(int    argc,
     char **    argv)
{
  int skfd;         /* generic raw socket desc. */
  char *dev;            /* device name          */
  char *cmd;            /* command          */
  char **args;          /* Command arguments */
  int count;            /* Number of arguments */
  const iwlist_cmd *iwcmd;

  if(argc < 2)
    iw_usage(1);

  /* Those don't apply to all interfaces */
  if((argc == 2) && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")))
    iw_usage(0);
  if((argc == 2) && (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")))
    return(iw_print_version_info("iwlist"));

  if(argc == 2)
    {
      cmd = argv[1];
      dev = NULL;
      args = NULL;
      count = 0;
    }
  else
    {
      cmd = argv[2];
      dev = argv[1];
      args = argv + 3;
      count = argc - 3;
    }

  /* find a command */
  iwcmd = find_command(cmd);
  if(iwcmd == NULL)
    return 1;

  /* Check arg numbers */
  if((iwcmd->max_count >= 0) && (count > iwcmd->max_count))
    {
      fprintf(stderr, "iwlist: command `%s' needs fewer arguments (max %d)\n",
          iwcmd->cmd, iwcmd->max_count);
      return 1;
    }

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

  /* do the actual work */
  if (dev)
    (*iwcmd->fn)(skfd, dev, args, count);
  else
    iw_enum_devices(skfd, iwcmd->fn, args, count);

  /* Close the socket. */
  iw_sockets_close(skfd);

  return 0;
}

iw_sockets_open函数,该函数创建了iwlist命令使用的套接字。
iw_enum_devices函数,该函数和iwconfig中的一样,也是在缺少参数的情况下打印出无线设备接口的配置信息。
iwlist_cmd是定义的iwlist_entry结构体数组,定义内容如下:

static const struct iwlist_entry iwlist_cmds[] = {
  { "scanning",     print_scanning_info,    -1, "[essid NNN] [last]" },
  { "frequency",    print_freq_info,    0, NULL },
  { "channel",      print_freq_info,    0, NULL },
  { "bitrate",      print_bitrate_info, 0, NULL },
  { "rate",     print_bitrate_info, 0, NULL },
  { "encryption",   print_keys_info,    0, NULL },
  { "keys",     print_keys_info,    0, NULL },
  { "power",        print_pm_info,      0, NULL },
#ifndef WE_ESSENTIAL
  { "txpower",      print_txpower_info, 0, NULL },
  { "retry",        print_retry_info,   0, NULL },
  { "ap",       print_ap_info,      0, NULL },
  { "accesspoints", print_ap_info,      0, NULL },
  { "peers",        print_ap_info,      0, NULL },
  { "event",        print_event_capa_info,  0, NULL },
  { "auth",     print_auth_info,    0, NULL },
  { "wpakeys",      print_wpakeys_info, 0, NULL },
  { "genie",        print_gen_ie_info,  0, NULL },
  { "modulation",   print_modul_info,   0, NULL },
#endif  /* WE_ESSENTIAL */
  { NULL, NULL, 0, 0 },
};

iwlist_entry结构体定义了命令行参数条目,和调用了iw_enum_handler函数。其中scanning调用的print_scanning_info函数,内容如下:


/*------------------------------------------------------------------*/
/*
 * Perform a scanning on one device
 */
static int
print_scanning_info(int     skfd,
            char *  ifname,
            char *  args[],     /* Command line args */
            int     count)      /* Args count */
{
  struct iwreq      wrq;
  struct iw_scan_req    scanopt;        /* Options for 'set' */
  int           scanflags = 0;      /* Flags for scan */
  unsigned char *   buffer = NULL;      /* Results */
  int           buflen = IW_SCAN_MAX_DATA; /* Min for compat WE<17 */
  struct iw_range   range;
  int           has_range;
  struct timeval    tv;             /* Select timeout */
  int           timeout = 15000000;     /* 15s */

  /* Avoid "Unused parameter" warning */
  args = args; count = count;

  /* Debugging stuff */
  if((IW_EV_LCP_PK2_LEN != IW_EV_LCP_PK_LEN) || (IW_EV_POINT_PK2_LEN != IW_EV_POINT_PK_LEN))
    {
      fprintf(stderr, "*** Please report to jt@hpl.hp.com your platform details\n");
      fprintf(stderr, "*** and the following line :\n");
      fprintf(stderr, "*** IW_EV_LCP_PK2_LEN = %zu ; IW_EV_POINT_PK2_LEN = %zu\n\n",
          IW_EV_LCP_PK2_LEN, IW_EV_POINT_PK2_LEN);
    }

  /* Get range stuff */
  has_range = (iw_get_range_info(skfd, ifname, &range) >= 0);

  /* Check if the interface could support scanning. */
  if((!has_range) || (range.we_version_compiled < 14))
    {
      fprintf(stderr, "%-8.16s  Interface doesn't support scanning.\n\n",
          ifname);
      return(-1);
    }

  /* Init timeout value -> 250ms between set and first get */
  tv.tv_sec = 0;
  tv.tv_usec = 250000;

  /* Clean up set args */
  memset(&scanopt, 0, sizeof(scanopt));

  /* Parse command line arguments and extract options.
   * Note : when we have enough options, we should use the parser
   * from iwconfig... */
  while(count > 0)
    {
      /* One arg is consumed (the option name) */
      count--;

      /*
       * Check for Active Scan (scan with specific essid)
       */
      if(!strncmp(args[0], "essid", 5))
    {
      if(count < 1)
        {
          fprintf(stderr, "Too few arguments for scanning option [%s]\n",
              args[0]);
          retu
要在CentOS 7上安装wireless-tools,您可以按照以下步骤进行操作: 1. 首先,确保您的系统已连接到互联网,并且具有管理员权限。 2. 打开终端,并使用以下命令执行更新操作,以确保您的系统是最新的: ``` sudo yum update ``` 3. 接下来,使用以下命令安装wireless-tools: ``` sudo yum install wireless-tools ``` 4. 安装过程将自动下载并安装所需的软件包。完成后,您就可以使用wireless-tools了。 请注意,如果通过yum安装时遇到问题,您可以尝试手动安装wireless-tools。根据您提供的引用,似乎在某些情况下无法通过yum安装。以下是手动安装的步骤: 1. 下载wireless-tools源码包。您可以通过访问以下链接下载: [http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz](http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz) 2. 打开终端,导航到下载目录,并执行以下命令解压源码包: ``` tar -zxvf wireless_tools.29.tar.gz ``` 3. 导航到解压后的目录: ``` cd wireless_tools.29 ``` 4. 运行以下命令进行编译和安装: ``` make && make install ``` 完成后,wireless-tools将安装到您的系统上。您可以使用iwconfig等命令来配置和管理无线网络。 请注意,如果在执行iwconfig命令时出现`libiw.so.29: cannot open shared object file: No such file or directory`错误,可能是由于缺少libiw.so.29库文件导致的。您可以尝试使用以下命令解决该问题: ``` sudo ldconfig ``` 这将更新共享库缓存并解决缺少库文件的问题。 希望这可以帮助您成功安装wireless-tools。如果您还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [centos7 安装无线工具包wireless-tools(包括iwlist,iwconfig等命令)](https://blog.csdn.net/a9073b/article/details/102596622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [centos7安装wireless-tools](https://blog.csdn.net/ppwwp/article/details/102789881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值