⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iwlist.c

📁 访问网卡的各种信息
💻 C
📖 第 1 页 / 共 4 页
字号:
          if(range.pm_capa & IW_POWER_MULTICAST_R)
            printf("\t\to Receive Multicast only (discard unicast)\n          ");
          if(range.pm_capa & IW_POWER_FORCE_S)
            printf("\t\to Force sending using Power Management\n          ");
          if(range.pm_capa & IW_POWER_REPEATER)
            printf("\t\to Repeat multicast\n          ");
        }
      /* Display min/max period availables */
      if(range.pmp_flags & IW_POWER_PERIOD)
        {
          int	flags = (range.pmp_flags & ~(IW_POWER_MIN | IW_POWER_MAX));
          /* Display if auto or fixed */
          if(range.pmp_flags & IW_POWER_MIN)
            printf("Auto  period  ; ");
          else
            printf("Fixed period  ; ");
          /* Print the range */
          iw_print_pm_value(buffer, sizeof(buffer),
                            range.min_pmp, flags | IW_POWER_MIN);
          printf("%s\n                          ", buffer);
          iw_print_pm_value(buffer, sizeof(buffer),
                            range.max_pmp, flags | IW_POWER_MAX);
          printf("%s\n          ", buffer);
        }
      /* Display min/max timeout availables */
      if(range.pmt_flags & IW_POWER_TIMEOUT)
        {
          int	flags = (range.pmt_flags & ~(IW_POWER_MIN | IW_POWER_MAX));
          /* Display if auto or fixed */
          if(range.pmt_flags & IW_POWER_MIN)
            printf("Auto  timeout ; ");
          else
            printf("Fixed timeout ; ");
          /* Print the range */
          iw_print_pm_value(buffer, sizeof(buffer),
                            range.min_pmt, flags | IW_POWER_MIN);
          printf("%s\n                          ", buffer);
          iw_print_pm_value(buffer, sizeof(buffer),
                            range.max_pmt, flags | IW_POWER_MAX);
          printf("%s\n          ", buffer);
        }

      /* Get current Power Management settings */
      wrq.u.power.flags = 0;
      if(iw_get_ext(skfd, ifname, SIOCGIWPOWER, &wrq) >= 0)
        {
          int	flags = wrq.u.power.flags;

          /* Is it disabled ? */
          if(wrq.u.power.disabled)
            printf("Current mode:off\n          ");
          else
            {
              int	pm_mask = 0;

              /* Let's check the mode */
              iw_print_pm_mode(buffer, sizeof(buffer), flags);
              printf("Current %s", buffer);

              /* Let's check if nothing (simply on) */
              if((flags & IW_POWER_MODE) == IW_POWER_ON)
                printf("mode:on");
              printf("\n                 ");

              /* Let's check the value and its type */
              if(wrq.u.power.flags & IW_POWER_TYPE)
                {
                  iw_print_pm_value(buffer, sizeof(buffer),
                                    wrq.u.power.value, wrq.u.power.flags);
                  printf("%s", buffer);
                }

              /* If we have been returned a MIN value, ask for the MAX */
              if(flags & IW_POWER_MIN)
                pm_mask = IW_POWER_MAX;
              /* If we have been returned a MAX value, ask for the MIN */
              if(flags & IW_POWER_MAX)
                pm_mask = IW_POWER_MIN;
              /* If we have something to ask for... */
              if(pm_mask)
                get_pm_value(skfd, ifname, &wrq, pm_mask,
                             buffer, sizeof(buffer));

              /* And if we have both a period and a timeout, ask the other */
              pm_mask = (range.pm_capa & (~(wrq.u.power.flags) &
                                          IW_POWER_TYPE));
              if(pm_mask)
                {
                  int	base_mask = pm_mask;
                  flags = get_pm_value(skfd, ifname, &wrq, pm_mask,
                                       buffer, sizeof(buffer));
                  pm_mask = 0;

                  /* If we have been returned a MIN value, ask for the MAX */
                  if(flags & IW_POWER_MIN)
                    pm_mask = IW_POWER_MAX | base_mask;
                  /* If we have been returned a MAX value, ask for the MIN */
                  if(flags & IW_POWER_MAX)
                    pm_mask = IW_POWER_MIN | base_mask;
                  /* If we have something to ask for... */
                  if(pm_mask)
                    get_pm_value(skfd, ifname, &wrq, pm_mask,
                                 buffer, sizeof(buffer));
                }
            }
        }
      printf("\n");
    }
  return(0);
}

/************************** TRANSMIT POWER **************************/

/*------------------------------------------------------------------*/
/*
 * Print the number of available transmit powers for the device
 */
static int
print_txpower_info(int		skfd,
                   char *	ifname,
                   char *	args[],		/* Command line args */
                   int		count)		/* Args count */
{
  struct iwreq		wrq;
  struct iw_range	range;
  int			dbm;
  int			mwatt;
  int			k;

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

  /* Extract range info */
  if((iw_get_range_info(skfd, ifname, &range) < 0) ||
     (range.we_version_compiled < 10))
      fprintf(stderr, "%-8.16s  no transmit-power information.\n\n",
                      ifname);
  else
    {
      if((range.num_txpower <= 0) || (range.num_txpower > IW_MAX_TXPOWER))
        printf("%-8.16s  unknown transmit-power information.\n\n", ifname);
      else
        {
          printf("%-8.16s  %d available transmit-powers :\n",
                 ifname, range.num_txpower);
          /* Print them all */
          for(k = 0; k < range.num_txpower; k++)
            {
              /* Check for relative values */
              if(range.txpower_capa & IW_TXPOW_RELATIVE)
                {
                  printf("\t  %d (no units)\n", range.txpower[k]);
                }
              else
                {
                  if(range.txpower_capa & IW_TXPOW_MWATT)
                    {
                      dbm = iw_mwatt2dbm(range.txpower[k]);
                      mwatt = range.txpower[k];
                    }
                  else
                    {
                      dbm = range.txpower[k];
                      mwatt = iw_dbm2mwatt(range.txpower[k]);
                    }
                  printf("\t  %d dBm  \t(%d mW)\n", dbm, mwatt);
                }
            }
        }

      /* Get current Transmit Power */
      if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) >= 0)
        {
          printf("          Current Tx-Power");
          /* Disabled ? */
          if(wrq.u.txpower.disabled)
            printf(":off\n\n");
          else
            {
              /* Fixed ? */
              if(wrq.u.txpower.fixed)
                printf("=");
              else
                printf(":");
              /* Check for relative values */
              if(wrq.u.txpower.flags & IW_TXPOW_RELATIVE)
                {
                  /* I just hate relative value, because they are
                   * driver specific, so not very meaningfull to apps.
                   * But, we have to support that, because
                   * this is the way hardware is... */
                  printf("\t  %d (no units)\n", wrq.u.txpower.value);
                }
              else
                {
                  if(wrq.u.txpower.flags & IW_TXPOW_MWATT)
                    {
                      dbm = iw_mwatt2dbm(wrq.u.txpower.value);
                      mwatt = wrq.u.txpower.value;
                    }
                  else
                    {
                      dbm = wrq.u.txpower.value;
                      mwatt = iw_dbm2mwatt(wrq.u.txpower.value);
                    }
                  printf("%d dBm  \t(%d mW)\n\n", dbm, mwatt);
                }
            }
        }
    }
  return(0);
}

/*********************** RETRY LIMIT/LIFETIME ***********************/

/*------------------------------------------------------------------*/
/*
 * Print one retry value
 */
static inline int
get_retry_value(int		skfd,
                char *		ifname,
                struct iwreq *	pwrq,
                int		flags,
                char *		buffer,
                int		buflen)
{
  /* Get Another retry value */
  pwrq->u.retry.flags = flags;
  if(iw_get_ext(skfd, ifname, SIOCGIWRETRY, pwrq) >= 0)
    {
      /* Let's check the value and its type */
      if(pwrq->u.retry.flags & IW_RETRY_TYPE)
        {
          iw_print_retry_value(buffer, buflen,
                               pwrq->u.retry.value, pwrq->u.retry.flags);
          printf("%s\n                 ", buffer);
        }
    }
  return(pwrq->u.retry.flags);
}

/*------------------------------------------------------------------*/
/*
 * Print Retry info for each device
 */
static int
print_retry_info(int		skfd,
                 char *		ifname,
                 char *		args[],		/* Command line args */
                 int		count)		/* Args count */
{
  struct iwreq		wrq;
  struct iw_range	range;
  char			buffer[128];

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

  /* Extract range info */
  if((iw_get_range_info(skfd, ifname, &range) < 0) ||
     (range.we_version_compiled < 11))
    fprintf(stderr, "%-8.16s  no retry limit/lifetime information.\n\n",
            ifname);
  else
    {
      printf("%-8.16s  ", ifname);

      /* Display min/max limit availables */
      if(range.retry_flags & IW_RETRY_LIMIT)
        {
          int	flags = (range.retry_flags & ~(IW_RETRY_MIN | IW_RETRY_MAX));
          /* Display if auto or fixed */
          if(range.retry_flags & IW_RETRY_MIN)
            printf("Auto  limit    ; ");
          else
            printf("Fixed limit    ; ");
          /* Print the range */
          iw_print_retry_value(buffer, sizeof(buffer),
                               range.min_retry, flags | IW_RETRY_MIN);
          printf("%s\n                           ", buffer);
          iw_print_retry_value(buffer, sizeof(buffer),
                               range.max_retry, flags | IW_RETRY_MAX);
          printf("%s\n          ", buffer);
          
        }
      /* Display min/max lifetime availables */
      if(range.r_time_flags & IW_RETRY_LIFETIME)
        {
          int	flags = (range.r_time_flags & ~(IW_RETRY_MIN | IW_RETRY_MAX));
          /* Display if auto or fixed */
          if(range.r_time_flags & IW_RETRY_MIN)
            printf("Auto  lifetime ; ");
          else
            printf("Fixed lifetime ; ");
          /* Print the range */
          iw_print_retry_value(buffer, sizeof(buffer),
                               range.min_r_time, flags | IW_RETRY_MIN);
          printf("%s\n                           ", buffer);
          iw_print_retry_value(buffer, sizeof(buffer),
                               range.max_r_time, flags | IW_RETRY_MAX);
          printf("%s\n          ", buffer);
          
        }

      /* Get current retry settings */
      wrq.u.retry.flags = 0;
      if(iw_get_ext(skfd, ifname, SIOCGIWRETRY, &wrq) >= 0)
        {
          int	flags = wrq.u.retry.flags;

          /* Is it disabled ? */
          if(wrq.u.retry.disabled)
            printf("Current mode:off\n          ");
          else
            {
              int	retry_mask = 0;

              /* Let's check the mode */
              printf("Current mode:on\n                 ");

              /* Let's check the value and its type */
              if(wrq.u.retry.flags & IW_RETRY_TYPE)
                {
                  iw_print_retry_value(buffer, sizeof(buffer),
                                       wrq.u.retry.value, wrq.u.retry.flags);
                  printf("%s\n                 ", buffer);
                }

              /* If we have been returned a MIN value, ask for the MAX */
              if(flags & IW_RETRY_MIN)
                retry_mask = IW_RETRY_MAX;
              /* If we have been returned a MAX value, ask for the MIN */
              if(flags & IW_RETRY_MAX)
                retry_mask = IW_RETRY_MIN;
              /* If we have something to ask for... */
              if(retry_mask)
                get_retry_value(skfd, ifname, &wrq, retry_mask,
                                buffer, sizeof(buffer));

              /* And if we have both a period and a timeout, ask the other */
              retry_mask = (range.retry_capa & (~(wrq.u.retry.flags) &
                                          IW_RETRY_TYPE));
              if(retry_mask)
                {
                  int	base_mask = retry_mask;
                  flags = get_retry_value(skfd, ifname, &wrq, retry_mask,
                                          buffer, sizeof(buffer));
                  retry_mask = 0;

                  /* If we have been returned a MIN value, ask for the MAX */
                  if(flags & IW_RETRY_MIN)
                    retry_mask = IW_RETRY_MAX | base_mask;
                  /* If we have been returned a MAX value, ask for the MIN */
                  if(flags & IW_RETRY_MAX)
                    retry_mask = IW_RETRY_MIN | base_mask;
                  /* If we have something to ask for... */
                  if(retry_mask)
                    get_retry_value(skfd, ifname, &wrq, retry_mask,
                                    buffer, sizeof(buffer));
                }
            }
        }
      printf("\n");
    }
  return(0);
}

/***************************** SCANNING *****************************/
/*
 * This one behave quite differently from the others
 *
 * Note that we don't use the scanning capability of iwlib (functions
 * iw_process_scan() and iw_scan()). The main reason is that
 * iw_process_scan() return only a subset of the scan data to the caller,
 * for example custom elements and bitrates are ommited. Here, we
 * do the complete job...
 */

/*------------------------------------------------------------------*/
/*
 * Parse, and display the results of a WPA or WPA2 IE.
 *
 */
static void 
iw_print_ie_unknown(unsigned char *	iebuf,
                    int			buflen)
{
  int	ielen = iebuf[1] + 2;
  int	i;

  if(ielen > buflen)
    ielen = buflen;

  printf("Unknown: ");
  for(i = 0; i < ielen; i++)
    printf("%02X", iebuf[i]);
  printf("\n");
}

/*-----------------------------------------------------------------*/
/*
 * Display the cipher type for the value passed in.
 *
 */
static inline void 
iw_print_ie_cipher(unsigned char	csuite)
{
  switch (csuite)
    {
    case 0x00:
      printf("None or same as Group ");
      break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -