Regio

From MeshWiki
Jump to navigation Jump to search

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:

  1. Haal transport code uit de pakket header
  2. 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
  3. Bij match: stuur het pakket door
  4. Geen match: drop het pakket
RegionEntry* RegionMap::findMatch(mesh::Packet* packet, uint8_t mask) {
  for (int i = 0; i < num_regions; i++) {
    auto region = &regions[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.

Template:Note

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), F betekent flood-allowed
  • Melbourne weigert flood (geen F)
  • CBD staat flood toe
  • chat staat 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 get output

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

  1. 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.
  2. Geen hiërarchische matching: Parent-child relaties zijn alleen cosmetisch.
  3. Private regions incompleet: De $naam keystore bevat TODOs.
  4. 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, stelt recv_pkt_region in
  • allowPacketForward() - Controleert of recv_pkt_region != NULL voor transport-flood pakketten
  • handleAnonRegionsReq() - Retourneert toegestane region namen naar clients die de repeater bevragen

Zie ook