예제 #1
0
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;
}
예제 #2
0
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;
}