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 {
|
||||
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;
|
||||
|
|
|
@ -197,15 +197,6 @@ struct hostapd_radius_attr {
|
|||
|
||||
|
||||
#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
|
||||
|
||||
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)
|
||||
{
|
||||
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[],
|
||||
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);
|
||||
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,
|
||||
|
|
Loading…
Reference in a new issue