summaryrefslogtreecommitdiffstats
path: root/src/iwapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/iwapi.c')
-rw-r--r--src/iwapi.c76
1 files changed, 42 insertions, 34 deletions
diff --git a/src/iwapi.c b/src/iwapi.c
index f5338f6..5d8afe8 100644
--- a/src/iwapi.c
+++ b/src/iwapi.c
@@ -44,7 +44,7 @@ int iw_set_essid(struct interface *i, const char* essid) {
}
if (ioctl(i->fd, SIOCSIWESSID, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCSIWESSID): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCSIWESSID): %s", strerror(errno));
return -1;
}
@@ -60,28 +60,28 @@ int iw_set_mode(struct interface *i, int m) {
req.u.mode = m;
if (ioctl(i->fd, SIOCSIWMODE, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCSIWMODE): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCSIWMODE): %s", strerror(errno));
return -1;
}
return 0;
}
-int iw_set_freq(struct interface *i, const struct iw_freq *f) {
- struct iwreq req;
- assert(i && f);
+/* int iw_set_freq(struct interface *i, const struct iw_freq *f) { */
+/* struct iwreq req; */
+/* assert(i && f); */
- memset(&req, 0, sizeof(req));
- strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ);
- req.u.freq = *f;
+/* memset(&req, 0, sizeof(req)); */
+/* strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); */
+/* req.u.freq = *f; */
- if (ioctl(i->fd, SIOCSIWFREQ, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCSIWFREQ): %s\n", strerror(errno));
- return -1;
- }
+/* if (ioctl(i->fd, SIOCSIWFREQ, &req) < 0) { */
+/* daemon_log(LOG_ERR, "ioctl(SIOCSIWFREQ): %s", strerror(errno)); */
+/* return -1; */
+/* } */
- return 0;
-}
+/* return 0; */
+/* } */
int iw_set_ap(struct interface *i, const struct hw_addr *ap) {
struct iwreq req;
@@ -94,7 +94,7 @@ int iw_set_ap(struct interface *i, const struct hw_addr *ap) {
memcpy(req.u.ap_addr.sa_data, ap->addr, ETH_ALEN);
if (ioctl(i->fd, SIOCSIWAP, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCSIWAP): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCSIWAP): %s", strerror(errno));
return -1;
}
@@ -105,6 +105,12 @@ int iw_scan(struct interface *i) {
struct iwreq req;
assert(i);
+ daemon_log(LOG_INFO, "Scanning...");
+
+ iw_set_mode(i, IW_MODE_INFRA);
+ iw_set_essid(i, NULL);
+ /* Due to driver issues, the return codes of these function calls are no longer evaluated */
+
memset(&req, 0, sizeof(req));
strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ);
@@ -112,7 +118,7 @@ int iw_scan(struct interface *i) {
req.u.param.value = 0;
if (ioctl(i->fd, SIOCSIWSCAN, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCSIWSCAN): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCSIWSCAN): %s", strerror(errno));
return -1;
}
@@ -140,7 +146,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
if (errno == EAGAIN)
return 1;
- daemon_log(LOG_ERR, "ioctl(SIOCGIWSCAN): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCGIWSCAN): %s", strerror(errno));
return -1;
}
@@ -148,9 +154,11 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
l = req.u.data.length;
f = 0;
hs = sizeof(struct iw_event)-sizeof(union iwreq_data);
+
while (l >= sizeof(struct iw_event)) {
+
if (e->len < hs) {
- daemon_log(LOG_ERR, "Recieved bogus wireless event\n");
+ daemon_log(LOG_ERR, "Recieved bogus wireless event");
return -1;
}
@@ -162,9 +170,9 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
case SIOCGIWAP:
f = 1;
-
+
if (e->len < hs + sizeof(struct sockaddr)) {
- daemon_log(LOG_ERR, "Corrupt scan result (1)\n");
+ daemon_log(LOG_ERR, "Corrupt scan result (1)");
return -1;
}
@@ -175,7 +183,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
case SIOCGIWESSID:
if (e->len < hs + sizeof(struct iw_point)) {
- daemon_log(LOG_ERR, "Corrupt scan result (2)\n");
+ daemon_log(LOG_ERR, "Corrupt scan result (2)");
return -1;
}
@@ -189,7 +197,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
case SIOCGIWMODE:
if (e->len < hs + sizeof(__u32)) {
- daemon_log(LOG_ERR, "Corrupt scan result (3)\n");
+ daemon_log(LOG_ERR, "Corrupt scan result (3)");
return -1;
}
@@ -203,7 +211,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) {
case SIOCGIWFREQ:
if (e->len < hs + sizeof(struct iw_freq)) {
- daemon_log(LOG_ERR, "Corrupt scan result (4)\n");
+ daemon_log(LOG_ERR, "Corrupt scan result (4)");
return -1;
}
@@ -233,7 +241,7 @@ int iw_tune(struct interface *i, struct ap_info *ap) {
/* We are not interested in the return values of these functions due to driver issues */
iw_set_mode(i, IW_MODE_INFRA);
iw_set_essid(i, ap->essid);
- iw_set_freq(i, &ap->freq);
+ //iw_set_freq(i, &ap->freq);
iw_set_ap(i, &ap->ap);
return 0;
@@ -247,7 +255,7 @@ int iw_get_ap(struct interface *i, struct hw_addr *ap) {
strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ);
if (ioctl(i->fd, SIOCGIWAP, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCGIWAP): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCGIWAP): %s", strerror(errno));
return -1;
}
@@ -269,7 +277,7 @@ int iw_get_essid(struct interface *i, char *essid) {
req.u.essid.flags = 1;
if (ioctl(i->fd, SIOCGIWESSID, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCGSIWESSID): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCGSIWESSID): %s", strerror(errno));
return -1;
}
@@ -286,7 +294,7 @@ int iw_get_mode(struct interface *i, int *m) {
req.u.mode = 0;
if (ioctl(i->fd, SIOCGIWMODE, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCGIWMODE): %s\n", strerror(errno));
+ daemon_log(LOG_ERR, "ioctl(SIOCGIWMODE): %s", strerror(errno));
return -1;
}
@@ -302,8 +310,8 @@ int iw_get_freq(struct interface *i, struct iw_freq *f) {
strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ);
if (ioctl(i->fd, SIOCGIWFREQ, &req) < 0) {
- daemon_log(LOG_ERR, "ioctl(SIOCGIWFREQ): %s\n", strerror(errno));
- return -1;
+ memset(f, 0, sizeof(struct iw_freq)); /* hostap 0.1.2 fails to report the freq sometimes */
+ return 0;
}
*f = req.u.freq;
@@ -339,7 +347,7 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
req.u.data.flags = 1;
if (ioctl(i->fd, SIOCGIWSTATS, &req) < 0) {
- daemon_log(LOG_ERR, "Failed to get interface quality\n");
+ daemon_log(LOG_ERR, "Failed to get interface quality");
return -1;
}
@@ -352,7 +360,7 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
req.u.data.flags = 0;
if (ioctl(i->fd, SIOCGIWRANGE, &req) < 0) {
- fprintf(stderr, "SIOCGIWRANGE failed: %s\n", strerror(errno));
+ fprintf(stderr, "SIOCGIWRANGE failed: %s", strerror(errno));
return -1;
}
@@ -368,9 +376,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)
- memset(&ap->freq, 0, sizeof(ap->freq)); /* hostap 0.1.2 fails to report the freq sometimes */
+ return -1;
}
return 1;
@@ -379,5 +387,5 @@ int iw_assoc(struct interface *i, struct ap_info *ap) {
int iw_ap_info_equal(const struct ap_info *a, const struct ap_info *b) {
assert(a && b);
- return !strcmp(a->essid, b->essid) && !memcmp(&a->freq, &b->freq, sizeof(a->freq));
+ return !strcmp(a->essid, b->essid) && !memcmp(&a->ap, &b->ap, sizeof(struct hw_addr));
}