/* * Print the number of channels and available frequency for the device */ static int print_freq_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */ { struct iwreq wrq; struct iw_range range; double freq; int k; int channel; char buffer[128]; /* Temporary buffer */ /* Avoid "Unused parameter" warning */ args = args; count = count; /* Get list of frequencies / channels */ if(iw_get_range_info(skfd, ifname, &range) < 0) fprintf(stderr, "%-8.16s no frequency information.\n\n", ifname); else { if(range.num_frequency > 0) { printf("%-8.16s %d channels in total; available frequencies :\n", ifname, range.num_channels); /* Print them all */ for(k = 0; k < range.num_frequency; k++) { freq = iw_freq2float(&(range.freq[k])); iw_print_freq_value(buffer, sizeof(buffer), freq); printf(" Channel %.2d : %s\n", range.freq[k].i, buffer); } } else printf("%-8.16s %d channels\n", ifname, range.num_channels); /* Get current frequency / channel and display it */ if(iw_get_ext(skfd, ifname, SIOCGIWFREQ, &wrq) >= 0) { freq = iw_freq2float(&(wrq.u.freq)); channel = iw_freq_to_channel(freq, &range); iw_print_freq(buffer, sizeof(buffer), freq, channel, wrq.u.freq.flags); printf(" Current %s\n\n", buffer); } } sprintf(cmd, "nvram set %s_channel=%d",ifname, channel); //printf("cmd %s\n", cmd); system(cmd); return(0); }
static const char * get_freq_string(void *arg) { double freq; freq = get_freq_number(arg); if (isnan(freq)) { xsg_debug("get_freq_string: UNKNOWN"); return NULL; } iw_print_freq_value(buffer, sizeof(buffer), freq); xsg_debug("get_freq_string: \"%s\"", buffer); return buffer; }
/* ------------------------------------------------------------------ WirelessInterface_ScanItem */ static int WirelessInterface_ScanItem(wifacesd* data, iwevent* event, iwrange* range, int has_range) { static char buf[128]; memset(data, 0, sizeof(wifacesd)); switch (event->cmd) { case SIOCGIWAP: { iw_ether_ntop((const struct ether_addr*)(event->u.ap_addr.sa_data), buf); data->keys[0] = IWSCAN_KE_BSSID; data->objs[0] = Py_BuildValue("s", buf); data->num = 1; return 1; } case SIOCGIWFREQ: { double freq = iw_freq2float(&(event->u.freq)); int channel; if (freq <= 14.0) channel = iw_channel_to_freq((int)(freq), &freq, range); else channel = iw_freq_to_channel(freq, range); iw_print_freq_value(buf, sizeof(buf), freq); data->keys[0] = IWSCAN_KE_FREQUENCY; data->keys[1] = IWSCAN_KE_CHANNEL; data->objs[0] = Py_BuildValue("s", buf); data->objs[1] = Py_BuildValue("i", channel); data->num = 2; return 0; } case SIOCGIWMODE: { data->keys[0] = IWSCAN_KE_MODE; data->objs[0] = Py_BuildValue("s", iw_operation_mode[event->u.mode]); data->num = 1; return 0; } case SIOCGIWNAME: { data->keys[0] = IWSCAN_KE_PROTOCOL; data->objs[0] = Py_BuildValue("s", event->u.name); data->num = 1; return 0; } case SIOCGIWESSID: { memcpy(buf, event->u.essid.pointer, event->u.essid.length); buf[event->u.essid.length] = 0x0; data->keys[0] = IWSCAN_KE_ESSID; data->objs[0] = Py_BuildValue("s", buf); data->num = 1; return 0; } case SIOCGIWENCODE: { PyObject* pybool; if (event->u.data.flags & IW_ENCODE_DISABLED) pybool = Py_False; else pybool = Py_True; Py_INCREF(pybool); data->keys[0] = IWSCAN_KE_ENC; data->objs[0] = pybool; data->num = 1; return 0; } case SIOCGIWRATE: { iw_print_bitrate(buf, sizeof(buf), event->u.bitrate.value); data->keys[0] = IWSCAN_KE_BITRATE; data->objs[0] = Py_BuildValue("s", buf); data->num = 1; return 0; } case IWEVQUAL: { iw_print_stats(buf, sizeof(buf), &event->u.qual, range, has_range); data->keys[0] = IWSCAN_KE_QUAL; data->keys[1] = IWSCAN_KE_STATS; data->objs[0] = Py_BuildValue("i", event->u.qual.qual); data->objs[1] = Py_BuildValue("s", buf); data->num = 2; return 0; } case IWEVGENIE: { unsigned char* buffer = event->u.data.pointer; int buflen = event->u.data.length; int offset = 0; data->keys[0] = IWSCAN_KE_IE; //PyObject* ie_list = PyList_New(0); //data->objs[0] = ie_list; while (offset <= (buflen - 2)) { //PyList_Append(ie_list, WirelessInterface_ScanIe(buffer + offset, buflen)); data->objs[0] = WirelessInterface_ScanIe(buffer + offset, buflen); offset += buffer[offset + 1] + 2; } data->num = 1; return 0; } default: return 0; } }