static const char * get_power_management(void *arg) { static xsg_string_t *string = NULL; wrq.u.power.flags = 0; if (iw_get_ext(skfd, arg, SIOCGIWPOWER, &wrq) < 0) { xsg_debug("get_power_management: UNKNOWN"); return NULL; } if (wrq.u.power.disabled) { xsg_debug("get_power_management: \"off\""); return "off"; } if (string == NULL) { string = xsg_string_new(NULL); } if (wrq.u.power.flags & IW_POWER_TYPE) { if (iw_get_range_info(skfd, arg, &range) >= 0) { iw_print_pm_value(buffer, sizeof(buffer), wrq.u.power.value, wrq.u.power.flags, range.we_version_compiled); xsg_string_append_len(string, buffer, -1); } } iw_print_pm_mode(buffer, sizeof(buffer), wrq.u.power.flags); xsg_string_append_len(string, buffer, -1); if (wrq.u.power.flags == IW_POWER_ON) { xsg_string_append_len(string, "on", -1); } if (string->str[0] == ' ') { xsg_debug("get_power_management: \"%s\"", string->str + 1); return string->str + 1; } else { xsg_debug("get_power_management: \"%s\"", string->str); return string->str; } }
/* * 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 "); } #ifndef WE_ESSENTIAL /* Display NickName (station name), if any */ if(info->has_nickname) printf("Nickname:\"%s\"", info->nickname); #endif /* WE_ESSENTIAL */ /* Formatting */ if(info->b.has_essid || info->has_nickname) { printf("\n "); tokens = 0; } #ifndef WE_ESSENTIAL /* 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; } #endif /* WE_ESSENTIAL */ /* 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); } #ifndef WE_ESSENTIAL /* 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 ? */ printf("Sensitivity%c", info->sens.fixed ? '=' : ':'); 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); } #endif /* WE_ESSENTIAL */ printf("\n "); tokens = 0; #ifndef WE_ESSENTIAL /* 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, info->range.we_version_compiled); printf("%s", buffer); } /* Let's check if nothing (simply on) */ if(info->retry.flags == IW_RETRY_ON) printf(":on"); } printf(" "); tokens += 5; /* Between 3 and 5, depend on flags */ } /* Display the RTS threshold */ if(info->has_rts) { /* Disabled ? */ if(info->rts.disabled) printf("RTS thr:off "); else { /* Fixed ? */ printf("RTS thr%c%d B ", info->rts.fixed ? '=' : ':', info->rts.value); } tokens += 3; } /* Display the fragmentation threshold */ if(info->has_frag) { /* A bit of clever formatting */ if(tokens > 10) { printf("\n "); tokens = 0; } tokens +=4; /* Disabled ? */ if(info->frag.disabled) printf("Fragment thr:off"); else { /* Fixed ? */ printf("Fragment thr%c%d B ", info->frag.fixed ? '=' : ':', info->frag.value); } } /* Formating */ if(tokens > 0) printf("\n "); #endif /* WE_ESSENTIAL */ /* Display encryption information */ /* Note : we display only the "current" key, use iwlist to list all keys */ if(info->b.has_key) { printf("Encryption key:"); if((info->b.key_flags & IW_ENCODE_DISABLED) || (info->b.key_size == 0)) printf("off"); else { /* Display the key */ iw_print_key(buffer, sizeof(buffer), info->b.key, info->b.key_size, info->b.key_flags); printf("%s", buffer); /* Other info... */ if((info->b.key_flags & IW_ENCODE_INDEX) > 1) printf(" [%d]", info->b.key_flags & IW_ENCODE_INDEX); if(info->b.key_flags & IW_ENCODE_RESTRICTED) printf(" Security mode:restricted"); if(info->b.key_flags & IW_ENCODE_OPEN) printf(" Security mode:open"); } printf("\n "); } /* Display Power Management information */ /* Note : we display only one parameter, period or timeout. If a device * (such as HiperLan) has both, the user need to use iwlist... */ if(info->has_power) /* I hope the device has power ;-) */ { printf("Power Management"); /* Disabled ? */ if(info->power.disabled) printf(":off"); else { /* Let's check the value and its type */ if(info->power.flags & IW_POWER_TYPE) { iw_print_pm_value(buffer, sizeof(buffer), info->power.value, info->power.flags, info->range.we_version_compiled); printf("%s ", buffer); } /* Let's check the mode */ iw_print_pm_mode(buffer, sizeof(buffer), info->power.flags); printf("%s", buffer); /* Let's check if nothing (simply on) */ if(info->power.flags == IW_POWER_ON) printf(":on"); } printf("\n "); } /* Display statistics */ if(info->has_stats) { iw_print_stats(buffer, sizeof(buffer), &info->stats.qual, &info->range, info->has_range); printf("Link %s\n", buffer); if(info->range.we_version_compiled > 11) printf(" Rx invalid nwid:%d Rx invalid crypt:%d Rx invalid frag:%d\n Tx excessive retries:%d Invalid misc:%d Missed beacon:%d\n", info->stats.discard.nwid, info->stats.discard.code, info->stats.discard.fragment, info->stats.discard.retries, info->stats.discard.misc, info->stats.miss.beacon); else printf(" Rx invalid nwid:%d invalid crypt:%d invalid misc:%d\n", info->stats.discard.nwid, info->stats.discard.code, info->stats.discard.misc); } printf("\n"); }
/* * 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.8s %s ", ifname, info->name); /* Display ESSID (extended network), if any */ if(info->has_essid) { if(info->essid_on) { /* Does it have an ESSID index ? */ if((info->essid_on & IW_ENCODE_INDEX) > 1) printf("ESSID:\"%s\" [%d] ", info->essid, (info->essid_on & IW_ENCODE_INDEX)); else printf("ESSID:\"%s\" ", info->essid); } else printf("ESSID:off/any "); } /* Display NickName (station name), if any */ if(info->has_nickname) printf("Nickname:\"%s\"", info->nickname); /* Formatting */ if(info->has_essid || info->has_nickname) { printf("\n "); tokens = 0; } /* Display Network ID */ if(info->has_nwid) { /* Note : should display proper number of digit according to info * in range structure */ if(info->nwid.disabled) printf("NWID:off/any "); else printf("NWID:%X ", info->nwid.value); tokens +=2; } /* Display the current mode of operation */ if(info->has_mode) { printf("Mode:%s ", iw_operation_mode[info->mode]); tokens +=3; } /* Display frequency / channel */ if(info->has_freq) { iw_print_freq(buffer, info->freq); 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->has_mode) && (info->mode == IW_MODE_ADHOC)) printf("Cell:"); else printf("Access Point:"); printf(" %s ", iw_pr_ether(buffer, info->ap_addr.sa_data)); } /* 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, info->bitrate.value); printf("Bit Rate%c%s ", (info->bitrate.fixed ? '=' : ':'), buffer); } #if WIRELESS_EXT > 9 /* Display the Transmit Power */ if(info->has_txpower) { /* A bit of clever formatting */ if(tokens > 11) { printf("\n "); tokens = 0; } tokens +=3; /* Disabled ? */ if(info->txpower.disabled) printf("Tx-Power:off "); else { int dbm; /* Fixed ? */ if(info->txpower.fixed) printf("Tx-Power="); else printf("Tx-Power:"); /* Convert everything to dBm */ if(info->txpower.flags & IW_TXPOW_MWATT) dbm = iw_mwatt2dbm(info->txpower.value); else dbm = info->txpower.value; /* Display */ printf("%d dBm ", dbm); } } #endif /* 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; #if WIRELESS_EXT > 10 /* 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, info->retry.value, info->retry.flags); printf("%s", buffer); } /* Let's check if nothing (simply on) */ if(info->retry.flags == IW_RETRY_ON) printf(":on"); } printf(" "); tokens += 5; /* Between 3 and 5, depend on flags */ } #endif /* WIRELESS_EXT > 10 */ /* Display the RTS threshold */ if(info->has_rts) { /* Disabled ? */ if(info->rts.disabled) printf("RTS thr:off "); else { /* Fixed ? */ if(info->rts.fixed) printf("RTS thr="); else printf("RTS thr:"); printf("%d B ", info->rts.value); } tokens += 3; } /* Display the fragmentation threshold */ if(info->has_frag) { /* A bit of clever formatting */ if(tokens > 10) { printf("\n "); tokens = 0; } tokens +=4; /* Disabled ? */ if(info->frag.disabled) printf("Fragment thr:off"); else { /* Fixed ? */ if(info->frag.fixed) printf("Fragment thr="); else printf("Fragment thr:"); printf("%d B ", info->frag.value); } } /* Formating */ if(tokens > 0) printf("\n "); /* Display encryption information */ /* Note : we display only the "current" key, use iwlist to list all keys */ if(info->has_key) { printf("Encryption key:"); if((info->key_flags & IW_ENCODE_DISABLED) || (info->key_size == 0)) printf("off\n "); else { /* Display the key */ iw_print_key(buffer, info->key, info->key_size, info->key_flags); printf("%s", buffer); /* Other info... */ if((info->key_flags & IW_ENCODE_INDEX) > 1) printf(" [%d]", info->key_flags & IW_ENCODE_INDEX); if(info->key_flags & IW_ENCODE_RESTRICTED) printf(" Security mode:restricted"); if(info->key_flags & IW_ENCODE_OPEN) printf(" Security mode:open"); printf("\n "); } } /* Display Power Management information */ /* Note : we display only one parameter, period or timeout. If a device * (such as HiperLan) has both, the user need to use iwlist... */ if(info->has_power) /* I hope the device has power ;-) */ { printf("Power Management"); /* Disabled ? */ if(info->power.disabled) printf(":off\n "); else { /* Let's check the value and its type */ if(info->power.flags & IW_POWER_TYPE) { iw_print_pm_value(buffer, info->power.value, info->power.flags); printf("%s ", buffer); } /* Let's check the mode */ iw_print_pm_mode(buffer, info->power.flags); printf("%s", buffer); /* Let's check if nothing (simply on) */ if(info->power.flags == IW_POWER_ON) printf(":on"); printf("\n "); } } /* Display statistics */ if(info->has_stats) { info->stats.qual.updated = 0x0; /* Not that reliable, disable */ iw_print_stats(buffer, &info->stats.qual, &info->range, info->has_range); printf("Link %s\n", buffer); #if WIRELESS_EXT > 11 printf(" Rx invalid nwid:%d Rx invalid crypt:%d Rx invalid frag:%d\n Tx excessive retries:%d Invalid misc:%d Missed beacon:%d\n", info->stats.discard.nwid, info->stats.discard.code, info->stats.discard.fragment, info->stats.discard.retries, info->stats.discard.misc, info->stats.miss.beacon); #else /* WIRELESS_EXT > 11 */ printf(" Rx invalid nwid:%d invalid crypt:%d invalid misc:%d\n", info->stats.discard.nwid, info->stats.discard.code, info->stats.discard.misc); #endif /* WIRELESS_EXT > 11 */ } printf("\n"); }
/* * Print Power Management info for each device */ static int print_pm_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 < 10)) fprintf(stderr, "%-8.16s no power management information.\n\n", ifname); else { printf("%-8.16s ", ifname); /* 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 */ 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); }