fix: nodenum 4 (#2798)

* tryfix: nodenum 4

* trunk fmt

* rename vars and fix brackets

* purge invalid db entries

* trunk fmt
This commit is contained in:
Manuel 2023-09-18 13:16:37 +02:00 committed by GitHub
parent a1514b8b64
commit 1bae926576
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 12 deletions

View File

@ -304,6 +304,19 @@ void NodeDB::resetNodes()
neighborInfoModule->resetNeighbors(); neighborInfoModule->resetNeighbors();
} }
void NodeDB::cleanupMeshDB()
{
int newPos = 0, removed = 0;
for (int i = 0; i < *numMeshNodes; i++) {
if (meshNodes[i].has_user)
meshNodes[newPos++] = meshNodes[i];
else
removed++;
}
*numMeshNodes -= removed;
LOG_DEBUG("cleanupMeshDB purged %d entries\n", removed);
}
void NodeDB::installDefaultDeviceState() void NodeDB::installDefaultDeviceState()
{ {
LOG_INFO("Installing default DeviceState\n"); LOG_INFO("Installing default DeviceState\n");
@ -333,6 +346,7 @@ void NodeDB::init()
{ {
LOG_INFO("Initializing NodeDB\n"); LOG_INFO("Initializing NodeDB\n");
loadFromDisk(); loadFromDisk();
cleanupMeshDB();
uint32_t devicestateCRC = crc32Buffer(&devicestate, sizeof(devicestate)); uint32_t devicestateCRC = crc32Buffer(&devicestate, sizeof(devicestate));
uint32_t configCRC = crc32Buffer(&config, sizeof(config)); uint32_t configCRC = crc32Buffer(&config, sizeof(config));
@ -388,25 +402,20 @@ void NodeDB::init()
*/ */
void NodeDB::pickNewNodeNum() void NodeDB::pickNewNodeNum()
{ {
NodeNum r = myNodeInfo.my_node_num;
getMacAddr(ourMacAddr); // Make sure ourMacAddr is set getMacAddr(ourMacAddr); // Make sure ourMacAddr is set
// Pick an initial nodenum based on the macaddr // Pick an initial nodenum based on the macaddr
r = (ourMacAddr[2] << 24) | (ourMacAddr[3] << 16) | (ourMacAddr[4] << 8) | ourMacAddr[5]; NodeNum nodeNum = (ourMacAddr[2] << 24) | (ourMacAddr[3] << 16) | (ourMacAddr[4] << 8) | ourMacAddr[5];
if (r == NODENUM_BROADCAST || r < NUM_RESERVED)
r = NUM_RESERVED; // don't pick a reserved node number
meshtastic_NodeInfoLite *found; meshtastic_NodeInfoLite *found;
while ((found = getMeshNode(r)) && memcmp(found->user.macaddr, owner.macaddr, sizeof(owner.macaddr))) { while ((nodeNum == NODENUM_BROADCAST || nodeNum < NUM_RESERVED) ||
// FIXME: input for random() is int, so NODENUM_BROADCAST becomes -1 ((found = getMeshNode(nodeNum)) && memcmp(found->user.macaddr, owner.macaddr, sizeof(owner.macaddr)) != 0)) {
NodeNum n = random(NUM_RESERVED, NODENUM_BROADCAST); // try a new random choice NodeNum candidate = random(NUM_RESERVED, LONG_MAX); // try a new random choice
LOG_WARN("NOTE! Our desired nodenum 0x%x is in use, so trying for 0x%x\n", r, n); LOG_WARN("NOTE! Our desired nodenum 0x%x is invalid or in use, so trying for 0x%x\n", nodeNum, candidate);
r = n; nodeNum = candidate;
} }
myNodeInfo.my_node_num = r; myNodeInfo.my_node_num = nodeNum;
} }
static const char *prefFileName = "/prefs/db.proto"; static const char *prefFileName = "/prefs/db.proto";

View File

@ -146,6 +146,9 @@ class NodeDB
/// read our db from flash /// read our db from flash
void loadFromDisk(); void loadFromDisk();
/// purge db entries without user info
void cleanupMeshDB();
/// Reinit device state from scratch (not loading from disk) /// Reinit device state from scratch (not loading from disk)
void installDefaultDeviceState(), installDefaultChannels(), installDefaultConfig(), installDefaultModuleConfig(); void installDefaultDeviceState(), installDefaultChannels(), installDefaultConfig(), installDefaultModuleConfig();
}; };