Improve radio configuration

This commit is contained in:
vemax78 2013-09-22 22:28:59 +02:00
parent 7dcfd657b8
commit 8ed0a76617
4 changed files with 290 additions and 53 deletions

View File

@ -14,7 +14,7 @@ application: {
tunnelmode: {
nativeframe = false;
ethframe = false;
localbridging = false;
localbridging = true;
};
mactype = "localmac";
@ -32,10 +32,6 @@ application: {
};
descriptor: {
radio = (
{ device = "phy0"; driver = "nl80211"; }
);
encryption = [
"802.11_AES",
"802.11_TKIP"
@ -78,6 +74,54 @@ application: {
};
};
radio = (
{
device = "phy0";
enabled = true;
driver = "nl80211";
mode = "g";
country = "IT";
outdoor = false;
rtsthreshold = 2347;
shortretry = 7;
longretry = 4;
shortpreamble = true;
fragmentationthreshold = 2346;
txmsdulifetime = 512;
rxmsdulifetime = 512;
maxbssid = 4;
dtimperiod = 0;
beaconperiod = 100;
antenna = {
diversity = false;
combiner = "omni";
selection = [ "internal" ];
};
dsss = {
channel = 1;
clearchannelassessment = 0;
energydetectthreshold = 0;
};
ofdm = {
channel = 1;
bandsupported = 0;
tithreshold = 100;
};
multidomaincapability = {
firstchannel = 1;
numberchannels = 11;
maxtxpower = 100;
};
supportedrates = [
12, 18, 24, 36, 48, 72, 96, 108
];
txpower = {
current = 100;
supported = [ 100 ];
};
}
);
network: {
#binding = "eth1";
mtu = 1500;
@ -90,7 +134,7 @@ application: {
};
acdiscovery: {
search = false;
search = true;
host = [
"127.0.0.1"
];

View File

@ -19,6 +19,40 @@ struct wtp_t g_wtp;
static char g_configurationfile[260] = WTP_STANDARD_CONFIGURATION_FILE;
/* */
static struct wtp_radio* wtp_create_radio(void) {
struct wtp_radio* radio;
/* Create disabled radio */
radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, g_wtp.radios->count);
radio->radioid = g_wtp.radios->count;
radio->status = WTP_RADIO_DISABLED;
/* Init configuration radio */
radio->antenna.radioid = radio->radioid;
radio->antenna.selections = capwap_array_create(sizeof(uint8_t), 0, 1);
radio->macoperation.radioid = radio->radioid;
radio->supportedrates.radioid = radio->radioid;
radio->radioconfig.radioid = radio->radioid;
radio->radioinformation.radioid = radio->radioid;
return radio;
}
/* */
static void wtp_free_radios(void) {
int i;
for (i = 0; i < g_wtp.radios->count; i++) {
struct wtp_radio* radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
capwap_array_free(radio->antenna.selections);
}
/* */
capwap_array_free(g_wtp.radios);
}
/* Alloc WTP */
static int wtp_init(void) {
/* Init WTP with default value */
@ -128,7 +162,7 @@ static void wtp_destroy(void) {
capwap_free(g_wtp.location.value);
/* Free radios */
capwap_array_free(g_wtp.radios);
wtp_free_radios();
}
/* Save AC address */
@ -180,6 +214,171 @@ static void wtp_print_usage(void) {
/* TODO */
}
/* */
static int wtp_parsing_radio_configuration(config_setting_t* configElement, struct wtp_radio* radio) {
int i;
int configBool;
long int configInt;
const char* configString;
config_setting_t* configItems;
config_setting_t* configSection;
/* Physical radio mode */
if (config_setting_lookup_string(configElement, "mode", &configString) == CONFIG_TRUE) {
int length = strlen(configString);
if (!length) {
return 0;
}
for (i = 0; i < length; i++) {
switch (configString[i]) {
case 'a': {
radio->radioinformation.radiotype |= CAPWAP_RADIO_TYPE_80211A;
break;
}
case 'b': {
radio->radioinformation.radiotype |= CAPWAP_RADIO_TYPE_80211B;
break;
}
case 'g': {
radio->radioinformation.radiotype |= CAPWAP_RADIO_TYPE_80211G;
break;
}
case 'n': {
radio->radioinformation.radiotype |= CAPWAP_RADIO_TYPE_80211N;
break;
}
default: {
return 0;
}
}
}
} else {
return 0;
}
/* Antenna */
configSection = config_setting_get_member(configElement, "antenna");
if (configSection) {
if (config_setting_lookup_bool(configSection, "diversity", &configBool) == CONFIG_TRUE) {
radio->antenna.diversity = (configBool ? CAPWAP_ANTENNA_DIVERSITY_ENABLE : CAPWAP_ANTENNA_DIVERSITY_DISABLE);
} else {
return 0;
}
if (config_setting_lookup_string(configSection, "combiner", &configString) == CONFIG_TRUE) {
if (!strcmp(configString, "left")) {
radio->antenna.combiner = CAPWAP_ANTENNA_COMBINER_SECT_LEFT;
} else if (!strcmp(configString, "right")) {
radio->antenna.combiner = CAPWAP_ANTENNA_COMBINER_SECT_RIGHT;
} else if (!strcmp(configString, "omni")) {
radio->antenna.combiner = CAPWAP_ANTENNA_COMBINER_SECT_OMNI;
} else if (!strcmp(configString, "mimo")) {
radio->antenna.combiner = CAPWAP_ANTENNA_COMBINER_SECT_MIMO;
} else {
return 0;
}
configItems = config_setting_get_member(configSection, "selection");
if (configItems != NULL) {
int count = config_setting_length(configItems);
if ((count > 0) && (count <= CAPWAP_ANTENNASELECTIONS_MAXLENGTH)) {
for (i = 0; i < count; i++) {
uint8_t* selection = (uint8_t*)capwap_array_get_item_pointer(radio->antenna.selections, i);
configString = config_setting_get_string_elem(configItems, i);
if (!strcmp(configString, "internal")) {
*selection = CAPWAP_ANTENNA_INTERNAL;
} else if (!strcmp(configString, "external")) {
*selection = CAPWAP_ANTENNA_EXTERNAL;
} else {
return 0;
}
}
} else {
return 0;
}
} else {
return 0;
}
} else {
return 0;
}
} else {
return 0;
}
/* DSSS */
configSection = config_setting_get_member(configElement, "dsss");
if (configSection) {
radio->directsequencecontrol.radioid = radio->radioid; /* Enable DSSS config */
if (config_setting_lookup_int(configSection, "channel", &configInt) == CONFIG_TRUE) {
if ((configInt > 0) && (configInt < 256)) {
radio->directsequencecontrol.currentchannel = (uint8_t)configInt;
} else {
return 0;
}
} else {
return 0;
}
if (config_setting_lookup_int(configSection, "clearchannelassessment", &configInt) == CONFIG_TRUE) {
if ((configInt & CAPWAP_DSCONTROL_CCA_MASK) == configInt) {
radio->directsequencecontrol.currentcca = (uint8_t)configInt;
} else {
return 0;
}
} else {
return 0;
}
if (config_setting_lookup_int(configSection, "energydetectthreshold", &configInt) == CONFIG_TRUE) {
radio->directsequencecontrol.enerydetectthreshold = (uint32_t)configInt;
} else {
return 0;
}
}
/* OFDM */
configSection = config_setting_get_member(configElement, "ofdm");
if (configSection) {
radio->ofdmcontrol.radioid = radio->radioid; /* Enable OFDM config */
if (config_setting_lookup_int(configSection, "channel", &configInt) == CONFIG_TRUE) {
if ((configInt > 0) && (configInt < 256)) {
radio->ofdmcontrol.currentchannel = (uint8_t)configInt;
} else {
return 0;
}
} else {
return 0;
}
if (config_setting_lookup_int(configSection, "clearchannelassessment", &configInt) == CONFIG_TRUE) {
if ((configInt & CAPWAP_OFDMCONTROL_BAND_MASK) == configInt) {
radio->ofdmcontrol.bandsupport = (uint8_t)configInt;
} else {
return 0;
}
} else {
return 0;
}
if (config_setting_lookup_int(configSection, "energydetectthreshold", &configInt) == CONFIG_TRUE) {
radio->ofdmcontrol.tithreshold = (uint32_t)configInt;
} else {
return 0;
}
}
return 1;
}
/* Parsing configuration */
static int wtp_parsing_configuration_1_0(config_t* config) {
int i;
@ -416,18 +615,14 @@ static int wtp_parsing_configuration_1_0(config_t* config) {
}
}
/* Set Radio descriptor of WTP */
configSetting = config_lookup(config, "application.descriptor.radio");
/* Set Radio WTP */
configSetting = config_lookup(config, "application.radio");
if (configSetting != NULL) {
int count = config_setting_length(configSetting);
if (g_wtp.binding == CAPWAP_WIRELESS_BINDING_IEEE80211) {
for (i = 0; i < count; i++) {
int radioid;
int radiostatus;
struct wtp_radio* radio;
char radioname[IFNAMSIZ];
char drivername[WIFI_DRIVER_NAME_SIZE];
if (!IS_VALID_RADIOID(g_wtp.radios->count + 1)) {
capwap_logging_error("Exceeded max number of radio device");
@ -439,43 +634,47 @@ static int wtp_parsing_configuration_1_0(config_t* config) {
if (configElement != NULL) {
if (config_setting_lookup_string(configElement, "device", &configString) == CONFIG_TRUE) {
if (*configString && (strlen(configString) < IFNAMSIZ)) {
strcpy(radioname, configString);
if (config_setting_lookup_string(configElement, "driver", &configString) == CONFIG_TRUE) {
if (*configString && (strlen(configString) < WIFI_DRIVER_NAME_SIZE)) {
strcpy(drivername, configString);
/* Create new radio device */
radio = wtp_create_radio();
strcpy(radio->device, configString);
/* Initialize radio device */
radioid = g_wtp.radios->count + 1;
result = wifi_create_device(radioid, radioname, drivername);
if (!result) {
radiostatus = WTP_RADIO_ENABLED;
capwap_logging_warning("Register radioid %d with radio device: %s - %s", radioid, radioname, drivername);
if (config_setting_lookup_bool(configElement, "enabled", &configInt) == CONFIG_TRUE) {
if (configInt) {
/* Retrieve radio capability */
if (wtp_parsing_radio_configuration(configElement, radio)) {
/* Initialize radio device */
if (config_setting_lookup_string(configElement, "driver", &configString) == CONFIG_TRUE) {
if (*configString && (strlen(configString) < WIFI_DRIVER_NAME_SIZE)) {
result = wifi_create_device(radio->radioid, radio->device, configString);
if (!result) {
radio->status = WTP_RADIO_ENABLED;
capwap_logging_info("Register radioid %d with radio device: %s - %s", radio->radioid, radio->device, configString);
/* Update radio capability with device query */
/* TODO
struct wifi_capability* capability = NULL;
capability = wifi_get_capability_device(radio->radioid);
if (capability) {
}
*/
} else {
radio->status = WTP_RADIO_HWFAILURE;
capwap_logging_warning("Unable to register radio device: %s - %s", radio->device, configString);
}
}
}
} else {
radiostatus = WTP_RADIO_HWFAILURE;
capwap_logging_warning("Unable to register radio device: %s - %s", radioname, drivername);
capwap_logging_error("Invalid configuration file, application.radio");
return 0;
}
/* Create new radio device */
radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, g_wtp.radios->count);
/* Radio device information */
radio->radioid = radioid;
strcpy(radio->device, radioname);
radio->status = radiostatus;
} else {
capwap_logging_error("Invalid configuration file, application.descriptor.radio.driver string length exceeded");
return 0;
}
} else {
capwap_logging_error("Invalid configuration file, element application.descriptor.radio.driver not found");
return 0;
}
} else {
capwap_logging_error("Invalid configuration file, application.descriptor.radio.device string length exceeded");
capwap_logging_error("Invalid configuration file, application.radio.device string length exceeded");
return 0;
}
} else {
capwap_logging_error("Invalid configuration file, element application.descriptor.radio.device not found");
capwap_logging_error("Invalid configuration file, element application.radio.device not found");
return 0;
}
}

View File

@ -143,17 +143,16 @@ struct wtp_t {
struct wtp_radio {
int radioid;
char device[IFNAMSIZ];
int status;
/*
int status;
struct capwap_80211_antenna_element antenna;
struct capwap_80211_directsequencecontrol_element directsequencecontrol;
struct capwap_80211_macoperation_element macoperation;
struct capwap_80211_multidomaincapability_element multidomaincapability;
struct capwap_80211_ofdmcontrol_element ofdmcontrol;
struct capwap_80211_supportedrates_element supportedrates;
struct capwap_80211_wtpradioconf_element radioconfig;
struct capwap_80211_wtpradioinformation_element radioinformation;
*/
};
extern struct wtp_t g_wtp;

View File

@ -52,16 +52,11 @@ void wtp_create_80211_wtpradioinformation_element(struct capwap_packet_txmng* tx
radio = (struct wtp_radio*)capwap_array_get_item_pointer(g_wtp.radios, i);
/* Set message element */
memset(&element, 0, sizeof(struct capwap_80211_wtpradioinformation_element));
element.radioid = (uint8_t)radio->radioid;
if (radio->status == WTP_RADIO_ENABLED) {
struct wifi_capability* capability = NULL;
/* Retrieve device capability */
capability = wifi_get_capability_device(radio->radioid);
if (capability) {
element.radiotype = capability->radiotype & CAPWAP_RADIO_TYPE_MASK;
}
memcpy(&element, &radio->radioinformation, sizeof(struct capwap_80211_wtpradioinformation_element));
} else {
memset(&element, 0, sizeof(struct capwap_80211_wtpradioinformation_element));
element.radioid = (uint8_t)radio->radioid;
}
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, &element);