Move local TX queue parameter parser into a common file
This allows the same implementation to be used for wpa_supplicant as well. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
78c1cb8868
commit
411e42673f
4 changed files with 105 additions and 100 deletions
|
@ -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 {
|
enum {
|
||||||
IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */
|
IEEE80211_TX_QUEUE_DATA0 = 0, /* used for EDCA AC_VO data */
|
||||||
IEEE80211_TX_QUEUE_DATA1 = 1, /* used for EDCA AC_VI 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 */
|
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
|
#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) {
|
} else if (os_strcmp(buf, "ap_table_expiration_time") == 0) {
|
||||||
conf->ap_table_expiration_time = atoi(pos);
|
conf->ap_table_expiration_time = atoi(pos);
|
||||||
} else if (os_strncmp(buf, "tx_queue_", 9) == 0) {
|
} 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",
|
wpa_printf(MSG_ERROR, "Line %d: invalid TX queue item",
|
||||||
line);
|
line);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -197,15 +197,6 @@ struct hostapd_radius_attr {
|
||||||
|
|
||||||
|
|
||||||
#define NUM_TX_QUEUES 4
|
#define NUM_TX_QUEUES 4
|
||||||
|
|
||||||
struct hostapd_tx_queue_params {
|
|
||||||
int aifs;
|
|
||||||
int cwmin;
|
|
||||||
int cwmax;
|
|
||||||
int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_ROAMING_CONSORTIUM_LEN 15
|
#define MAX_ROAMING_CONSORTIUM_LEN 15
|
||||||
|
|
||||||
struct hostapd_roaming_consortium {
|
struct hostapd_roaming_consortium {
|
||||||
|
|
|
@ -763,6 +763,98 @@ int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int hostapd_config_tx_queue(struct hostapd_tx_queue_params tx_queue[],
|
||||||
|
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 = &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 queue field '%s'", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel)
|
enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel)
|
||||||
{
|
{
|
||||||
u8 op_class;
|
u8 op_class;
|
||||||
|
|
|
@ -192,6 +192,18 @@ struct hostapd_wmm_ac_params {
|
||||||
|
|
||||||
int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
|
int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
|
||||||
const char *name, const char *val);
|
const char *name, const char *val);
|
||||||
|
|
||||||
|
struct hostapd_tx_queue_params {
|
||||||
|
int aifs;
|
||||||
|
int cwmin;
|
||||||
|
int cwmax;
|
||||||
|
int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NUM_TX_QUEUES 4
|
||||||
|
|
||||||
|
int hostapd_config_tx_queue(struct hostapd_tx_queue_params queue[],
|
||||||
|
const char *name, const char *val);
|
||||||
enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel);
|
enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel);
|
||||||
int ieee80211_chan_to_freq(const char *country, u8 op_class, u8 chan);
|
int ieee80211_chan_to_freq(const char *country, u8 op_class, u8 chan);
|
||||||
enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
enum hostapd_hw_mode ieee80211_freq_to_channel_ext(unsigned int freq,
|
||||||
|
|
Loading…
Reference in a new issue