wireless-tools源码分析-iwconfig

Wireless Tools包含了一下工具:

    iwconfig:设置基本无线参数
    iwlist:扫描、列出频率,比特率,密钥等
    iwspy:获取每个节点链接的质量(只能查阅与之相连的节点)
    iwpriv:操作Wireless Extensions 特定驱动
    ifrename: 基于各种静态标准命名接口

大多数 Linux 发行版本都在其网络初始化脚本中集成Wireless Extension,以便启动时配置无线接口。

ifconfig

iwconfig是Linux Wireless Extensions(LWE)的用户层配置工具之一。LWE是Linux下对无线网络配置的工具,包括内核的支持、用户层配置工具和驱动接口的支持三部分
ifconfig用法:
这里写图片描述

wireless-tools中iwconfig的main函数,内容如下:



/******************************* 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");
      exit(-1);
    }

  /* No argument : show the list of all device + info */
  if(argc == 1)
    iw_enum_devices(skfd, &print_info, NULL, 0);
  else
    /* Special case for help... */
    if((!strcmp(argv[1], "-h")) || (!strcmp(argv[1], "--help")))
      iw_usage();
    else
      /* Special case for version... */
      if(!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version"))
    goterr = iw_print_version_info("iwconfig");
      else
    {
      /* '--' escape device name */
      if((argc > 2) && !strcmp(argv[1], "--"))
        {
          argv++;
          argc--;
        }

      /* The device name must be the first argument */
      if(argc == 2)
        print_info(skfd, argv[1], NULL, 0);
      else
        /* The other args on the line specify options to be set... */
        goterr = set_info(skfd, argv + 2, argc - 2, argv[1]);
    }

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

  return(goterr);
}

iw_sockets_open 函数根据不同的协议创建对应的socket,以便和无线设备驱动进行交互。
iw_enum_devices函数,当输入的一个参入时,如果是网络接口,则输出网络接口状态信息。
print_info函数,获取参数信息传入后,打印出与参数对应的需求信息。
set_info 函数,设置参数输入后,进行ioctl操作,向无线设备驱动传参,并生效。


/*------------------------------------------------------------------*/
/*
 * Enumerate devices and call specified routine
 * The new way just use /proc/net/wireless, so get all wireless interfaces,
 * whether configured or not. This is the default if available.
 * The old way use SIOCGIFCONF, so get only configured interfaces (wireless
 * or not).
 */
void
iw_enum_devices(int     skfd,
        iw_enum_handler fn,
        char *      args[],
        int     count)
{
  char      buff[1024];
  FILE *    fh;
  struct ifconf ifc;
  struct ifreq *ifr;
  int       i;

#ifndef IW_RESTRIC_ENUM
  /* Check if /proc/net/dev is available */
  fh = fopen(PROC_NET_DEV, "r");
#else
  /* Check if /proc/net/wireless is available */
  fh = fopen(PROC_NET_WIRELESS, "r");
#endif

  if(fh != NULL)
    {
      /* Success : use data from /proc/net/wireless */

      /* Eat 2 lines of header */
      fgets(buff, sizeof(buff), fh);
      fgets(buff, sizeof(buff), fh);

      /* Read each device line */
      while(fgets(buff, sizeof(buff), fh))
    {
      char  name[IFNAMSIZ + 1];
      char *s;

      /* Skip empty or almost empty lines. It seems that in some
       * cases fgets return a line with only a newline. */
      if((buff[0] == '\0') || (buff[1] == '\0'))
        continue;

      /* Extract interface name */
      s = iw_get_ifname(name, sizeof(name), buff);

      if(!s)
        {
          /* Failed to parse, complain and continue */
#ifndef IW_RESTRIC_ENUM
          fprintf(stderr, "Cannot parse " PROC_NET_DEV "\n");
#else
          fprintf(stderr, "Cannot parse " PROC_NET_WIRELESS "\n");
#endif
        }
      else
        /* Got it, print info about this interface */
        (*fn)(skfd, name, args, count);
    }

      fclose(fh);
    }
  else
    {
      /* Get list of configured devices using "traditional" way */
      ifc.ifc_len = sizeof(buff);
      ifc.ifc_buf = buff;
      if(ioctl(skfd, SIOCGIFCONF, &ifc) < 0)
    {
      fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
      return;
    }
      ifr = ifc.ifc_req;

      /* Print them */
      for(i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++)
    (*fn)(skfd, ifr->ifr_name, args, count);
    }
}

其中iw_enum_handler是函数参数,传入了print_info函数:

/* Prototype for handling display of each single interface o
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值