void enter_rfmon_mac80211(const char *device, char **mondev) { int ret; short flags; uint32_t n; char phydev_path[256]; struct nl80211_state nlstate; /* XXX: is this already a monN device? */ get_mac80211_phydev(device, phydev_path, sizeof(phydev_path)); nl80211_init(&nlstate, device); for (n = 0; n < UINT_MAX; n++) { char mondevice[32]; slprintf(mondevice, sizeof(mondevice), "mon%u", n); ret = nl80211_add_mon_if(&nlstate, device, mondevice); if (ret == 0) { *mondev = xstrdup(mondevice); flags = device_get_flags(*mondev); flags |= IFF_UP | IFF_RUNNING; device_set_flags(*mondev, flags); nl80211_cleanup(&nlstate); return; } } panic("No free monN interfaces!\n"); }
void leave_rfmon_mac80211(const char *device, const char *mondev) { short flags; struct nl80211_state nlstate; flags = device_get_flags(mondev); flags &= ~(IFF_UP | IFF_RUNNING); device_set_flags(mondev, flags); nl80211_init(&nlstate, device); nl80211_del_mon_if(&nlstate, device, mondev); nl80211_cleanup(&nlstate); }
int set_wifi_power_saving(const char *iface, int state) { struct nl80211_state nlstate; int err; err = nl80211_init(&nlstate); if (err) return 1; enable_power_save = state; err = __handle_cmd(&nlstate, iface, 0); nl80211_cleanup(&nlstate); return err; }
int get_wifi_power_saving(const char *iface) { struct nl80211_state nlstate; int err; enable_power_save = 0; err = nl80211_init(&nlstate); if (err) return 1; err = __handle_cmd(&nlstate, iface, 1); nl80211_cleanup(&nlstate); if (err) /* not a wifi interface */ return 1; return enable_power_save; }
int main(int argc, char **argv) { struct nl80211_state nlstate; int devidx = 0; char *devname; int err; unsigned int surveys = 10; /* strip off self */ argc--; argv0 = *argv++; if (argc > 0 && strcmp(*argv, "--debug") == 0) { nl_debug = 1; argc--; argv++; } if (argc > 0 && strcmp(*argv, "--version") == 0) { version(); return 0; } /* need to treat "help" command specially so it works w/o nl80211 */ if (argc == 0 || strcmp(*argv, "help") == 0) { usage(); return 0; } err = nl80211_init(&nlstate); if (err) return 1; if (argc <= 0) { return 1; } devidx = if_nametoindex(*argv); if (devidx == 0) devidx = -1; devname = *argv; argc--; argv++; if (devidx < 0) return -errno; if (!is_link_up(devname)) { err = -ENOLINK; printf("Link for %s must be up to use acs\n", devname); goto nl_cleanup; } /* * XXX: we should probably get channel list properly here * but I'm lazy. THIS IS A REQUIREMENT, given that if a device * is down and comes up we won't have any survey data to study. */ err = get_freq_list(&nlstate, devidx); if (err) return err; while (surveys--) { err = study_freqs(&nlstate, devidx); if (err) return err; } parse_freq_list(); parse_freq_int_factor(); nl_cleanup: nl80211_cleanup(&nlstate); clear_offchan_ops_list(); clean_freq_list(); return err; }