diff --git a/feeds/wlan-ap/opensync/patches/37-add-channel-max-power.patch b/feeds/wlan-ap/opensync/patches/37-add-channel-max-power.patch new file mode 100644 index 000000000..74994ebf1 --- /dev/null +++ b/feeds/wlan-ap/opensync/patches/37-add-channel-max-power.patch @@ -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 diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/phy.h b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/phy.h index 2c5401609..3a82574a4 100644 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/phy.h +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/inc/phy.h @@ -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); diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c index ff5256a39..6104f76d3 100755 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio.c @@ -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) diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio_nl80211.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio_nl80211.c index fcf7d5305..20945551c 100644 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio_nl80211.c +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/radio_nl80211.c @@ -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; diff --git a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/utils.c b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/utils.c index cf459fe16..0c2d78ebd 100644 --- a/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/utils.c +++ b/feeds/wlan-ap/opensync/src/platform/openwrt/src/lib/target/src/utils.c @@ -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) {