Hotspot Manager tidying

This commit is contained in:
Robin E. R. Davies
2025-08-15 06:17:40 -04:00
parent cf8eadc69f
commit 57d112e616
+40 -44
View File
@@ -334,9 +334,12 @@ void HotspotManagerImpl::OnEthernetStateChanged(uint32_t state)
}
void HotspotManagerImpl::OnWlanStateChanged(uint32_t state)
{
this->wlanConnected = (state == 100);
Lv2Log::debug(SS("HotspotMonitor: OnWlanStateChanged"));
MaybeStartHotspot();
bool value = (state == 100);
if (value != this->wlanConnected)
{
this->wlanConnected = value;
MaybeStartHotspot();
}
}
void HotspotManagerImpl::onStartMonitoring()
@@ -402,7 +405,8 @@ void HotspotManagerImpl::onStartMonitoring()
this->wlanDevice->OnStateChanged.add(
[this](uint32_t, uint32_t, uint32_t)
{
OnWlanStateChanged(ethernetDevice->State());
// Use WLAN device state, not ethernet
OnWlanStateChanged(wlanDevice->State());
});
Lv2Log::debug("HotspotManager: state=Monitoring");
SetState(State::Monitoring);
@@ -682,9 +686,9 @@ std::vector<std::vector<uint8_t>> HotspotManagerImpl::GetAllAutoConnectSsids()
{
auto settings = connection->GetSettings();
bool autoConnect = true;
if (settings["connect"].count("autoconnect") > 0)
if (settings["connection"].count("autoconnect") > 0)
{
autoConnect = settings["connect"]["autoconnect"];
autoConnect = settings["connection"]["autoconnect"];
}
bool isInfrastructure =
settings["802-11-wireless"].count("mode") > 0 && settings["802-11-wireless"]["mode"].get<std::string>() == "infrastructure";
@@ -762,7 +766,8 @@ void HotspotManagerImpl::MaybeStartHotspot()
bool wantsHotspot;
if (wifiConfigSettings.NeedsScan()) {
if (wifiConfigSettings.NeedsScan())
{
std::vector<AccessPoint::ptr> allAccessPoints = GetAllAccessPoints();
std::vector<std::vector<uint8_t>> allAccessPointSsids = GetAccessPointSsids(allAccessPoints);
@@ -772,13 +777,13 @@ void HotspotManagerImpl::MaybeStartHotspot()
wantsHotspot = this->wifiConfigSettings.WantsHotspot(
this->ethernetConnected, connectableSsids, allAccessPointSsids);
} else {
}
else
{
wantsHotspot = this->wifiConfigSettings.WantsHotspot(
this->ethernetConnected);
}
if (this->state == State::Monitoring && wantsHotspot)
{
StartHotspot();
@@ -865,53 +870,47 @@ void HotspotManagerImpl::StartHotspot()
uint32_t iChannel = 0;
auto channel = this->wifiConfigSettings.channel_;
if (channel.length() != 0)
if (!channel.empty())
{
std::stringstream ss{channel};
ss >> iChannel;
ss >> iChannel; // 0 means auto
}
if (iChannel <= 1)
// If a specific channel is requested, set it and derive band accordingly.
// NM "band" values: "a" (5GHz), "bg" (2.4GHz). Channels 1-14 -> 2.4GHz; >14 -> 5GHz.
if (iChannel != 0)
{
wireless["channel"] = iChannel;
wireless["band"] = iChannel > 14 ? "a" : "bg";
}
else
{
wireless["band"] = iChannel == 0 ? "bg" : "a";
wireless["band"] = (iChannel > 14) ? "a" : "bg";
}
std::map<std::string, sdbus::Variant> &wirelessSecurity = settings["802-11-wireless-security"];
wirelessSecurity["key-mgmt"] = "wpa-psk";
wirelessSecurity["psk"] = wifiConfigSettings.password_;
// IPv4 shared method: NM will configure NAT and DHCP; static address is fine.
settings["ipv4"]["method"] = "shared";
settings["ipv6"]["method"] = "shared";
settings["ipv6"]["addr-gen-mode"] = 1; // "stable-privacy";
// For IPv6, use ignore to avoid advertising IPv6 if not needed; shared IPv6 is less common and can cause issues.
settings["ipv6"]["method"] = "ignore";
// If IPv6 were used, addr-gen-mode would be numeric enum; with method=ignore, omit it.
////////////////////////////////////////////////////////////////
// Create connection
settings["ipv4"]["method"] = sdbus::Variant(std::string("shared"));
// settings["ipv6"]["method"] = sdbus::Variant(std::string("ignore"));
settings["ipv4"]["address-data"] = sdbus::Variant(std::vector<std::map<std::string, sdbus::Variant>>{{{"address", sdbus::Variant("192.168.60.1")},
{"prefix", sdbus::Variant(uint32_t(24))}}});
// settings["ipv4"]["gateway'"] = sdbus::Variant(std::string("192.168.60.1"));
settings["ipv4"]["dhcp-send-hostname"] = sdbus::Variant(true);
settings["ipv4"]["dhcp-hostname"] = sdbus::Variant("raspberrypi");
settings["ipv4"]["address-data"] = sdbus::Variant(
std::vector<std::map<std::string, sdbus::Variant>>{
{{"address", sdbus::Variant("192.168.60.1")},
{"prefix", sdbus::Variant(uint32_t(24))}}});
// For method=shared, NM provides DHCP; explicit DHCP client options on this device are not applicable.
// settings["ipv4"]["dhcp-options"] = sdbus::Variant(std::vector<std::string>{
// "option:classless-static-route,192.168.60.0/23,0.0.0.0,0.0.0.0/0,192.168.60.1"});
// "option:classless-static-route,192.168.60.0/8,0.0.0.0,0.0.0.0/0,192.168.60.1"});
// settings["ipv4"]["dhcp-options"] = sdbus::Variant(std::vector<std::string>{
// "option:classless-static-route,192.168.60.0/23,192.168.60.1"});
// "option:classless-static-route,192.168.60.0/8,192.168.60.1"});
////////////////////////////////////////////////////////////
settings["ipv6"]["address-data"] = sdbus::Variant(std::vector<std::map<std::string, sdbus::Variant>>{
{{"address", sdbus::Variant("fdd2:e477:7b37:5b09::1")},
{"prefix", sdbus::Variant(uint32_t(64))}}});
settings["ipv6"]["gateway"] = sdbus::Variant("fdd2:e477:7b37:5b09::1");
// With IPv6 ignored, don't set address-data or gateway; NM may reject extraneous keys.
std::map<std::string, sdbus::Variant> options;
options["persist"] = "disk";
@@ -1012,7 +1011,9 @@ void HotspotManagerImpl::ScanNow()
Lv2Log::debug("Scanning");
wlanWirelessDevice->RequestScan(options);
} else {
}
else
{
return;
}
}
@@ -1158,14 +1159,9 @@ static bool IsNetworkManagerRunning()
bool HotspotManager::HasWifiDevice()
{
// use procfs to decide this, as NetworkManager may not be available yet.
if (!(get_wireless_interfaces_sysfs().empty()))
if (!get_wireless_interfaces_sysfs().empty())
{
return false;
return true;
}
if (!IsNetworkManagerRunning())
{
return false;
}
return true;
return false;
}