Validate CR and SF lora config (#8146)

* Validate CR and SF lora config

* No zero-bw

* Update src/modules/AdminModule.cpp

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix braces

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Ben Meadors 2025-09-28 13:13:07 -05:00 committed by GitHub
parent 8717c60f13
commit 033fc0c8f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -707,20 +707,40 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c)
#endif #endif
config.display = c.payload_variant.display; config.display = c.payload_variant.display;
break; break;
case meshtastic_Config_lora_tag:
case meshtastic_Config_lora_tag: {
// Wrap the entire case in a block to scope variables and avoid crossing initialization
auto oldLoraConfig = config.lora;
auto validatedLora = c.payload_variant.lora;
LOG_INFO("Set config: LoRa"); LOG_INFO("Set config: LoRa");
config.has_lora = true; config.has_lora = true;
if (validatedLora.coding_rate < 4 || validatedLora.coding_rate > 8) {
LOG_WARN("Invalid coding_rate %d, setting to 5", validatedLora.coding_rate);
validatedLora.coding_rate = 5;
}
if (validatedLora.spread_factor < 7 || validatedLora.spread_factor > 12) {
LOG_WARN("Invalid spread_factor %d, setting to 11", validatedLora.spread_factor);
validatedLora.spread_factor = 11;
}
if (validatedLora.bandwidth == 0) {
int originalBandwidth = validatedLora.bandwidth;
validatedLora.bandwidth = myRegion->wideLora ? 800 : 250;
LOG_WARN("Invalid bandwidth %d, setting to default", originalBandwidth);
}
// If no lora radio parameters change, don't need to reboot // If no lora radio parameters change, don't need to reboot
if (config.lora.use_preset == c.payload_variant.lora.use_preset && config.lora.region == c.payload_variant.lora.region && if (oldLoraConfig.use_preset == validatedLora.use_preset && oldLoraConfig.region == validatedLora.region &&
config.lora.modem_preset == c.payload_variant.lora.modem_preset && oldLoraConfig.modem_preset == validatedLora.modem_preset && oldLoraConfig.bandwidth == validatedLora.bandwidth &&
config.lora.bandwidth == c.payload_variant.lora.bandwidth && oldLoraConfig.spread_factor == validatedLora.spread_factor &&
config.lora.spread_factor == c.payload_variant.lora.spread_factor && oldLoraConfig.coding_rate == validatedLora.coding_rate && oldLoraConfig.tx_power == validatedLora.tx_power &&
config.lora.coding_rate == c.payload_variant.lora.coding_rate && oldLoraConfig.frequency_offset == validatedLora.frequency_offset &&
config.lora.tx_power == c.payload_variant.lora.tx_power && oldLoraConfig.override_frequency == validatedLora.override_frequency &&
config.lora.frequency_offset == c.payload_variant.lora.frequency_offset && oldLoraConfig.channel_num == validatedLora.channel_num &&
config.lora.override_frequency == c.payload_variant.lora.override_frequency && oldLoraConfig.sx126x_rx_boosted_gain == validatedLora.sx126x_rx_boosted_gain) {
config.lora.channel_num == c.payload_variant.lora.channel_num &&
config.lora.sx126x_rx_boosted_gain == c.payload_variant.lora.sx126x_rx_boosted_gain) {
requiresReboot = false; requiresReboot = false;
} }
@ -739,7 +759,7 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c)
digitalWrite(RF95_FAN_EN, HIGH ^ 0); digitalWrite(RF95_FAN_EN, HIGH ^ 0);
} }
#endif #endif
config.lora = c.payload_variant.lora; config.lora = validatedLora;
// If we're setting region for the first time, init the region and regenerate the keys // If we're setting region for the first time, init the region and regenerate the keys
if (isRegionUnset && config.lora.region > meshtastic_Config_LoRaConfig_RegionCode_UNSET) { if (isRegionUnset && config.lora.region > meshtastic_Config_LoRaConfig_RegionCode_UNSET) {
if (!owner.is_licensed) { if (!owner.is_licensed) {
@ -771,6 +791,7 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c)
} }
} }
break; break;
}
case meshtastic_Config_bluetooth_tag: case meshtastic_Config_bluetooth_tag:
LOG_INFO("Set config: Bluetooth"); LOG_INFO("Set config: Bluetooth");
config.has_bluetooth = true; config.has_bluetooth = true;