static int get_channel(int skfd, char *ifname) { struct iwreq wrq; struct iw_range range; double freq; int channel; /* Get list of frequencies / channels */ if(iw_get_range_info(skfd, ifname, &range) < 0) { return -1; } else { /* 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); return channel; } else { return -2; } } return -3; }
/* * 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); }
int get_essid(char *name, int *channel) { int sockfd; char essid[16]; struct iwreq wrq; int ioc; sockfd = iw_sockets_open(); double freq; struct iw_range *range; char buffer[sizeof(iwrange) * 2]; memset(essid, '\0', sizeof(essid)); /* After IOCTL call the result will be stored in iwreq * structure. Hence prepare the structure to hold the * results. */ wrq.u.essid.pointer = (caddr_t) essid; wrq.u.essid.length = IW_ESSID_MAX_SIZE + 2; wrq.u.essid.flags = 0; ioc = get_param(sockfd, SIOCGIWESSID, ifname_config, &wrq); strcpy(name, wrq.u.essid.pointer); /* Obtain the essid pointed by the pointer */ /* Prepare the structure to get wireless range info */ bzero(buffer, sizeof(buffer)); wrq.u.data.pointer = (caddr_t) buffer; wrq.u.data.length = sizeof(buffer); wrq.u.data.flags = 0; if (get_param(sockfd, SIOCGIWRANGE, ifname_config, &wrq) < 0) { syslog(LOG_ERR, "ERROR:%s: %s\n", ifname_config, strerror(errno)); return -1; } /* Obtain the frequency the current network is operating in */ range = (struct iw_range *)buffer; ioc = get_param(sockfd, SIOCGIWFREQ, ifname_config, &wrq); if (ioc == -1) { syslog(LOG_ERR, "ERROR:%s: %s\n", ifname_config, strerror(errno)); } /* Convert the frequency into channel no */ freq = iw_freq2float(&(wrq.u.freq)); *channel = iw_freq_to_channel(freq, range); iw_sockets_close(sockfd); return 1; }
/* * Display the channel (converted from frequency) if possible */ static int print_channel(int skfd, const char * ifname, int format) { struct iwreq wrq; struct iw_range range; double freq; int channel; /* Get frequency / channel */ if(iw_get_ext(skfd, ifname, SIOCGIWFREQ, &wrq) < 0) return(-1); /* Convert to channel */ if(iw_get_range_info(skfd, ifname, &range) < 0) return(-2); freq = iw_freq2float(&(wrq.u.freq)); if(freq < KILO) channel = (int) freq; else { channel = iw_freq_to_channel(freq, &range); if(channel < 0) return(-3); } /* Print */ switch(format) { case FORMAT_SCHEME: /* Prefix with freq to avoid name space collisions */ printf("channel%d\n", channel); break; case FORMAT_RAW: printf("%d\n", channel); break; default: printf("%-8.16s Channel:%d\n", ifname, channel); break; } return(0); }
static double get_channel(void *arg) { double freq; if (iw_get_ext(skfd, arg, SIOCGIWFREQ, &wrq) < 0) { xsg_debug("get_channel: UNKNOWN"); return DNAN; } freq = iw_freq2float(&(wrq.u.freq)); if (freq >= KILO) { if (iw_get_range_info(skfd, arg, &range) >= 0) { return (double) iw_freq_to_channel(freq, &range); } } xsg_debug("get_channel: %f", freq); return freq; }
/* * Print one element from the scanning results */ static inline int print_event_token(struct iw_event * event, /* Extracted token */ struct iw_range * iw_range, /* Range info */ int has_range) { char buffer[128]; /* Temporary buffer */ char buffer2[30]; /* Temporary buffer */ char * prefix = (IW_IS_GET(event->cmd) ? "New" : "Set"); /* Now, let's decode the event */ switch(event->cmd) { /* ----- set events ----- */ /* Events that result from a "SET XXX" operation by the user */ case SIOCSIWNWID: if(event->u.nwid.disabled) printf("Set NWID:off/any\n"); else printf("Set NWID:%X\n", event->u.nwid.value); break; case SIOCSIWFREQ: case SIOCGIWFREQ: { double freq; /* Frequency/channel */ int channel = -1; /* Converted to channel */ freq = iw_freq2float(&(event->u.freq)); if(has_range) { if(freq < KILO) /* Convert channel to frequency if possible */ channel = iw_channel_to_freq((int) freq, &freq, iw_range); else /* Convert frequency to channel if possible */ channel = iw_freq_to_channel(freq, iw_range); } iw_print_freq(buffer, sizeof(buffer), freq, channel, event->u.freq.flags); printf("%s %s\n", prefix, buffer); } break; case SIOCSIWMODE: printf("Set Mode:%s\n", iw_operation_mode[event->u.mode]); break; case SIOCSIWESSID: case SIOCGIWESSID: { char essid[IW_ESSID_MAX_SIZE+1]; memset(essid, '\0', sizeof(essid)); if((event->u.essid.pointer) && (event->u.essid.length)) memcpy(essid, event->u.essid.pointer, event->u.essid.length); if(event->u.essid.flags) { /* Does it have an ESSID index ? */ if((event->u.essid.flags & IW_ENCODE_INDEX) > 1) printf("%s ESSID:\"%s\" [%d]\n", prefix, essid, (event->u.essid.flags & IW_ENCODE_INDEX)); else printf("%s ESSID:\"%s\"\n", prefix, essid); } else printf("%s ESSID:off/any\n", prefix); } break; case SIOCSIWENCODE: { unsigned char key[IW_ENCODING_TOKEN_MAX]; if(event->u.data.pointer) memcpy(key, event->u.data.pointer, event->u.data.length); else event->u.data.flags |= IW_ENCODE_NOKEY; printf("Set Encryption key:"); if(event->u.data.flags & IW_ENCODE_DISABLED) printf("off\n"); else { /* Display the key */ iw_print_key(buffer, sizeof(buffer), key, event->u.data.length, event->u.data.flags); printf("%s", buffer); /* Other info... */ if((event->u.data.flags & IW_ENCODE_INDEX) > 1) printf(" [%d]", event->u.data.flags & IW_ENCODE_INDEX); if(event->u.data.flags & IW_ENCODE_RESTRICTED) printf(" Security mode:restricted"); if(event->u.data.flags & IW_ENCODE_OPEN) printf(" Security mode:open"); printf("\n"); } } break; /* ----- driver events ----- */ /* Events generated by the driver when something important happens */ case SIOCGIWAP: printf("New Access Point/Cell address:%s\n", iw_sawap_ntop(&event->u.ap_addr, buffer)); break; case SIOCGIWSCAN: printf("Scan request completed\n"); break; case IWEVTXDROP: printf("Tx packet dropped:%s\n", iw_saether_ntop(&event->u.addr, buffer)); break; case IWEVCUSTOM: { char custom[IW_CUSTOM_MAX+1]; memset(custom, '\0', sizeof(custom)); if((event->u.data.pointer) && (event->u.data.length)) memcpy(custom, event->u.data.pointer, event->u.data.length); printf("Custom driver event:%s\n", custom); } break; case IWEVREGISTERED: printf("Registered node:%s\n", iw_saether_ntop(&event->u.addr, buffer)); break; case IWEVEXPIRED: printf("Expired node:%s\n", iw_saether_ntop(&event->u.addr, buffer)); break; case SIOCGIWTHRSPY: { struct iw_thrspy threshold; if((event->u.data.pointer) && (event->u.data.length)) { memcpy(&threshold, event->u.data.pointer, sizeof(struct iw_thrspy)); printf("Spy threshold crossed on address:%s\n", iw_saether_ntop(&threshold.addr, buffer)); iw_print_stats(buffer, sizeof(buffer), &threshold.qual, iw_range, has_range); printf(" Link %s\n", buffer); } else printf("Invalid Spy Threshold event\n"); } break; /* ----- driver WPA events ----- */ /* Events generated by the driver, used for WPA operation */ case IWEVMICHAELMICFAILURE: if(event->u.data.length >= sizeof(struct iw_michaelmicfailure)) { struct iw_michaelmicfailure mf; memcpy(&mf, event->u.data.pointer, sizeof(mf)); printf("Michael MIC failure flags:0x%X src_addr:%s tsc:%s\n", mf.flags, iw_saether_ntop(&mf.src_addr, buffer2), iw_hexdump(buffer, sizeof(buffer), mf.tsc, IW_ENCODE_SEQ_MAX_SIZE)); } break; case IWEVASSOCREQIE: printf("Association Request IEs:%s\n", iw_hexdump(buffer, sizeof(buffer), event->u.data.pointer, event->u.data.length)); break; case IWEVASSOCRESPIE: printf("Association Response IEs:%s\n", iw_hexdump(buffer, sizeof(buffer), event->u.data.pointer, event->u.data.length)); break; case IWEVPMKIDCAND: if(event->u.data.length >= sizeof(struct iw_pmkid_cand)) { struct iw_pmkid_cand cand; memcpy(&cand, event->u.data.pointer, sizeof(cand)); printf("PMKID candidate flags:0x%X index:%d bssid:%s\n", cand.flags, cand.index, iw_saether_ntop(&cand.bssid, buffer)); } break; /* ----- junk ----- */ /* other junk not currently in use */ case SIOCGIWRATE: iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value); printf("New Bit Rate:%s\n", buffer); break; case SIOCGIWNAME: printf("Protocol:%-1.16s\n", event->u.name); break; case IWEVQUAL: { event->u.qual.updated = 0x0; /* Not that reliable, disable */ iw_print_stats(buffer, sizeof(buffer), &event->u.qual, iw_range, has_range); printf("Link %s\n", buffer); break; } default: printf("(Unknown Wireless event 0x%04X)\n", event->cmd); } /* switch(event->cmd) */ return(0); }
/* ------------------------------------------------------------------ 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; } }
/* * Print one element from the scanning results */ static inline void print_scanning_token(struct stream_descr * stream, /* Stream of events */ struct iw_event * event, /* Extracted token */ struct iwscan_state * state, struct iw_range * iw_range, /* Range info */ int has_range) { char buffer[128]; /* Temporary buffer */ /* Now, let's decode the event */ switch(event->cmd) { case SIOCGIWAP: printf(" Cell %02d - Address: %s\n", state->ap_num, iw_saether_ntop(&event->u.ap_addr, buffer)); state->ap_num++; break; case SIOCGIWNWID: if(event->u.nwid.disabled) printf(" NWID:off/any\n"); else printf(" NWID:%X\n", event->u.nwid.value); break; case SIOCGIWFREQ: { double freq; /* Frequency/channel */ int channel = -1; /* Converted to channel */ freq = iw_freq2float(&(event->u.freq)); /* Convert to channel if possible */ if(has_range) channel = iw_freq_to_channel(freq, iw_range); iw_print_freq(buffer, sizeof(buffer), freq, channel, event->u.freq.flags); printf(" %s\n", buffer); } break; case SIOCGIWMODE: printf(" Mode:%s\n", iw_operation_mode[event->u.mode]); break; case SIOCGIWNAME: printf(" Protocol:%-1.16s\n", event->u.name); break; case SIOCGIWESSID: { char essid[IW_ESSID_MAX_SIZE+1]; memset(essid, '\0', sizeof(essid)); if((event->u.essid.pointer) && (event->u.essid.length)) memcpy(essid, event->u.essid.pointer, event->u.essid.length); if(event->u.essid.flags) { /* Does it have an ESSID index ? */ if((event->u.essid.flags & IW_ENCODE_INDEX) > 1) printf(" ESSID:\"%s\" [%d]\n", essid, (event->u.essid.flags & IW_ENCODE_INDEX)); else printf(" ESSID:\"%s\"\n", essid); } else printf(" ESSID:off/any/hidden\n"); } break; case SIOCGIWENCODE: { unsigned char key[IW_ENCODING_TOKEN_MAX]; if(event->u.data.pointer) memcpy(key, event->u.data.pointer, event->u.data.length); else event->u.data.flags |= IW_ENCODE_NOKEY; printf(" Encryption key:"); if(event->u.data.flags & IW_ENCODE_DISABLED) printf("off\n"); else { /* Display the key */ iw_print_key(buffer, sizeof(buffer), key, event->u.data.length, event->u.data.flags); printf("%s", buffer); /* Other info... */ if((event->u.data.flags & IW_ENCODE_INDEX) > 1) printf(" [%d]", event->u.data.flags & IW_ENCODE_INDEX); if(event->u.data.flags & IW_ENCODE_RESTRICTED) printf(" Security mode:restricted"); if(event->u.data.flags & IW_ENCODE_OPEN) printf(" Security mode:open"); printf("\n"); } } break; case SIOCGIWRATE: if(state->val_index == 0) printf(" Bit Rates:"); else if((state->val_index % 5) == 0) printf("\n "); else printf("; "); iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value); printf("%s", buffer); /* Check for termination */ if(stream->value == NULL) { printf("\n"); state->val_index = 0; } else state->val_index++; break; case IWEVQUAL: { iw_print_stats(buffer, sizeof(buffer), &event->u.qual, iw_range, has_range); printf(" %s\n", buffer); break; } case IWEVGENIE: /* Informations Elements are complex, let's do only some of them */ iw_print_gen_ie(event->u.data.pointer, event->u.data.length); break; case IWEVCUSTOM: { char custom[IW_CUSTOM_MAX+1]; if((event->u.data.pointer) && (event->u.data.length)) memcpy(custom, event->u.data.pointer, event->u.data.length); custom[event->u.data.length] = '\0'; printf(" Extra:%s\n", custom); } break; default: printf(" (Unknown Wireless Token 0x%04X)\n", event->cmd); } /* switch(event->cmd) */ }