int wext_get_channel(const char *ifname, int *buf) { struct iwreq wrq; struct iw_range range; double freq; int i; if(wext_ioctl(ifname, SIOCGIWFREQ, &wrq) >= 0) { if( wrq.u.freq.m >= 1000 ) { freq = wext_freq2float(&wrq.u.freq); wrq.u.data.pointer = (caddr_t) ⦥ wrq.u.data.length = sizeof(struct iw_range); wrq.u.data.flags = 0; if(wext_ioctl(ifname, SIOCGIWRANGE, &wrq) >= 0) { for(i = 0; i < range.num_frequency; i++) { if( wext_freq2float(&range.freq[i]) == freq ) { *buf = range.freq[i].i; return 0; } } } } else { *buf = wrq.u.freq.m; return 0; } } return -1; /* char cmd[256]; sprintf(cmd, "iwlist %s channel | grep 'Current Channel' | awk -F':' '{print $2}'", ifname); FILE *fp = popen(cmd, "r"); fscanf(fp, "%d\n", buf); pclose(fp); return 0; */ }
static inline int wext_freq2mhz(const struct iw_freq *in) { if( in->e == 6 ) { return in->m; } else { return (int)(wext_freq2float(in) / 1000000); } }
int wext_get_channel(const char *ifname, int *buf) { struct iwreq wrq; struct iw_range range; double freq; int i; if(wext_ioctl(ifname, SIOCGIWFREQ, &wrq) >= 0) { if( wrq.u.freq.m >= 1000 ) { freq = wext_freq2float(&wrq.u.freq); wrq.u.data.pointer = (caddr_t) ⦥ wrq.u.data.length = sizeof(struct iw_range); wrq.u.data.flags = 0; if(wext_ioctl(ifname, SIOCGIWRANGE, &wrq) >= 0) { for(i = 0; i < range.num_frequency; i++) { if( wext_freq2float(&range.freq[i]) == freq ) { *buf = range.freq[i].i; return 0; } } } } else { *buf = wrq.u.freq.m; return 0; } } return -1; }
static inline void wext_fill_entry(struct stream_descr *stream, struct iw_event *event, struct iw_range *iw_range, int has_range, struct iwinfo_scanlist_entry *e) { int i; double freq; /* Now, let's decode the event */ switch(event->cmd) { case SIOCGIWAP: memcpy(e->mac, &event->u.ap_addr.sa_data, 6); break; case SIOCGIWFREQ: if( event->u.freq.m >= 1000 ) { freq = wext_freq2float(&(event->u.freq)); for(i = 0; i < iw_range->num_frequency; i++) { if( wext_freq2float(&iw_range->freq[i]) == freq ) { e->channel = iw_range->freq[i].i; break; } } } else { e->channel = event->u.freq.m; } break; case SIOCGIWMODE: switch(event->u.mode) { case 1: e->mode = IWINFO_OPMODE_ADHOC; break; case 2: case 3: e->mode = IWINFO_OPMODE_MASTER; break; default: e->mode = IWINFO_OPMODE_UNKNOWN; break; } break; case SIOCGIWESSID: if( event->u.essid.pointer && event->u.essid.length && event->u.essid.flags ) memcpy(e->ssid, event->u.essid.pointer, event->u.essid.length); break; case SIOCGIWENCODE: e->crypto.enabled = !(event->u.data.flags & IW_ENCODE_DISABLED); break; case IWEVQUAL: e->signal = event->u.qual.level; e->quality = event->u.qual.qual; e->quality_max = iw_range->max_qual.qual; break; #if 0 case SIOCGIWRATE: if(state->val_index == 0) { lua_pushstring(L, "bitrates"); lua_newtable(L); } //iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value); snprintf(buffer, sizeof(buffer), "%d", event->u.bitrate.value); lua_pushinteger(L, state->val_index + 1); lua_pushstring(L, buffer); lua_settable(L, -3); /* Check for termination */ if(stream->value == NULL) { lua_settable(L, -3); state->val_index = 0; } else state->val_index++; break; #endif case IWEVGENIE: wext_fill_wpa(event->u.data.pointer, event->u.data.length, e); break; } }