📄 iwlist.c
字号:
/* * Wireless Tools * * Jean II - HPLB '99 - HPL 99->01 * * This tool can access various piece of information on the card * not part of iwconfig... * You need to link this code against "iwcommon.c" and "-lm". * * This file is released under the GPL license. */#include "iwcommon.h" /* Header *//*********************** FREQUENCIES/CHANNELS ***********************//*------------------------------------------------------------------*//* * Print the number of channels and available frequency for the device */static voidprint_freq_info(int skfd, char * ifname){ float freq; struct iw_range range; int k; if(get_range_info(skfd, ifname, &range) < 0) fprintf(stderr, "%-8.8s no frequency information.\n\n", ifname); else { if(range.num_frequency > 0) { printf("%-8.8s %d channels in total; available frequencies :\n", ifname, range.num_channels); /* Print them all */ for(k = 0; k < range.num_frequency; k++) { printf("\t Channel %.2d : ", range.freq[k].i); freq = freq2float(&(range.freq[k])); if(freq >= GIGA) printf("%g GHz\n", freq / GIGA); else if(freq >= MEGA) printf("%g MHz\n", freq / MEGA); else printf("%g kHz\n", freq / KILO); } printf("\n\n"); } else printf("%-8.8s %d channels\n\n", ifname, range.num_channels); }}/*------------------------------------------------------------------*//* * Get frequency info on all devices and print it on the screen */static voidprint_freq_devices(int skfd){ char buff[1024]; struct ifconf ifc; struct ifreq *ifr; int i; /* Get list of active devices */ 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++) print_freq_info(skfd, ifr->ifr_name);}/************************ ACCESS POINT LIST ************************//*------------------------------------------------------------------*//* * Display the list of ap addresses and the associated stats * Exacly the same as the spy list, only with different IOCTL and messages */static voidprint_ap_info(int skfd, char * ifname){ struct iwreq wrq; char buffer[(sizeof(struct iw_quality) + sizeof(struct sockaddr)) * IW_MAX_AP]; struct sockaddr * hwa; struct iw_quality * qual; iwrange range; int has_range = 0; int has_qual = 0; int n; int i; /* Collect stats */ strncpy(wrq.ifr_name, ifname, IFNAMSIZ); wrq.u.data.pointer = (caddr_t) buffer; wrq.u.data.length = 0; wrq.u.data.flags = 0; if(ioctl(skfd, SIOCGIWAPLIST, &wrq) < 0) { fprintf(stderr, "%-8.8s Interface doesn't have a list of Access Points\n\n", ifname); return; } /* Number of addresses */ n = wrq.u.data.length; has_qual = wrq.u.data.flags; /* The two lists */ hwa = (struct sockaddr *) buffer; qual = (struct iw_quality *) (buffer + (sizeof(struct sockaddr) * n)); /* Check if we have valid address types */ if(check_addr_type(skfd, ifname) < 0) { fprintf(stderr, "%-8.8s Interface doesn't support MAC & IP addresses\n\n", ifname); return; } /* Get range info if we can */ if(get_range_info(skfd, ifname, &(range)) >= 0) has_range = 1; /* Display it */ if(n == 0) printf("%-8.8s No Access Point in range\n", ifname); else printf("%-8.8s Access Points in range:\n", ifname); for(i = 0; i < n; i++) { if(has_qual) { /* Print stats for this address */ printf(" %s : ", pr_ether(hwa[i].sa_data)); print_stats(stdout, &qual[i], &range, has_range); } else /* Only print the address */ printf(" %s\n", pr_ether(hwa[i].sa_data)); } printf("\n");}/*------------------------------------------------------------------*//* * Get list of AP on all devices and print it on the screen */static voidprint_ap_devices(int skfd){ char buff[1024]; struct ifconf ifc; struct ifreq *ifr; int i; /* Get list of active devices */ 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++) print_ap_info(skfd, ifr->ifr_name);}/***************************** BITRATES *****************************//*------------------------------------------------------------------*//* * Print the number of available bitrates for the device */static voidprint_bitrate_info(int skfd, char * ifname){ float bitrate; struct iw_range range; int k; /* Extract range info */ if(get_range_info(skfd, ifname, &range) < 0) fprintf(stderr, "%-8.8s no bit-rate information.\n\n", ifname); else { if((range.num_bitrates > 0) && (range.num_bitrates < IW_MAX_BITRATES)) { printf("%-8.8s %d available bit-rates :\n", ifname, range.num_bitrates); /* Print them all */ for(k = 0; k < range.num_bitrates; k++) { printf("\t "); bitrate = range.bitrate[k]; if(bitrate >= GIGA) printf("%g Gb/s\n", bitrate / GIGA); else if(bitrate >= MEGA) printf("%g Mb/s\n", bitrate / MEGA); else printf("%g kb/s\n", bitrate / KILO); } printf("\n\n"); } else printf("%-8.8s No bit-rates ? Please update driver...\n\n", ifname); }}/*------------------------------------------------------------------*//* * Get bit-rate info on all devices and print it on the screen */static voidprint_bitrate_devices(int skfd){ char buff[1024]; struct ifconf ifc; struct ifreq *ifr; int i; /* Get list of active devices */ 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++) print_bitrate_info(skfd, ifr->ifr_name);}/************************* ENCRYPTION KEYS *************************//*------------------------------------------------------------------*//* * Print the number of available encryption key for the device */static voidprint_keys_info(int skfd, char * ifname){ struct iwreq wrq; struct iw_range range; unsigned char key[IW_ENCODING_TOKEN_MAX]; int k; /* Extract range info */ if(get_range_info(skfd, ifname, &range) < 0) fprintf(stderr, "%-8.8s no encryption keys information.\n\n", ifname); else { printf("%-8.8s ", ifname); /* Print key sizes */ if((range.num_encoding_sizes > 0) && (range.num_encoding_sizes < IW_MAX_ENCODING_SIZES)) { printf("%d key sizes : %d", range.num_encoding_sizes, range.encoding_size[0] * 8); /* Print them all */ for(k = 1; k < range.num_encoding_sizes; k++) printf(", %d", range.encoding_size[k] * 8); printf("bits\n "); } /* Print the keys and associate mode */ printf("%d keys available :\n", range.max_encoding_tokens); for(k = 1; k <= range.max_encoding_tokens; k++) { strcpy(wrq.ifr_name, ifname); wrq.u.data.pointer = (caddr_t) key; wrq.u.data.length = 0; wrq.u.data.flags = k; if(ioctl(skfd, SIOCGIWENCODE, &wrq) < 0) { fprintf(stderr, "SIOCGIWENCODE: %s\n", strerror(errno)); break; } if((wrq.u.data.flags & IW_ENCODE_DISABLED) || (wrq.u.data.length == 0)) printf("\t\t[%d]: off\n", k); else { /* Display the key */ printf("\t\t[%d]: ", k); print_key(stdout, key, wrq.u.data.length, wrq.u.data.flags); /* Other info... */ printf(" (%d bits)", wrq.u.data.length * 8); printf("\n"); } } /* Print current key and mode */ strcpy(wrq.ifr_name, ifname); wrq.u.data.pointer = (caddr_t) key; wrq.u.data.length = 0; wrq.u.data.flags = 0; /* Set index to zero to get current */ if(ioctl(skfd, SIOCGIWENCODE, &wrq) < 0) { fprintf(stderr, "SIOCGIWENCODE: %s\n", strerror(errno)); return; } printf(" Current Transmit Key: [%d]\n", wrq.u.data.flags & IW_ENCODE_INDEX); if(wrq.u.data.flags & IW_ENCODE_RESTRICTED) printf(" Encryption mode:restricted\n"); if(wrq.u.data.flags & IW_ENCODE_OPEN) printf(" Encryption mode:open\n"); printf("\n\n"); }}/*------------------------------------------------------------------*//* * Get encryption info on all devices and print it on the screen */static voidprint_keys_devices(int skfd){ char buff[1024]; struct ifconf ifc; struct ifreq *ifr; int i; /* Get list of active devices */ 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++) print_keys_info(skfd, ifr->ifr_name);}/************************* POWER MANAGEMENT *************************//*------------------------------------------------------------------*//* * Print Power Management info for each device */static inline intget_pm_value(int skfd, char * ifname, struct iwreq * pwrq, int flags){ /* Get Another Power Management value */ strcpy(pwrq->ifr_name, ifname); pwrq->u.power.flags = flags; if(ioctl(skfd, SIOCGIWPOWER, pwrq) >= 0) { /* Let's check the value and its type */ if(pwrq->u.power.flags & IW_POWER_TYPE) { printf("\n "); print_pm_value(stdout, pwrq->u.power.value, pwrq->u.power.flags); } } return(pwrq->u.power.flags);}/*------------------------------------------------------------------*//* * Print Power Management info for each device */static voidprint_pm_info(int skfd, char * ifname){ struct iwreq wrq; struct iw_range range; /* Extract range info */ if(get_range_info(skfd, ifname, &range) < 0) fprintf(stderr, "%-8.8s no power management information.\n\n", ifname); else { printf("%-8.8s ", ifname);#if WIRELESS_EXT > 9 /* Display modes availables */ if(range.pm_capa & IW_POWER_MODE) { printf("Supported modes :\n "); if(range.pm_capa & (IW_POWER_UNICAST_R | IW_POWER_MULTICAST_R)) printf("\t\to Receive all packets (unicast & multicast)\n "); if(range.pm_capa & IW_POWER_UNICAST_R) printf("\t\to Receive Unicast only (discard multicast)\n "); 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 */ print_pm_value(stdout, range.min_pmp, flags | IW_POWER_MIN); printf("\n "); print_pm_value(stdout, range.max_pmp, flags | IW_POWER_MAX); printf("\n "); } /* 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 */ print_pm_value(stdout, range.min_pmt, flags | IW_POWER_MIN); printf("\n "); print_pm_value(stdout, range.max_pmt, flags | IW_POWER_MAX); printf("\n "); }#endif /* WIRELESS_EXT > 9 */ /* Get current Power Management settings */ strcpy(wrq.ifr_name, ifname); wrq.u.power.flags = 0; if(ioctl(skfd, 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 */ printf("Current"); print_pm_mode(stdout, flags);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -