fix(network): rebuild the DHCP hostname when the node is renamed
The hostname was built once in begin() from the node name, so `set name` left the node advertising its old name to DHCP until the next reflash. It is now rebuilt on rename through a new CommonCLICallbacks::onNodeNameChanged() hook, and begin() shares the same helper. What this cannot do is rename a live lease. IDF 4.4 states that a hostname changed after the interface is up "would only be reflected once the interface restarts/reconnects", and Arduino 2.x's WiFi.setHostname() does not touch a running netif at all — it writes a static string that the netif reads at bring-up. Forcing the issue would mean bouncing the link, which costs every MQTT slot a reconnect; that is not a reasonable price for a rename, so the new name lands at the next reconnect or boot instead. Only automatic (Ethernet-preferred) links carry a hostname today, exactly as before. Giving plain Wi-Fi observers one would change the DHCP identity of the existing fleet and is a separate decision.
This commit is contained in:
1 parent
c781862362
commit
da6406e92f
6 files changed
+75
-10
No files matched your search
@@ -943,6 +943,27 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
||||
memset(default_scope.key, 0, sizeof(default_scope.key));
|
||||
}
|
||||
|
||||
#if defined(WITH_MQTT_BRIDGE) && defined(ESP_PLATFORM)
|
||||
// Only an automatic link carries a hostname today (see the header note). The
|
||||
// value reaches DHCP when the link next starts or reconnects: IDF 4.4 states
|
||||
// plainly that a hostname changed after the interface is up "would only be
|
||||
// reflected once the interface restarts/reconnects", and Arduino 2.x's
|
||||
// WiFi.setHostname() does not even touch a running netif — it writes a static
|
||||
// string the netif reads at bring-up. So this cannot rename a live lease, and
|
||||
// deliberately does not bounce the link to force one: dropping an observer's
|
||||
// route mid-operation costs every MQTT slot a reconnect, which is not a
|
||||
// reasonable price for a cosmetic rename.
|
||||
void MyMesh::applyNetworkHostname(const char* when) {
|
||||
NetworkLink& link = activeNetworkLink();
|
||||
if (!link.isAutomatic()) return;
|
||||
char network_hostname[NetworkHostname::kBufferSize];
|
||||
NetworkHostname::build(network_hostname, sizeof(network_hostname),
|
||||
_prefs.node_name, self_id.pub_key, PUB_KEY_SIZE);
|
||||
link.setHostname(network_hostname);
|
||||
Serial.printf("Network: hostname %s%s\n", network_hostname, when);
|
||||
}
|
||||
#endif
|
||||
|
||||
void MyMesh::begin(FILESYSTEM *fs) {
|
||||
mesh::Mesh::begin();
|
||||
_fs = fs;
|
||||
@@ -952,11 +973,7 @@ void MyMesh::begin(FILESYSTEM *fs) {
|
||||
#if defined(WITH_MQTT_BRIDGE) && defined(ESP_PLATFORM)
|
||||
NetworkLink& boot_network = activeNetworkLink();
|
||||
if (boot_network.isAutomatic()) {
|
||||
char network_hostname[NetworkHostname::kBufferSize];
|
||||
NetworkHostname::build(network_hostname, sizeof(network_hostname),
|
||||
_prefs.node_name, self_id.pub_key, PUB_KEY_SIZE);
|
||||
boot_network.setHostname(network_hostname);
|
||||
Serial.printf("Network: hostname %s\n", network_hostname);
|
||||
applyNetworkHostname("");
|
||||
MQTTPrefs* obs = _cli.getObserverPrefs();
|
||||
Serial.printf("Network: probing Ethernet for up to %lums\n",
|
||||
(unsigned long)NETWORK_ETHERNET_BOOT_WAIT_MS);
|
||||
|
||||
Reference in new issue
Block a user