char *getCountryList(void) { int i; #ifdef HAVE_BUFFALO char country[80]; char *region = getUEnv("region"); if (!region) { region = "_D"; } #endif if (countries == NULL) { int count = 0; for (i = 0; i < N(allCountries); i++) { #ifdef HAVE_BUFFALO sprintf(country, "%s", allCountries[i].isoName); if (isValidCountry(region, country)) { #endif count += strlen(allCountries[i].name) + 1; #ifdef HAVE_BUFFALO } #endif } count++; countries = safe_malloc(count); memset(countries, 0, count); for (i = 0; i < N(allCountries); i++) { #ifdef HAVE_BUFFALO sprintf(country, "%s", allCountries[i].isoName); if (isValidCountry(region, country)) { #endif strcat(countries, allCountries[i].name); strcat(countries, " "); #ifdef HAVE_BUFFALO } #endif } } return countries; }
static struct wifi_channels *list_channelsext(const char *ifname, int allchans) { struct ieee80211req_chaninfo chans; struct ieee80211req_chaninfo achans; const struct ieee80211_channel *c; int i; fprintf(stderr, "list channels for %s\n", ifname); if (do80211priv (ifname, IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans)) < 0) { fprintf(stderr, "unable to get channel information\n"); return NULL; } if (!allchans) { uint8_t active[64]; if (do80211priv (ifname, IEEE80211_IOCTL_GETCHANLIST, &active, sizeof(active)) < 0) { fprintf(stderr, "unable to get active channel list\n"); return NULL; } memset(&achans, 0, sizeof(achans)); for (i = 0; i < chans.ic_nchans; i++) { c = &chans.ic_chans[i]; if (isset(active, c->ic_ieee) || allchans) achans.ic_chans[achans.ic_nchans++] = *c; } } else achans = chans; struct wifi_channels *list = (struct wifi_channels *)safe_malloc(sizeof(struct wifi_channels) * (achans.ic_nchans + 1)); (void)memset(list, 0, (sizeof(struct wifi_channels)*((achans.ic_nchans + 1)))); char wl_mode[16]; char wl_turbo[16]; sprintf(wl_mode, "%s_net_mode", ifname); sprintf(wl_turbo, "%s_channelbw", ifname); int l = 0; int up = 0; char sb[32]; sprintf(sb, "%s_nctrlsb", ifname); if (nvram_match(sb, "upper")) up = 1; for (i = 0; i < achans.ic_nchans; i++) { #ifdef HAVE_BUFFALO if (achans.ic_chans[i].ic_flags & IEEE80211_CHAN_RADARFOUND) //filter channels with detected radar continue; #endif // filter out A channels if mode isnt A-Only or mixed if (IEEE80211_IS_CHAN_5GHZ(&achans.ic_chans[i])) { if (nvram_invmatch(wl_mode, "a-only") && nvram_invmatch(wl_mode, "mixed") && nvram_invmatch(wl_mode, "n5-only") && nvram_invmatch(wl_mode, "na-only")) { // fprintf(stderr,"5 Ghz %d is not compatible to a-only/mixed/na-only %X\n",achans.ic_chans[i].ic_freq,achans.ic_chans[i].ic_flags); continue; } if (nvram_match(wl_turbo, "40") && (nvram_match(wl_mode, "n5-only") || nvram_match(wl_mode, "mixed") || nvram_match(wl_mode, "na-only"))) { if (up && !IEEE80211_IS_CHAN_11NA_HT40PLUS (&achans.ic_chans[i])) continue; if (!up && !IEEE80211_IS_CHAN_11NA_HT40MINUS (&achans.ic_chans[i])) continue; } } // filter out B/G channels if mode isnt g-only, b-only or mixed if (IEEE80211_IS_CHAN_2GHZ(&achans.ic_chans[i])) { if (nvram_invmatch(wl_mode, "g-only") && nvram_invmatch(wl_mode, "mixed") && nvram_invmatch(wl_mode, "b-only") && nvram_invmatch(wl_mode, "n2-only") && nvram_invmatch(wl_mode, "bg-mixed") && nvram_invmatch(wl_mode, "ng-only")) { fprintf(stderr, "%s:%d\n", __func__, __LINE__); continue; } #ifdef HAVE_BUFFALO_SA if(nvram_default_match("region", "SA", "") && (!strcmp(getUEnv("region"), "AP") || !strcmp(getUEnv("region"), "US")) && achans.ic_chans[i].ic_ieee > 11 && achans.ic_chans[i].ic_ieee <= 14) continue; #endif if (nvram_match(wl_turbo, "40") && (nvram_match(wl_mode, "n2-only") || nvram_match(wl_mode, "mixed") || nvram_match(wl_mode, "ng-only"))) { if (up && !IEEE80211_IS_CHAN_11NG_HT40PLUS (&achans.ic_chans[i])) { fprintf(stderr, "%s:%d\n", __func__, __LINE__); continue; } if (!up && !IEEE80211_IS_CHAN_11NG_HT40MINUS (&achans.ic_chans[i])) { fprintf(stderr, "%s:%d\n", __func__, __LINE__); continue; } } } list[l].channel = achans.ic_chans[i].ic_ieee; list[l].freq = achans.ic_chans[i].ic_freq; list[l].noise = -95; // achans.ic_chans[i].ic_noise; l++; } list[l].freq = -1; return list; }