📄 iwconfig.c
字号:
/*
* Wireless Tools
*
* Jean II - HPLB 97->99 - HPL 99->04
*
* Main code for "iwconfig". This is the generic tool for most
* manipulations...
* You need to link this code against "iwlib.c" and "-lm".
*
* This file is released under the GPL license.
* Copyright (c) 1997-2004 Jean Tourrilhes <jt@hpl.hp.com>
*/
#include "iwlib.h" /* Header */
/************************* MISC SUBROUTINES **************************/
/*------------------------------------------------------------------*/
/*
* Print usage string
*/
static void
iw_usage(void)
{
fprintf(stderr,
"Usage: iwconfig interface [essid {NN|on|off}]\n"
" [nwid {NN|on|off}]\n"
" [mode {managed|ad-hoc|...}\n"
" [freq N.NNNN[k|M|G]]\n"
" [channel N]\n"
" [ap {N|off|auto}]\n"
" [sens N]\n"
" [nick N]\n"
" [rate {N|auto|fixed}]\n"
" [rts {N|auto|fixed|off}]\n"
" [frag {N|auto|fixed|off}]\n"
" [enc {NNNN-NNNN|off}]\n"
" [power {period N|timeout N}]\n"
" [retry {limit N|lifetime N}]\n"
" [txpower N {mW|dBm}]\n"
" [commit]\n"
" Check man pages for more details.\n\n"
);
}
/************************* DISPLAY ROUTINES **************************/
/*------------------------------------------------------------------*/
/*
* Get wireless informations & config from the device driver
* We will call all the classical wireless ioctl on the driver through
* the socket to know what is supported and to get the settings...
*/
static int
get_info(int skfd,
char * ifname,
struct wireless_info * info)
{
struct iwreq wrq;
memset((char *) info, 0, sizeof(struct wireless_info));
/* Get basic information */
if(iw_get_basic_config(skfd, ifname, &(info->b)) < 0)
{
/* If no wireless name : no wireless extensions */
/* But let's check if the interface exists at all */
struct ifreq ifr;
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if(ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
return(-ENODEV);
else
return(-ENOTSUP);
}
/* Get ranges */
if(iw_get_range_info(skfd, ifname, &(info->range)) >= 0)
info->has_range = 1;
/* Get sensitivity */
if(iw_get_ext(skfd, ifname, SIOCGIWSENS, &wrq) >= 0)
{
info->has_sens = 1;
memcpy(&(info->sens), &(wrq.u.sens), sizeof(iwparam));
}
/* Get AP address */
if(iw_get_ext(skfd, ifname, SIOCGIWAP, &wrq) >= 0)
{
info->has_ap_addr = 1;
memcpy(&(info->ap_addr), &(wrq.u.ap_addr), sizeof (sockaddr));
}
/* Get NickName */
wrq.u.essid.pointer = (caddr_t) info->nickname;
wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
wrq.u.essid.flags = 0;
if(iw_get_ext(skfd, ifname, SIOCGIWNICKN, &wrq) >= 0)
if(wrq.u.data.length > 1)
info->has_nickname = 1;
/* Get bit rate */
if(iw_get_ext(skfd, ifname, SIOCGIWRATE, &wrq) >= 0)
{
info->has_bitrate = 1;
memcpy(&(info->bitrate), &(wrq.u.bitrate), sizeof(iwparam));
}
/* Get RTS threshold */
if(iw_get_ext(skfd, ifname, SIOCGIWRTS, &wrq) >= 0)
{
info->has_rts = 1;
memcpy(&(info->rts), &(wrq.u.rts), sizeof(iwparam));
}
/* Get fragmentation threshold */
if(iw_get_ext(skfd, ifname, SIOCGIWFRAG, &wrq) >= 0)
{
info->has_frag = 1;
memcpy(&(info->frag), &(wrq.u.frag), sizeof(iwparam));
}
/* Get Power Management settings */
wrq.u.power.flags = 0;
if(iw_get_ext(skfd, ifname, SIOCGIWPOWER, &wrq) >= 0)
{
info->has_power = 1;
memcpy(&(info->power), &(wrq.u.power), sizeof(iwparam));
}
if((info->has_range) && (info->range.we_version_compiled > 9))
{
/* Get Transmit Power */
if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) >= 0)
{
info->has_txpower = 1;
memcpy(&(info->txpower), &(wrq.u.txpower), sizeof(iwparam));
}
}
if((info->has_range) && (info->range.we_version_compiled > 10))
{
/* Get retry limit/lifetime */
if(iw_get_ext(skfd, ifname, SIOCGIWRETRY, &wrq) >= 0)
{
info->has_retry = 1;
memcpy(&(info->retry), &(wrq.u.retry), sizeof(iwparam));
}
}
/* Get stats */
if(iw_get_stats(skfd, ifname, &(info->stats),
&info->range, info->has_range) >= 0)
{
info->has_stats = 1;
}
#ifdef DISPLAY_WPA
/* Note : currently disabled to not bloat iwconfig output. Also,
* if does not make total sense to display parameters that we
* don't allow (yet) to configure.
* For now, use iwlist instead... Jean II */
/* Get WPA/802.1x/802.11i security parameters */
if((info->has_range) && (info->range.we_version_compiled > 17))
{
wrq.u.param.flags = IW_AUTH_KEY_MGMT;
if(iw_get_ext(skfd, ifname, SIOCGIWAUTH, &wrq) >= 0)
{
info->has_auth_key_mgmt = 1;
info->auth_key_mgmt = wrq.u.param.value;
}
wrq.u.param.flags = IW_AUTH_CIPHER_PAIRWISE;
if(iw_get_ext(skfd, ifname, SIOCGIWAUTH, &wrq) >= 0)
{
info->has_auth_cipher_pairwise = 1;
info->auth_cipher_pairwise = wrq.u.param.value;
}
wrq.u.param.flags = IW_AUTH_CIPHER_GROUP;
if(iw_get_ext(skfd, ifname, SIOCGIWAUTH, &wrq) >= 0)
{
info->has_auth_cipher_group = 1;
info->auth_cipher_group = wrq.u.param.value;
}
}
#endif
return(0);
}
/*------------------------------------------------------------------*/
/*
* Print on the screen in a neat fashion all the info we have collected
* on a device.
*/
static void
display_info(struct wireless_info * info,
char * ifname)
{
char buffer[128]; /* Temporary buffer */
/* One token is more of less 5 characters, 14 tokens per line */
int tokens = 3; /* For name */
/* Display device name and wireless name (name of the protocol used) */
printf("%-8.16s %s ", ifname, info->b.name);
/* Display ESSID (extended network), if any */
if(info->b.has_essid)
{
if(info->b.essid_on)
{
/* Does it have an ESSID index ? */
if((info->b.essid_on & IW_ENCODE_INDEX) > 1)
printf("ESSID:\"%s\" [%d] ", info->b.essid,
(info->b.essid_on & IW_ENCODE_INDEX));
else
printf("ESSID:\"%s\" ", info->b.essid);
}
else
printf("ESSID:off/any ");
}
/* Display NickName (station name), if any */
if(info->has_nickname)
printf("Nickname:\"%s\"", info->nickname);
/* Formatting */
if(info->b.has_essid || info->has_nickname)
{
printf("\n ");
tokens = 0;
}
/* Display Network ID */
if(info->b.has_nwid)
{
/* Note : should display proper number of digits according to info
* in range structure */
if(info->b.nwid.disabled)
printf("NWID:off/any ");
else
printf("NWID:%X ", info->b.nwid.value);
tokens +=2;
}
/* Display the current mode of operation */
if(info->b.has_mode)
{
printf("Mode:%s ", iw_operation_mode[info->b.mode]);
tokens +=3;
}
/* Display frequency / channel */
if(info->b.has_freq)
{
double freq = info->b.freq; /* Frequency/channel */
int channel = -1; /* Converted to channel */
/* Some drivers insist of returning channel instead of frequency.
* This fixes them up. Note that, driver should still return
* frequency, because other tools depend on it. */
if(info->has_range && (freq < KILO))
channel = iw_channel_to_freq((int) freq, &freq, &info->range);
/* Display */
iw_print_freq(buffer, sizeof(buffer), freq, -1, info->b.freq_flags);
printf("%s ", buffer);
tokens +=4;
}
/* Display the address of the current Access Point */
if(info->has_ap_addr)
{
/* A bit of clever formatting */
if(tokens > 8)
{
printf("\n ");
tokens = 0;
}
tokens +=6;
/* Oups ! No Access Point in Ad-Hoc mode */
if((info->b.has_mode) && (info->b.mode == IW_MODE_ADHOC))
printf("Cell:");
else
printf("Access Point:");
printf(" %s ", iw_sawap_ntop(&info->ap_addr, buffer));
}
/* Display the currently used/set bit-rate */
if(info->has_bitrate)
{
/* A bit of clever formatting */
if(tokens > 11)
{
printf("\n ");
tokens = 0;
}
tokens +=3;
/* Display it */
iw_print_bitrate(buffer, sizeof(buffer), info->bitrate.value);
printf("Bit Rate%c%s ", (info->bitrate.fixed ? '=' : ':'), buffer);
}
/* Display the Transmit Power */
if(info->has_txpower)
{
/* A bit of clever formatting */
if(tokens > 11)
{
printf("\n ");
tokens = 0;
}
tokens +=3;
/* Display it */
iw_print_txpower(buffer, sizeof(buffer), &info->txpower);
printf("Tx-Power%c%s ", (info->txpower.fixed ? '=' : ':'), buffer);
}
/* Display sensitivity */
if(info->has_sens)
{
/* A bit of clever formatting */
if(tokens > 10)
{
printf("\n ");
tokens = 0;
}
tokens +=4;
/* Fixed ? */
if(info->sens.fixed)
printf("Sensitivity=");
else
printf("Sensitivity:");
if(info->has_range)
/* Display in dBm ? */
if(info->sens.value < 0)
printf("%d dBm ", info->sens.value);
else
printf("%d/%d ", info->sens.value, info->range.sensitivity);
else
printf("%d ", info->sens.value);
}
printf("\n ");
tokens = 0;
/* Display retry limit/lifetime information */
if(info->has_retry)
{
printf("Retry");
/* Disabled ? */
if(info->retry.disabled)
printf(":off");
else
{
/* Let's check the value and its type */
if(info->retry.flags & IW_RETRY_TYPE)
{
iw_print_retry_value(buffer, sizeof(buffer),
info->retry.value, info->retry.flags);
printf("%s", buffer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -