Skip to content
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 118 additions & 22 deletions libraries/WiFi/src/WiFiGeneric.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,112 @@ void WiFiGenericClass::enableLongRange(bool enable) {
_long_range = enable;
}

#if CONFIG_SOC_WIFI_HE_SUPPORT
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N | WIFI_PROTOCOL_11AX)
#else
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N)
#endif

#if SOC_WIFI_SUPPORT_5G
#define WIFI_PROTOCOL_DEFAULT_5G (WIFI_PROTOCOL_11A|WIFI_PROTOCOL_11N|WIFI_PROTOCOL_11AC|WIFI_PROTOCOL_11AX)
#endif

static bool _wifi_is_lr_enabled(wifi_interface_t ifx) {
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && SOC_WIFI_SUPPORT_5G
wifi_band_mode_t band_mode = WIFI_BAND_MODE_AUTO;
esp_err_t err = esp_wifi_get_band_mode(&band_mode);
if (err != ESP_OK) {
log_e("Failed to get Current Band Mode: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
if (band_mode == WIFI_BAND_MODE_AUTO) {
wifi_protocols_t protocols = {
.ghz_2g = 0,
.ghz_5g = 0
};
err = esp_wifi_get_protocols(ifx, &protocols);
if (err != ESP_OK) {
log_e("Failed to get Current Protocols: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
return protocols.ghz_2g == WIFI_PROTOCOL_LR;
} else if (band_mode == WIFI_BAND_MODE_5G_ONLY) {
return false;
}
#endif
uint16_t protocol_bitmap = 0;
esp_err_t err2 = esp_wifi_get_protocol(ifx, (uint8_t *)&protocol_bitmap);
if (err2 != ESP_OK) {
log_e("Failed to get Current Protocols: 0x%x: %s", err2, esp_err_to_name(err2));
return false;
}
return protocol_bitmap == WIFI_PROTOCOL_LR;
}

static bool _wifi_enable_lr(wifi_interface_t ifx) {
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && SOC_WIFI_SUPPORT_5G
wifi_band_mode_t band_mode = WIFI_BAND_MODE_AUTO;
esp_err_t err = esp_wifi_get_band_mode(&band_mode);
if (err != ESP_OK) {
log_e("Failed to get Current Band Mode: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
if (band_mode == WIFI_BAND_MODE_AUTO) {
wifi_protocols_t protocols = {
.ghz_2g = WIFI_PROTOCOL_LR,
.ghz_5g = WIFI_PROTOCOL_DEFAULT_5G
};
err = esp_wifi_set_protocols(ifx, &protocols);
if (err != ESP_OK) {
log_e("Failed to set LR Protocol: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
return true;
} else if (band_mode == WIFI_BAND_MODE_5G_ONLY) {
log_e("LR Protocol can only be enabled on 2.4GHz WiFi");
return false;
}
#endif
esp_err_t err2 = esp_wifi_set_protocol(ifx, WIFI_PROTOCOL_LR);
if (err2 != ESP_OK) {
log_e("Failed to set LR Protocol: 0x%x: %s", err2, esp_err_to_name(err2));
return false;
}
return true;
}

static bool _wifi_disable_lr(wifi_interface_t ifx) {
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && SOC_WIFI_SUPPORT_5G
wifi_band_mode_t band_mode = WIFI_BAND_MODE_AUTO;
esp_err_t err = esp_wifi_get_band_mode(&band_mode);
if (err != ESP_OK) {
log_e("Failed to get Current Band Mode: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
if (band_mode == WIFI_BAND_MODE_AUTO) {
wifi_protocols_t protocols = {
.ghz_2g = WIFI_PROTOCOL_DEFAULT,
.ghz_5g = WIFI_PROTOCOL_DEFAULT_5G
};
err = esp_wifi_set_protocols(ifx, &protocols);
if (err != ESP_OK) {
log_e("Failed to set Default Protocol: 0x%x: %s", err, esp_err_to_name(err));
return false;
}
return true;
} else if (band_mode == WIFI_BAND_MODE_5G_ONLY) {
log_e("LR Protocol can only be disabled on 2.4GHz WiFi");
return false;
}
#endif
esp_err_t err2 = esp_wifi_set_protocol(ifx, WIFI_PROTOCOL_DEFAULT);
if (err2 != ESP_OK) {
log_e("Failed to set Default Protocol: 0x%x: %s", err2, esp_err_to_name(err2));
return false;
}
return true;
}

/**
* set new mode
* @param m WiFiMode_t
Expand Down Expand Up @@ -555,43 +661,33 @@ bool WiFiGenericClass::mode(wifi_mode_t m) {

if (_long_range) {
if (m & WIFI_MODE_STA) {
err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR);
if (err != ESP_OK) {
log_e("Could not enable long range on STA! 0x%x: %s", err, esp_err_to_name(err));
if (!_wifi_enable_lr(WIFI_IF_STA)) {
log_e("Could not enable long range on STA!");
return false;
}
}
if (m & WIFI_MODE_AP) {
err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_LR);
if (err != ESP_OK) {
log_e("Could not enable long range on AP! 0x%x: %s", err, esp_err_to_name(err));
if (!_wifi_enable_lr(WIFI_IF_AP)) {
log_e("Could not enable long range on AP!");
return false;
}
}
} else {
#if CONFIG_SOC_WIFI_HE_SUPPORT
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N | WIFI_PROTOCOL_11AX)
#else
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N)
#endif
uint32_t current_protocol = 0;
if (m & WIFI_MODE_STA) {
err = esp_wifi_get_protocol(WIFI_IF_STA, (uint8_t *)&current_protocol);
if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) {
if (_wifi_is_lr_enabled(WIFI_IF_STA)) {
log_v("Disabling long range on STA");
err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_DEFAULT);
if (err != ESP_OK) {
log_e("Could not disable long range on STA! 0x%x: %s", err, esp_err_to_name(err));
if (!_wifi_disable_lr(WIFI_IF_STA)) {
log_e("Could not disable long range on STA!");
return false;
}
}
}
if (m & WIFI_MODE_AP) {
err = esp_wifi_get_protocol(WIFI_IF_AP, (uint8_t *)&current_protocol);
if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) {
if (_wifi_is_lr_enabled(WIFI_IF_AP)) {
log_v("Disabling long range on AP");
err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_DEFAULT);
if (err != ESP_OK) {
log_e("Could not disable long range on AP! 0x%x: %s", err, esp_err_to_name(err));
if (!_wifi_disable_lr(WIFI_IF_AP)) {
log_e("Could not disable long range on AP!");
return false;
}
}
}
Expand Down
Loading