blob: 90b9d4c9ae128e6fc6fc925a6add28d9bde2e6d1 [file] [log] [blame]
/*
* Test app for frequency conversion to Network.Wifi.Channel uma metric.
*
* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <stdio.h>
enum connman_channel {
CONNMAN_CHANNEL_UNDEF = 0,
CONNMAN_CHANNEL_2412 = 1,
CONNMAN_CHANNEL_2417 = 2,
CONNMAN_CHANNEL_2422 = 3,
CONNMAN_CHANNEL_2427 = 4,
CONNMAN_CHANNEL_2432 = 5,
CONNMAN_CHANNEL_2437 = 6,
CONNMAN_CHANNEL_2442 = 7,
CONNMAN_CHANNEL_2447 = 8,
CONNMAN_CHANNEL_2452 = 9,
CONNMAN_CHANNEL_2457 = 10,
CONNMAN_CHANNEL_2462 = 11,
CONNMAN_CHANNEL_2467 = 12,
CONNMAN_CHANNEL_2472 = 13,
CONNMAN_CHANNEL_2484 = 14,
CONNMAN_CHANNEL_5180 = 15,
CONNMAN_CHANNEL_5200 = 16,
CONNMAN_CHANNEL_5220 = 17,
CONNMAN_CHANNEL_5240 = 18,
CONNMAN_CHANNEL_5260 = 19,
CONNMAN_CHANNEL_5280 = 20,
CONNMAN_CHANNEL_5300 = 21,
CONNMAN_CHANNEL_5320 = 22,
CONNMAN_CHANNEL_5500 = 23,
CONNMAN_CHANNEL_5520 = 24,
CONNMAN_CHANNEL_5540 = 25,
CONNMAN_CHANNEL_5560 = 26,
CONNMAN_CHANNEL_5580 = 27,
CONNMAN_CHANNEL_5600 = 28,
CONNMAN_CHANNEL_5620 = 29,
CONNMAN_CHANNEL_5640 = 30,
CONNMAN_CHANNEL_5660 = 31,
CONNMAN_CHANNEL_5680 = 32,
CONNMAN_CHANNEL_5700 = 33,
CONNMAN_CHANNEL_5745 = 34,
CONNMAN_CHANNEL_5765 = 35,
CONNMAN_CHANNEL_5785 = 36,
CONNMAN_CHANNEL_5805 = 37,
CONNMAN_CHANNEL_5825 = 38,
CONNMAN_CHANNEL_5170 = 39,
CONNMAN_CHANNEL_5190 = 40,
CONNMAN_CHANNEL_5210 = 41,
CONNMAN_CHANNEL_5230 = 42,
/* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
/* NB: ignore regulated bands 4920..4980 and 5020..5160 */
#ifdef CONFIG_PSB_SUPPORT
CONNMAN_CHANNEL_PSB_4940 = 43, /* NB: PSB center freq's are +.5MHz */
CONNMAN_CHANNEL_PSB_4941 = 44,
CONNMAN_CHANNEL_PSB_4942 = 45,
CONNMAN_CHANNEL_PSB_4943 = 46,
CONNMAN_CHANNEL_PSB_4944 = 47,
CONNMAN_CHANNEL_PSB_4947 = 48,
CONNMAN_CHANNEL_PSB_4952 = 49,
CONNMAN_CHANNEL_PSB_4957 = 50,
CONNMAN_CHANNEL_PSB_4962 = 51,
CONNMAN_CHANNEL_PSB_4967 = 52,
CONNMAN_CHANNEL_PSB_4972 = 53,
CONNMAN_CHANNEL_PSB_4977 = 54,
CONNMAN_CHANNEL_PSB_4982 = 55,
CONNMAN_CHANNEL_PSB_4985 = 56,
CONNMAN_CHANNEL_PSB_4986 = 57,
CONNMAN_CHANNEL_PSB_4987 = 58,
CONNMAN_CHANNEL_PSB_4988 = 59,
CONNMAN_CHANNEL_PSB_4989 = 60,
#endif
CONNMAN_CHANNEL_MAX
};
static void connman_info(const char *fmt, ...)
{
(void) fmt;
}
/*
* Map WiFi frequency to UMA enum value.
*/
static enum connman_channel __map_frequency(int frequency)
{
if (2412 <= frequency && frequency <= 2472) {
if (((frequency - 2412) % 5) == 0)
return CONNMAN_CHANNEL_2412 + (frequency - 2412) / 5;
} else if (frequency == 2484) {
return CONNMAN_CHANNEL_2484;
} else if (5170 <= frequency && frequency <= 5230) {
if ((frequency % 20) == 0)
return CONNMAN_CHANNEL_5180 + (frequency - 5180) / 20;
if ((frequency % 20) == 10)
return CONNMAN_CHANNEL_5170 + (frequency - 5170) / 20;
/* NB: fall through to return undefined */
} else if (5240 <= frequency && frequency <= 5320) {
if (((frequency - 5180) % 20) == 0)
return CONNMAN_CHANNEL_5180 + (frequency - 5180) / 20;
} else if (5500 <= frequency && frequency <= 5700) {
if (((frequency - 5500) % 20) == 0)
return CONNMAN_CHANNEL_5500 + (frequency - 5500) / 20;
} else if (5745 <= frequency && frequency <= 5825) {
if (((frequency - 5745) % 20) == 0)
return CONNMAN_CHANNEL_5745 + (frequency - 5745) / 20;
#ifdef CONFIG_PSB_SUPPORT
} else if (4940 <= frequency && frequency <= 4990) {
/* Public Safety Band */
return CONNMAN_CHANNEL_PSB_4940 + (frequency * 10) +
((frequency % 5) == 2 ? 5 : 0) - 49400) / 5;
#endif
}
connman_info("%s: no mapping for WiFi frequency %d", __func__,
frequency);
return CONNMAN_CHANNEL_UNDEF;
}
#define NBBY 8
static unsigned char map[6000 / NBBY];
static void setbit(x) { map[x / NBBY] |= 1<<(x % NBBY); }
static int isbitset(x) { return map[x / NBBY] & (1<<(x % NBBY)); }
static void check(int freq, enum connman_channel expected,
enum connman_channel mapped)
{
if (isbitset(freq))
printf("frequency %d already checked\n", freq);
if (mapped != expected)
printf("frequency %d mapped to %d but expected %d\n", freq,
mapped, expected);
setbit(freq);
}
int
main(int argc, char *argv[])
{
int i, freq;
/* check known mappings */
for (freq = 2412, i = 0; freq <= 2472; freq += 5, i++)
check(freq, CONNMAN_CHANNEL_2412+i, __map_frequency(freq));
check(2484, CONNMAN_CHANNEL_2484, __map_frequency(2484));
for (freq = 5180, i = 0; freq <= 5320; freq += 20, i++)
check(freq, CONNMAN_CHANNEL_5180+i, __map_frequency(freq));
for (freq = 5170, i = 0; freq <= 5230; freq += 20, i++)
check(freq, CONNMAN_CHANNEL_5170+i, __map_frequency(freq));
for (freq = 5500, i = 0; freq <= 5700; freq += 20, i++)
check(freq, CONNMAN_CHANNEL_5500+i, __map_frequency(freq));
for (freq = 5745, i = 0; freq <= 5825; freq += 20, i++)
check(freq, CONNMAN_CHANNEL_5745+i, __map_frequency(freq));
/* TODO(sleffler) PSB support */
/* sweep unchecked frequencies to verify they map to undefined */
for (freq = 2300; freq <= 6000; freq++)
if (!isbitset(freq))
check(freq, CONNMAN_CHANNEL_UNDEF,
__map_frequency(freq));
}