WIFI-721: Added new var to Radio State that stores max channel power

Signed-off-by: Owen Anderson <owenthomasanderson@gmail.com>
This commit is contained in:
Owen Anderson
2021-06-04 15:46:35 -04:00
committed by Rick Sommerville
parent c0cb6baa89
commit e6bb6f7d4f
5 changed files with 68 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
--- a/interfaces/opensync.ovsschema
+++ b/interfaces/opensync.ovsschema
@@ -1880,7 +1880,15 @@
"min": 0,
"max": "unlimited"
}
- }
+ },
+ "channel_max_power": {
+ "type": {
+ "key": "integer",
+ "value": "integer",
+ "min": 0,
+ "max": "unlimited"
+ }
+ }
},
"isRoot": true,
"maxRows": 256

View File

@@ -12,6 +12,7 @@ extern int phy_get_tx_available_antenna(const char *name);
extern int phy_get_rx_available_antenna(const char *name);
extern int phy_get_max_tx_power(const char *name , int channel);
extern int phy_get_channels(const char *name, int *channel);
extern int phy_get_dfs_channels(const char *name, int *channel);
extern int phy_get_channels_state(const char *name,
struct schema_Wifi_Radio_State *rstate);
extern int phy_get_band(const char *name, char *band);

View File

@@ -182,6 +182,36 @@ static void radio_state_custom_options_get(struct schema_Wifi_Radio_State *rstat
}
}
static void set_channel_max_power(struct schema_Wifi_Radio_State *rstate,
int *index, int channel,
int max_power)
{
rstate->channel_max_power_keys[*index] = channel;
rstate->channel_max_power[*index] = max_power;
*index += 1;
rstate->channel_max_power_len = *index;
}
// Update the entire channel_max_power map in the radio state
static void update_channel_max_power(char* phy, struct schema_Wifi_Radio_State *rstate) {
int channels[64];
int channel_count = phy_get_channels(phy, channels);
channel_count += phy_get_dfs_channels(phy, channels + channel_count);
// Clear the data previously stored in channel_max_power
memset(rstate->channel_max_power_keys, 0, sizeof(rstate->channel_max_power_keys));
memset(rstate->channel_max_power, 0, sizeof(rstate->channel_max_power));
rstate->channel_max_power_len = 0;
// Set the new values for channel_max_power
int i, index = 0;
for (i = 0; i < channel_count && i < 64; i++) {
int channel = channels[i];
int max_tx_power = phy_get_max_tx_power(phy, channel);
set_channel_max_power(rstate, &index, channel, max_tx_power);
}
}
const struct uci_blob_param_list wifi_device_param = {
.n_params = __WDEV_ATTR_MAX,
.params = wifi_device_policy,
@@ -217,6 +247,8 @@ static bool radio_state_update(struct uci_section *s, struct schema_Wifi_Radio_C
return false;
}
update_channel_max_power(phy, &rstate);
if (tb[WDEV_ATTR_CHANNEL]) {
nl80211_channel_get(phy, &chan);
if(chan)

View File

@@ -395,6 +395,7 @@ static void nl80211_add_phy(struct nlattr **tb, char *name)
if (tb_freq[NL80211_FREQUENCY_ATTR_RADAR]) {
phy->chandfs[chan] = 1;
phy->chanpwr[chan] = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER]);
phy->chandisabled[chan] = 0;
LOG(DEBUG, "%s: found dfs channel %d", phy->name, chan);
continue;

View File

@@ -309,6 +309,21 @@ int phy_get_channels(const char *name, int *channel)
return j;
}
// Gets all the dfs channels avaible for a radio
int phy_get_dfs_channels(const char *name, int *dfs_channels)
{
struct wifi_phy *phy = phy_find(name);
int i, j = 0;
if (!phy)
return 0;
for (i = 0; (i < IEEE80211_CHAN_MAX) && (j < 64); i++)
if (phy->chandfs[i])
dfs_channels[j++] = i;
return j;
}
static void update_channels_state(struct schema_Wifi_Radio_State *rstate,
int *index, const char *key, int *value, int value_len)
{