diff options
Diffstat (limited to 'src/iwapi.c')
-rw-r--r-- | src/iwapi.c | 22 |
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) ⦥ + 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; |