Regio
MeshCore Regions
Met Regions kunnen repeaters flood-verkeer filteren op basis van kanaal, zodat niet elk bericht het hele netwerk overspoelt. Zie Regio en scope voor de praktische configuratie met Nederlandse regio-indeling.
Het probleem dat Regions oplossen
In een standaard mesh-netwerk worden flood-gerouteerde pakketten naar elke bereikbare repeater gestuurd. Dit werkt voor kleine netwerken, maar geeft problemen op grotere schaal:
- Bandbreedte verspilling: Een bericht bedoeld voor gebruikers in Melbourne wordt ook doorgestuurd door repeaters in Sydney
- Privacy zorgen: Alle repeaters zien al het verkeer (zelfs als het versleuteld is)
- Kanaal congestie: Drukke topics overbelasten het hele netwerk
Regions lossen dit op met transport codes - korte codes waarmee repeaters kunnen herkennen bij welk kanaal een pakket hoort.
Hoe het werkt
Pakketstructuur
Wanneer een client een region-scoped bericht verstuurt, gebruikt het pakket ROUTE_TYPE_TRANSPORT_FLOOD en bevat een 2-byte transport code:
[header][transport_code_1][transport_code_2][path_length][path][payload]
^^^^^^^^^^^^^^^^
Afgeleid van region key + payload
Transport Code Berekening
De transport code is een HMAC-gebaseerde tag:
uint16_t TransportKey::calcTransportCode(const mesh::Packet* packet) const {
SHA256 sha;
sha.resetHMAC(key, sizeof(key)); // Region's 16-byte key
sha.update(&type, 1); // Payload type
sha.update(packet->payload, len); // Payload inhoud
sha.finalizeHMAC(key, sizeof(key), &code, 2);
return code;
}
Dit creëert een tag die:
- Bewijst dat de afzender de region key kent
- Uniek is per bericht (bevat payload)
- Niet vervalst kan worden zonder de key
Repeater Matching
Wanneer een repeater een transport-flood pakket ontvangt:
- Haal transport code uit de pakket header
- Voor elke toegestane region in de region map:
- Leid de region's key af
- Bereken de verwachte transport code voor dit pakket
- Vergelijk met de code van het pakket
- Bij match: stuur het pakket door
- Geen match: drop het pakket
RegionEntry* RegionMap::findMatch(mesh::Packet* packet, uint8_t mask) {
for (int i = 0; i < num_regions; i++) {
auto region = ®ions[i];
if ((region->flags & mask) == 0) { // Region staat dit type verkeer toe
// Leid key af en bereken verwachte code
uint16_t code = keys[j].calcTransportCode(packet);
if (packet->transport_codes[0] == code) {
return region; // Match!
}
}
}
return NULL; // Geen match - pakket wordt gedropt
}
Region Types
Regions worden geïdentificeerd op naam, waarbij het prefix de key-afleiding bepaalt:
Publieke Hashtag Regions (#naam of naam)
De key wordt direct afgeleid van de naam:
SHA256 sha;
sha.update("#kanaalnaam", strlen("#kanaalnaam"));
sha.finalize(&key, 16);
Iedereen die de kanaalnaam kent kan:
- Berichten naar deze region sturen
- Hun repeater configureren om deze berichten door te sturen
Dit is vergelijkbaar met IRC-kanalen - publiek maar scoped. Zie Publieke kanalen voor een overzicht van actieve kanalen.
Private Regions ($naam)
Private regions gebruiken pre-shared keys opgeslagen in een secure keystore. De naam alleen is niet genoeg om de key af te leiden.
Configuratie
Region Entry Structuur
struct RegionEntry {
uint16_t id; // Unieke identifier (auto-toegewezen)
uint16_t parent; // Parent region ID (voor weergave hiërarchie)
uint8_t flags; // REGION_DENY_FLOOD (0x01)
char name[31]; // Region naam
};
CLI Commando's
Zie CLI Commando's voor een volledig overzicht van alle commando's.
| Commando | Beschrijving |
|---|---|
region |
Toon region tree |
region put <naam> [parent] |
Maak een region aan |
region remove <naam> |
Verwijder een region (mag geen children hebben) |
region allowf <naam> |
Sta flood forwarding toe voor deze region |
region denyf <naam> |
Weiger flood forwarding (standaard) |
region home <naam> |
Stel home region in (gemarkeerd met ^)
|
region get <naam> |
Toon region details |
region list allowed |
Lijst regions die flood toestaan |
region list denied |
Lijst regions die flood weigeren |
region save |
Sla op naar flash |
region load |
Start multi-line load modus |
Voorbeeld Configuratie
region put Melbourne region put CBD Melbourne region put Suburbs Melbourne region put chat region allowf CBD region allowf chat region save
Resulterende tree (via region commando):
* F Melbourne CBD F Suburbs chat F
*is de wildcard (root),Fbetekent flood-allowedMelbourneweigert flood (geenF)CBDstaat flood toechatstaat flood toe
De Wildcard Region
De * region bepaalt het gedrag voor pakketten die ROUTE_TYPE_FLOOD gebruiken (zonder transport codes):
allowf *- Stuur alle niet-region-getagde flood pakketten door (standaard)denyf *- Drop alle niet-region-getagde flood pakketten
Belangrijk Gedrag
Flat Matching (Geen Hiërarchie)
Ondanks de parent-child weergavestructuur is matching flat. Een pakket getagd voor "CBD" zal NIET matchen met "Melbourne", zelfs als CBD's parent Melbourne is.
Het parent veld beïnvloedt alleen:
- Tree weergave formatting
- Voorkomen van verwijdering van regions met children
- De
region getoutput
Het heeft geen effect op pakket routing.
Standaard Deny
Nieuwe regions worden aangemaakt met REGION_DENY_FLOOD als standaard. Je moet expliciet allowf gebruiken om verkeer door te sturen.
Persistentie
Regions worden opgeslagen in /regions2 op het flash-bestandssysteem van het apparaat. Gebruik region save na wijzigingen, anders gaan ze verloren bij reboot.
Praktische Use Cases
Geografische Scoping
region put Nederland region put Amsterdam Nederland region put Rotterdam Nederland region allowf Amsterdam region save
Deze repeater stuurt alleen Amsterdam-getagd verkeer door, wat de belasting van Rotterdam-berichten vermindert. Zie Regio en scope voor de standaard Nederlandse regio-indeling.
Topic Kanalen
region put noodgevallen region put chat region put weer region allowf noodgevallen region allowf weer region save
Stuur noodgevallen en weer-updates door, maar geen algemene chat. Zie Publieke kanalen voor beschikbare kanalen.
Private Netwerken
region put $bedrijf region allowf $bedrijf
Met juiste keystore configuratie (wanneer geïmplementeerd) kunnen alleen geautoriseerde repeaters bedrijfsverkeer doorsturen.
Beperkingen
- 16-bit codes: Transport codes zijn slechts 2 bytes, dus collisions zijn theoretisch mogelijk (1 op 65534). De HMAC-constructie maakt opzettelijke collisions rekenkundig onhaalbaar.
- Geen hiërarchische matching: Parent-child relaties zijn alleen cosmetisch.
- Private regions incompleet: De
$naamkeystore bevat TODOs. - Statische configuratie: Regions moeten per repeater via CLI geconfigureerd worden. Er is geen automatische discovery of synchronisatie.
Technische Details
Opslag Formaat
Regions worden opgeslagen in /regions2 met deze layout:
[5 bytes gereserveerde header] [2 bytes home_id] [1 byte wildcard.flags] [2 bytes next_id] [RegionEntry 0: 2+2+31+1 bytes + 128 pad] [RegionEntry 1: ...] ...
Geheugen Limieten
- Maximaal 32 regions per repeater (
MAX_REGION_ENTRIES) - Region namen tot 30 karakters
- 16 gecachte transport keys (
MAX_TKS_ENTRIES)
Integratie Punten
filterRecvFloodPacket()- Aangeroepen bij pakket ontvangst, steltrecv_pkt_regioninallowPacketForward()- Controleert ofrecv_pkt_region != NULLvoor transport-flood pakkettenhandleAnonRegionsReq()- Retourneert toegestane region namen naar clients die de repeater bevragen
Zie ook
- Regio en scope - Praktische Nederlandse regio-indeling
- CLI Commando's - Commando referentie
- Lijst van regio's - Volledige lijst van regiocodes