|
|
|
@ -943,35 +943,6 @@ static int hostapd_config_bss(struct hostapd_config *conf, const char *ifname)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* convert floats with one decimal place to value*10 int, i.e.,
|
|
|
|
|
* "1.5" will return 15 */
|
|
|
|
|
static int hostapd_config_read_int10(const char *value)
|
|
|
|
|
{
|
|
|
|
|
int i, d;
|
|
|
|
|
char *pos;
|
|
|
|
|
|
|
|
|
|
i = atoi(value);
|
|
|
|
|
pos = os_strchr(value, '.');
|
|
|
|
|
d = 0;
|
|
|
|
|
if (pos) {
|
|
|
|
|
pos++;
|
|
|
|
|
if (*pos >= '0' && *pos <= '9')
|
|
|
|
|
d = *pos - '0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return i * 10 + d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int valid_cw(int cw)
|
|
|
|
|
{
|
|
|
|
|
return (cw == 1 || cw == 3 || cw == 7 || cw == 15 || cw == 31 ||
|
|
|
|
|
cw == 63 || cw == 127 || cw == 255 || cw == 511 || cw == 1023 ||
|
|
|
|
|
cw == 2047 || cw == 4095 || cw == 8191 || cw == 16383 ||
|
|
|
|
|
cw == 32767);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */
|
|
|
|
|
IEEE80211_TX_QUEUE_DATA1 = 1, /* used for EDCA AC_VI data */
|
|
|
|
@ -979,67 +950,6 @@ enum {
|
|
|
|
|
IEEE80211_TX_QUEUE_DATA3 = 3 /* used for EDCA AC_BK data */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static int hostapd_config_tx_queue(struct hostapd_config *conf,
|
|
|
|
|
const char *name, const char *val)
|
|
|
|
|
{
|
|
|
|
|
int num;
|
|
|
|
|
const char *pos;
|
|
|
|
|
struct hostapd_tx_queue_params *queue;
|
|
|
|
|
|
|
|
|
|
/* skip 'tx_queue_' prefix */
|
|
|
|
|
pos = name + 9;
|
|
|
|
|
if (os_strncmp(pos, "data", 4) == 0 &&
|
|
|
|
|
pos[4] >= '0' && pos[4] <= '9' && pos[5] == '_') {
|
|
|
|
|
num = pos[4] - '0';
|
|
|
|
|
pos += 6;
|
|
|
|
|
} else if (os_strncmp(pos, "after_beacon_", 13) == 0 ||
|
|
|
|
|
os_strncmp(pos, "beacon_", 7) == 0) {
|
|
|
|
|
wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name);
|
|
|
|
|
return 0;
|
|
|
|
|
} else {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Unknown tx_queue name '%s'", pos);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (num >= NUM_TX_QUEUES) {
|
|
|
|
|
/* for backwards compatibility, do not trigger failure */
|
|
|
|
|
wpa_printf(MSG_INFO, "DEPRECATED: '%s' not used", name);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
queue = &conf->tx_queue[num];
|
|
|
|
|
|
|
|
|
|
if (os_strcmp(pos, "aifs") == 0) {
|
|
|
|
|
queue->aifs = atoi(val);
|
|
|
|
|
if (queue->aifs < 0 || queue->aifs > 255) {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Invalid AIFS value %d",
|
|
|
|
|
queue->aifs);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
} else if (os_strcmp(pos, "cwmin") == 0) {
|
|
|
|
|
queue->cwmin = atoi(val);
|
|
|
|
|
if (!valid_cw(queue->cwmin)) {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Invalid cwMin value %d",
|
|
|
|
|
queue->cwmin);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
} else if (os_strcmp(pos, "cwmax") == 0) {
|
|
|
|
|
queue->cwmax = atoi(val);
|
|
|
|
|
if (!valid_cw(queue->cwmax)) {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Invalid cwMax value %d",
|
|
|
|
|
queue->cwmax);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
} else if (os_strcmp(pos, "burst") == 0) {
|
|
|
|
|
queue->burst = hostapd_config_read_int10(val);
|
|
|
|
|
} else {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Unknown tx_queue field '%s'", pos);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_IEEE80211R_AP
|
|
|
|
|
|
|
|
|
@ -3424,7 +3334,7 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
|
|
|
|
} else if (os_strcmp(buf, "ap_table_expiration_time") == 0) {
|
|
|
|
|
conf->ap_table_expiration_time = atoi(pos);
|
|
|
|
|
} else if (os_strncmp(buf, "tx_queue_", 9) == 0) {
|
|
|
|
|
if (hostapd_config_tx_queue(conf, buf, pos)) {
|
|
|
|
|
if (hostapd_config_tx_queue(conf->tx_queue, buf, pos)) {
|
|
|
|
|
wpa_printf(MSG_ERROR, "Line %d: invalid TX queue item",
|
|
|
|
|
line);
|
|
|
|
|
return 1;
|
|
|
|
|