summaryrefslogtreecommitdiffstats
path: root/src/iwapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/iwapi.c')
-rw-r--r--src/iwapi.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/iwapi.c b/src/iwapi.c
index 3202f9e..f5338f6 100644
--- a/src/iwapi.c
+++ b/src/iwapi.c
@@ -314,6 +314,7 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
struct hw_addr hw;
struct iwreq req;
struct iw_statistics q;
+ static struct iw_range range;
int m;
assert(i);
@@ -342,7 +343,22 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
return -1;
}
- if (q.qual.qual <= 0)
+ memset(&req, 0, sizeof(req));
+ strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ);
+
+ memset(&range, 0, sizeof(struct iw_range));
+ req.u.data.pointer = (caddr_t) &range;
+ req.u.data.length = sizeof(struct iw_range);
+ req.u.data.flags = 0;
+
+ if (ioctl(i->fd, SIOCGIWRANGE, &req) < 0) {
+ fprintf(stderr, "SIOCGIWRANGE failed: %s\n", strerror(errno));
+ return -1;
+ }
+
+ /* Test if both qual and level are on their lowest level */
+ if (q.qual.qual <= 0 &&
+ (q.qual.level > range.max_qual.level ? q.qual.level <= 156 : q.qual.level <= 0))
return 0;
if (ap) {
@@ -352,9 +368,9 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
if (iw_get_essid(i, ap->essid) < 0)
return -1;
-
+
if (iw_get_freq(i, &ap->freq) < 0)
- return -1;
+ memset(&ap->freq, 0, sizeof(ap->freq)); /* hostap 0.1.2 fails to report the freq sometimes */
}
return 1;