X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=contrib%2Fpackage%2Fiwinfo%2Fsrc%2Fiwinfo_nl80211.c;h=4868db10e68821d6bad7f3ddaaf83e070c8e4e6a;hp=b5ab5ba07045556cf41dcc0f2c8c1f903ea0f303;hb=c956319f01be752621673e5e190efe84d572039e;hpb=eecec8b0f2a2cd86827115c1479de974ece00850 diff --git a/contrib/package/iwinfo/src/iwinfo_nl80211.c b/contrib/package/iwinfo/src/iwinfo_nl80211.c index b5ab5ba07..4868db10e 100644 --- a/contrib/package/iwinfo/src/iwinfo_nl80211.c +++ b/contrib/package/iwinfo/src/iwinfo_nl80211.c @@ -400,16 +400,35 @@ out: return rv; } +static inline int nl80211_readint(const char *path) +{ + int fd; + int rv = -1; + char buffer[16]; + + if( (fd = open(path, O_RDONLY)) > -1 ) + { + if( read(fd, buffer, sizeof(buffer)) > 0 ) + rv = atoi(buffer); + + close(fd); + } + + return rv; +} + static char * nl80211_phy2ifname(const char *ifname) { - int fd, phyidx = -1; + int fd, ifidx = -1, cifidx = -1, phyidx = -1; char buffer[64]; static char nif[IFNAMSIZ] = { 0 }; DIR *d; struct dirent *e; - if( !strncmp(ifname, "phy", 3) ) + if( !ifname ) + return NULL; + else if( !strncmp(ifname, "phy", 3) ) phyidx = atoi(&ifname[3]); else if( !strncmp(ifname, "radio", 5) ) phyidx = atoi(&ifname[5]); @@ -423,19 +442,18 @@ static char * nl80211_phy2ifname(const char *ifname) snprintf(buffer, sizeof(buffer), "/sys/class/net/%s/phy80211/index", e->d_name); - if( (fd = open(buffer, O_RDONLY)) > 0 ) + if( nl80211_readint(buffer) == phyidx ) { - if( (read(fd, buffer, sizeof(buffer)) > 0) && - (atoi(buffer) == phyidx) ) + snprintf(buffer, sizeof(buffer), + "/sys/class/net/%s/ifindex", e->d_name); + + if( (cifidx = nl80211_readint(buffer)) >= 0 && + ((ifidx < 0) || (cifidx < ifidx)) ) { + ifidx = cifidx; strncpy(nif, e->d_name, sizeof(nif)); } - - close(fd); } - - if( nif[0] ) - break; } closedir(d); @@ -586,12 +604,28 @@ int nl80211_get_bssid(const char *ifname, char *buf) int nl80211_get_channel(const char *ifname, int *buf) { - return wext_get_channel(ifname, buf); + char *first; + + if( !wext_get_channel(ifname, buf) ) + return 0; + + else if( (first = nl80211_phy2ifname(nl80211_ifname2phy(ifname))) != NULL ) + return wext_get_channel(first, buf); + + return -1; } int nl80211_get_frequency(const char *ifname, int *buf) { - return wext_get_frequency(ifname, buf); + char *first; + + if( !wext_get_frequency(ifname, buf) ) + return 0; + + else if( (first = nl80211_phy2ifname(nl80211_ifname2phy(ifname))) != NULL ) + return wext_get_frequency(first, buf); + + return -1; } int nl80211_get_txpower(const char *ifname, int *buf) @@ -720,10 +754,11 @@ int nl80211_get_signal(const char *ifname, int *buf) return -1; } -int nl80211_get_noise(const char *ifname, int *buf) +static int nl80211_get_noise_cb(struct nl_msg *msg, void *arg) { - int rv = -1; - struct nl80211_msg_conveyor *req, *res; + int8_t *noise = arg; + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct nlattr *tb[NL80211_ATTR_MAX + 1]; struct nlattr *si[NL80211_SURVEY_INFO_MAX + 1]; static struct nla_policy sp[NL80211_SURVEY_INFO_MAX + 1] = { @@ -731,28 +766,48 @@ int nl80211_get_noise(const char *ifname, int *buf) [NL80211_SURVEY_INFO_NOISE] = { .type = NLA_U8 }, }; + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + if (!tb[NL80211_ATTR_SURVEY_INFO]) + return NL_SKIP; + + if (nla_parse_nested(si, NL80211_SURVEY_INFO_MAX, + tb[NL80211_ATTR_SURVEY_INFO], sp)) + return NL_SKIP; + + if (!si[NL80211_SURVEY_INFO_NOISE]) + return NL_SKIP; + + if (!*noise || si[NL80211_SURVEY_INFO_IN_USE]) + *noise = (int8_t)nla_get_u8(si[NL80211_SURVEY_INFO_NOISE]); + + return NL_SKIP; +} + + +int nl80211_get_noise(const char *ifname, int *buf) +{ + int8_t noise; + struct nl80211_msg_conveyor *req; + req = nl80211_msg(ifname, NL80211_CMD_GET_SURVEY, NLM_F_DUMP); - if( req ) + if (req) { - res = nl80211_send(req); - if( res ) + noise = 0; + + nl80211_cb(req, nl80211_get_noise_cb, &noise); + nl80211_send(req); + nl80211_free(req); + + if (noise) { - if( res->attr[NL80211_ATTR_SURVEY_INFO] ) - { - if( !nla_parse_nested(si, NL80211_SURVEY_INFO_MAX, - res->attr[NL80211_ATTR_SURVEY_INFO], sp) && - si[NL80211_SURVEY_INFO_NOISE] ) - { - *buf = (int8_t)nla_get_u8(si[NL80211_SURVEY_INFO_NOISE]); - rv = 0; - } - } - nl80211_free(res); + *buf = noise; + return 0; } - nl80211_free(req); } - return rv; + return -1; } int nl80211_get_quality(const char *ifname, int *buf) @@ -810,10 +865,34 @@ int nl80211_get_encryption(const char *ifname, char *buf) /* Hostapd */ if( (res = nl80211_hostapd_info(ifname)) ) { - if( (val = nl80211_getval(ifname, res, "auth_algs")) && (val > 0) ) - { + if( (val = nl80211_getval(ifname, res, "wpa")) != NULL ) + c->wpa_version = atoi(val); + + val = nl80211_getval(ifname, res, "wpa_key_mgmt"); + + if( !val || strstr(val, "PSK") ) + c->auth_suites |= IWINFO_KMGMT_PSK; + + if( val && strstr(val, "EAP") ) + c->auth_suites |= IWINFO_KMGMT_8021x; + + if( val && strstr(val, "NONE") ) c->auth_suites |= IWINFO_KMGMT_NONE; + if( (val = nl80211_getval(ifname, res, "wpa_pairwise")) != NULL ) + { + if( strstr(val, "TKIP") ) + c->pair_ciphers |= IWINFO_CIPHER_TKIP; + + if( strstr(val, "CCMP") ) + c->pair_ciphers |= IWINFO_CIPHER_CCMP; + + if( strstr(val, "NONE") ) + c->pair_ciphers |= IWINFO_CIPHER_NONE; + } + + if( (val = nl80211_getval(ifname, res, "auth_algs")) != NULL ) + { switch(atoi(val)) { case 1: c->auth_algs |= IWINFO_AUTH_OPEN; @@ -845,42 +924,8 @@ int nl80211_get_encryption(const char *ifname, char *buf) c->pair_ciphers |= IWINFO_CIPHER_WEP104; } } - - c->group_ciphers = c->pair_ciphers; - - return 0; - } - - - if( (val = nl80211_getval(ifname, res, "wpa")) != NULL ) - c->wpa_version = atoi(val); - - - val = nl80211_getval(ifname, res, "wpa_key_mgmt"); - - if( !val || strstr(val, "PSK") ) - c->auth_suites |= IWINFO_KMGMT_PSK; - - if( val && strstr(val, "EAP") ) - c->auth_suites |= IWINFO_KMGMT_8021x; - - if( val && strstr(val, "NONE") ) - c->auth_suites |= IWINFO_KMGMT_NONE; - - - if( (val = nl80211_getval(ifname, res, "wpa_pairwise")) != NULL ) - { - if( strstr(val, "TKIP") ) - c->pair_ciphers |= IWINFO_CIPHER_TKIP; - - if( strstr(val, "CCMP") ) - c->pair_ciphers |= IWINFO_CIPHER_CCMP; - - if( strstr(val, "NONE") ) - c->pair_ciphers |= IWINFO_CIPHER_NONE; } - c->group_ciphers = c->pair_ciphers; c->enabled = (c->auth_algs || c->auth_suites) ? 1 : 0; @@ -1128,11 +1173,7 @@ int nl80211_get_txpwrlist(const char *ifname, char *buf, int *len) static void nl80211_get_scancrypto(const char *spec, struct iwinfo_crypto_entry *c) { - if( strstr(spec, "OPEN") ) - { - c->enabled = 0; - } - else + if( strstr(spec, "WPA") || strstr(spec, "WEP") ) { c->enabled = 1; @@ -1173,6 +1214,10 @@ static void nl80211_get_scancrypto(const char *spec, c->group_ciphers = c->pair_ciphers; } + else + { + c->enabled = 0; + } } int nl80211_get_scanlist(const char *ifname, char *buf, int *len)