From dbb6970c1f45f15b9a119ad2b978a2868dd833f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2ESchr=C3=B6der?= Date: Sat, 22 Feb 2025 23:56:45 +0100 Subject: [PATCH] added first Part of FSR-Module --- src/modules/FishEyeStateRoutingModule.cpp | 87 +++++++++++++++++++---- src/modules/FishEyeStateRoutingModule.h | 9 +++ src/modules/NeighborInfoModule.cpp | 4 ++ 3 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/modules/FishEyeStateRoutingModule.cpp b/src/modules/FishEyeStateRoutingModule.cpp index b10f398c1..ec1f01435 100644 --- a/src/modules/FishEyeStateRoutingModule.cpp +++ b/src/modules/FishEyeStateRoutingModule.cpp @@ -24,28 +24,89 @@ FishEyeStateRoutingModule::FishEyeStateRoutingModule() } } +/* + * gets called from the NeighborInfo-Module if a new NeighborInfo Package arrives + */ bool FishEyeStateRoutingModule::addNeighborInfo(meshtastic_NeighborInfo Ninfo){ - + auto it = LSPDB.find(Ninfo.node_id); + if(it != LSPDB.end()){ //Node already in LSPDB + if(it->second.LSP.creation < Ninfo.creation){ + bool diff = false; + for(int i = 0; i < min(Ninfo.neighbors_count,it->second.LSP.neighbors_count); i++){ + if((Ninfo.neighbors[i].node_id) != (it->second.LSP.neighbors[i].node_id)){ + diff = true; + break; + } + } + if(diff || (it->second.LSP.traveledHops != 1) || (it->second.LSP.neighbors_count != Ninfo.neighbors_count)){ + LSPDBEntry entry; + NinfoToLSPDBEntry(&Ninfo,&entry); + if(it->second.forwarded == false){ + entry.timeout = min(it->second.timeout,entry.timeout); + } + entry.nextHop = it->second.nextHop; + it->second = entry; + calcNextHop(); + return 1; + }else{ + it->second.forwarded = false; + it->second.timeout = getTime() + moduleConfig.neighbor_info.update_interval * std::pow(it->second.LSP.traveledHops, alpha); + } + } + }else{ //Node not in LSPDB + LSPDBEntry entry; //new entry + NinfoToLSPDBEntry(&Ninfo,&entry); + LSPDB.insert(std::make_pair(entry.LSP.node_id,entry)); //insert into DB + calcNextHop(); //calculate shortest Path + return 1; + } + return 0; } +void FishEyeStateRoutingModule::NinfoToLSPDBEntry(meshtastic_NeighborInfo *Ninfo, LSPDBEntry *fsr){ + fsr->nextHop = NODENUM_BROADCAST; + fsr->LSP.node_id = Ninfo->node_id; + fsr->LSP.traveledHops = 1; + fsr->LSP.neighbors_count = Ninfo->neighbors_count; + for(int i = 0; i < Ninfo->neighbors_count; i++){ + fsr->LSP.neighbors[i] = Ninfo->neighbors[i]; + } + fsr->LSP.creation = Ninfo->creation; + fsr->timeout = getTime() + moduleConfig.neighbor_info.update_interval * std::pow(fsr->LSP.traveledHops, alpha); + fsr->forwarded = false; +} + +/* + * returns next-Hop for a Message to a given NodeID + */ uint32_t FishEyeStateRoutingModule::getNextHopForID(uint32_t dest){ - + auto it = LSPDB.find(dest); + if(it == LSPDB.end()){ + return NODENUM_BROADCAST; + }else{ + return it->second.nextHop; + } } +/* + * handels incomming LSP-Packages + */ bool FishEyeStateRoutingModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_FishEyeStateRouting *lsp) { - -} - -int32_t FishEyeStateRoutingModule::runOnce(){ - -} - -bool FishEyeStateRoutingModule::calcNextHop(){ } /* -Collect a received neighbor info packet from another node -Pass it to an upper client; do not persist this data on the mesh -*/ + * + */ +int32_t FishEyeStateRoutingModule::runOnce(){ + +} + +/* + * Calculates Distances and Next-Hops + */ +bool FishEyeStateRoutingModule::calcNextHop(){ + //sofortigen run once Check calen + +} \ No newline at end of file diff --git a/src/modules/FishEyeStateRoutingModule.h b/src/modules/FishEyeStateRoutingModule.h index 7e2e2e73f..41af842f7 100644 --- a/src/modules/FishEyeStateRoutingModule.h +++ b/src/modules/FishEyeStateRoutingModule.h @@ -39,7 +39,11 @@ class FishEyeStateRoutingModule : public ProtobufModule +#include "FishEyeStateRoutingModule.h" NeighborInfoModule *neighborInfoModule; @@ -145,6 +146,9 @@ bool NeighborInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, // If the hopLimit is the same as hopStart, then it is a neighbor getOrCreateNeighbor(mp.from, mp.from, 0, mp.rx_snr); // Set the broadcast interval to 0, as we don't know it } + if(moduleConfig.has_fish_eye_state_routing && moduleConfig.fish_eye_state_routing.enabled && (config.network.routingAlgorithm == meshtastic_Config_RoutingConfig_FishEyeState)){ + fishEyeStateRoutingModule->addNeighborInfo(*np); + } // Allow others to handle this packet return false; }