mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-15 10:35:36 +00:00
3721 lines
72 KiB
HTML
3721 lines
72 KiB
HTML
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
<meta name="description" content="Documentation for the open source MeshCore firmware">
|
|
|
|
|
|
|
|
<link rel="canonical" href="https://mikecarper.github.io/MeshCore/filter_tool/">
|
|
|
|
|
|
<link rel="prev" href="../faq/">
|
|
|
|
|
|
<link rel="next" href="../firmware_memory_budget/">
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="icon" href="../assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
|
|
|
|
|
|
|
|
<title>Filter policy playground - MeshCore Docs</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
|
|
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/extra.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/firmware_picker.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/telemetry_decoder.css">
|
|
|
|
<link rel="stylesheet" href="../_stylesheets/filter_tool.css">
|
|
|
|
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
<body dir="ltr">
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#filter-policy-playground" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header class="md-header md-header--shadow" data-md-component="header">
|
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
|
<a href=".." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
|
|
|
|
<img src="../_assets/meshcore.svg" alt="logo">
|
|
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
MeshCore Docs
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
Filter policy playground
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-header__button md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
|
</label>
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
|
</label>
|
|
<nav class="md-search__options" aria-label="Search">
|
|
|
|
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="md-search__suggest" data-md-component="search-suggest"></div>
|
|
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list" role="presentation"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-header__source">
|
|
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
mikecarper/MeshCore
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href=".." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
|
|
|
|
<img src="../_assets/meshcore.svg" alt="logo">
|
|
|
|
</a>
|
|
MeshCore Docs
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
<a href="https://github.com/mikecarper/MeshCore/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
mikecarper/MeshCore
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href=".." class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Introduction
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../WiFi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
WiFi and MQTT by Firmware Type
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cad_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SX1262 channel-scanning hardware results
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../carrier_wave/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Carrier-wave RF checks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../carrier_wave_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CW and CW2 validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_build_matrix/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Availability by Firmware Build
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_command_availability/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Command Availability Matrix
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_commands/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI Commands
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cli_settings_audit/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
CLI setting dispatch audit
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_contact_cache/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion contact caches
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_contact_cache_results/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Contact-cache and NimBLE RAM qualification
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_offline_queue/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion Offline Message Queue
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion Protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_radio_full/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_usb_ascii_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
USB Companion ASCII default validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../companion_usb_client_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
USB Companion client compatibility
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../docs/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Local Documentation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../double_frequency_v4_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Double center-frequency write: V4 transmitter / XIAO receiver
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../esp32_memory_budget/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Classic ESP32 image memory budget
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../espnow_bridge_setup/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP-NOW bridge: simple setup
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../faq/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Frequently Asked Questions
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Filter policy playground
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Filter policy playground
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#build-a-policy" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Build a policy
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#payload-type-reference" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Payload type reference
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#current-fpf7-command-mapping" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Current FPF7 command mapping
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#proposed-evaluation-contract" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Proposed evaluation contract
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../firmware_memory_budget/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Firmware memory checks
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../firmware_picker/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Firmware picker
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../flood_filtering/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Flood Filtering and Moderation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../four_fixed_tx_dwell_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Four fixed transmitters: longer dwell repeats
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../four_fixed_tx_single_pass_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Four fixed transmitters / fast single-pass receiver
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_companion_features/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full Companion: turn features on and off
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_companion_usb_switcher/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Companion USB CLI and binary switcher
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../full_usb_logging_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Full USB logging repair — 1.17.1.6
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../gps_tracking/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
GPS Tracking
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../halo_keymind_settings/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Halo and Keymind Branch Settings
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hardware_validation_bluetooth_stealth_2026-09-07/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
XIAO Bluetooth stealth hardware validation - 2026-09-07
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hardware_validation_checklist/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Hardware validation checklist
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../home_text_spacing/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Home-screen text spacing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../host_cli_service/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
LoRa CLI Host Service
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../kiss_modem_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore KISS Modem Protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../lora_ota_automation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Scripted LoRa OTA from start to finish
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mbedtls-tls-footprint/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Shrinking the per-connection TLS footprint on non-PSRAM observers
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mixed_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Mixed-bandwidth two-channel reception test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../mixed_sf_bw_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Equal-symbol-time mixed SF/BW, four-channel test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nimble_companion_trial/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 NimBLE Full Companion trial
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nimble_companion_trial_results/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 NimBLE trial results, 2026-09-08
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52-usb-ready-fix/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 USB READY hang
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52_companion_storage_recovery/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 Companion automatic ExtraFS recovery
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nrf52_power_management/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 Power Management
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../number_allocations/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Number Allocations
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_easy/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Easy firmware updates over LoRa
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_meshtower_v2_sdcard/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshTower V2 microSD LoRa OTA
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_nrf52_bootloader_update/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 bootloader updates over LoRa
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_nrf52_qspi/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
nRF52 repeater LoRa OTA with external QSPI
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_protocol/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore OTA - .mota container & LoRa protocol
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ota_user_guide/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Updating your node over the air (OTA) - user guide
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../packet_format/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Packet Format
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pair_4p6_300us_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF7/62.5 + SF8/500: 4.6 slow chirps, 0.3 ms reserve
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pair_preamble32_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF7/62.5 + SF8/500, fast switching and preamble 32
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../payloads/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Payload Format
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pr7_review_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
PR #7 review and validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../preamble_detection_investigation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Off-channel preamble investigation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../qr_codes/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
QR Codes
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_chirp_math_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Shared radio/radio2 chirp timing and preamble warnings
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_dwell_policy_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Automatic dwell policy: 4.6 chirps on both profiles
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profile_switch_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SX1262 profile-switch validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profiles/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Two LoRa profiles on one radio
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_profiles_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Dual-profile receive validation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../radio_receive_calibration/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Radio receive calibration and recovery
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../rak3401_mota_chain/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
RAK3401 1W repeater compact LoRa update chain
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../role_feature_switches/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Feature switches by role — 1.17.1.5 USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../s3_memory_soak_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
ESP32-S3 OTA memory experiment
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../separated_radio_modulation_cache_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Separated radios, normal XIAO RX gain, and unchanged-modulation timing
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_10_vs_100hz_full_sample_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125 full samples: 10 Hz versus 100 Hz first-pass detour
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_10hz_cr_detour_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125: tiny first-pass frequency offset and coding-rate detour
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_full_retune_twice_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125: apply the full radio settings twice per hop
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_nrf52_double_write_settling_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10 / 125 kHz, XIAO nRF52 TX, double write, 1 ms delay grid
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf10_rollback_failure_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF10/125 rollback and wider-spacing failure isolation
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf125_settling_limits_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Descending SF10..SF5 / 125 kHz settling limits
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf5_250_dwell_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF5 / 250 kHz: four-channel dwell sweep
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_125_settling_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6/125 four-channel post-switch settling sweep
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_5p1_trace_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6 / 125 kHz: four channels at 5.1 chirps
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf6_channel_scan_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF6 / 125 kHz channel-count test
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../sf8_5p1_trace_validation/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SF8 / 125 kHz: four-channel comparison at 5.1 chirps
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../spiffs_regular_file_reads/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
SPIFFS regular-file reads and login replay state
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../stats_binary_frames/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Stats Binary Frame Structures
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../telemetry_decoder/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Telemetry decoder
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../terminal_chat_cli/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Terminal Chat CLI
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../usb_serial_backpressure/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Native USB backpressure and radio liveness
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../v4_pixel5_font_trial/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Small-screen message fonts
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_88" >
|
|
|
|
|
|
<label class="md-nav__link" for="__nav_88" id="__nav_88_label" tabindex="0">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Releases
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_88_label" aria-expanded="false">
|
|
<label class="md-nav__title" for="__nav_88">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
|
|
|
|
Releases
|
|
|
|
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.5-doc-audit/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
Markdown audit — 1.17.1.5 USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.5/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore 1.17.1.5 Dev - USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../releases/1.17.1.6/" class="md-nav__link">
|
|
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
|
|
|
|
MeshCore 1.17.1.6 Dev - USA Cascade
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#build-a-policy" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Build a policy
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#payload-type-reference" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Payload type reference
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#current-fpf7-command-mapping" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Current FPF7 command mapping
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#proposed-evaluation-contract" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
|
|
Proposed evaluation contract
|
|
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/mikecarper/MeshCore/edit/keymindCascade/docs/filter_tool.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
<h1 id="filter-policy-playground">Filter policy playground</h1>
|
|
<p>Build a forwarding policy, see its readable definition, and simulate how a
|
|
repeater handles a packet. Rules match received packet facts, then apply actions
|
|
such as dropping, scoping, rate-limiting, or retrying a flood.</p>
|
|
<p>Everything runs locally in this browser. Channel keys, packet facts, and policy
|
|
drafts are not uploaded anywhere.</p>
|
|
<div class="filter-design-warning" role="note">
|
|
<strong>Policy design preview</strong>
|
|
<p>
|
|
The phases and core conditions model current FPF7 behavior, including its
|
|
forward rows, scope rewrites, and shared blacklist. The readable policy
|
|
language, JSON, and Base64 bundle are still a prototype: current firmware
|
|
is configured with <code>set flood.*</code> or <code>set fr</code> commands and cannot install a
|
|
bundle from this page.
|
|
</p>
|
|
</div>
|
|
|
|
<h2 id="build-a-policy">Build a policy</h2>
|
|
<p>Start with an example or build a rule, then test the draft against packet facts
|
|
in the simulator below. The examples draw from
|
|
<a href="../flood_filtering/">Flood Filtering and Moderation</a>.</p>
|
|
<div class="filter-tool" data-filter-tool>
|
|
<div class="filter-management-safety" role="note">
|
|
<strong>Remote login and direct routes</strong>
|
|
<p>
|
|
This policy only decides whether a relay retransmits a flood. Direct
|
|
packets and local delivery are unaffected. Rules matching the login/admin
|
|
family can still reduce multi-hop remote-login reach, so the analyzer
|
|
flags them.
|
|
</p>
|
|
</div>
|
|
<div class="filter-tool-toolbar" aria-label="Policy examples">
|
|
<div class="filter-example-heading">
|
|
<strong>Example policies</strong>
|
|
<span>Choose one to load its full rules into the builder and draft.</span>
|
|
</div>
|
|
<div class="filter-example-primer" role="note">
|
|
<p>
|
|
Read each summary as <code>when</code> all conditions match,
|
|
<code>do</code> the actions. A match alone does not stop forwarding.
|
|
</p>
|
|
<div class="filter-primer-tables">
|
|
<table class="filter-primer-table">
|
|
<caption>Payload selectors</caption>
|
|
<thead>
|
|
<tr><th><code>type=</code> value</th><th>Matches</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr><td><a href="#payload-type-reference"><code>grp_data</code></a></td><td>Only the named payload type; see every exact type below</td></tr>
|
|
<tr><td><code>any</code></td><td>Every payload type</td></tr>
|
|
<tr><td><code>class:group</code></td><td>GRP_TXT and GRP_DATA</td></tr>
|
|
<tr><td><code>class:login</code></td><td>REQ, RESPONSE, TXT_MSG, ANON_REQ, and PATH</td></tr>
|
|
<tr><td><code>class:other</code></td><td>Every remaining payload type that is not group or login</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="filter-primer-table">
|
|
<caption>Other conditions and actions</caption>
|
|
<thead>
|
|
<tr><th>Field</th><th>Meaning</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr><td><code>hops=</code></td><td>Received hop count: <code>all</code>, <code>3+</code>, <code>2-6</code>, or <code>3</code></td></tr>
|
|
<tr><td><code>channel=</code></td><td><code>*</code> means no channel condition; a name or key authenticates one group channel; <code>hash:XX</code> is an unauthenticated one-byte fallback</td></tr>
|
|
<tr><td><code>rx.scope=</code></td><td>Original incoming transport scope</td></tr>
|
|
<tr><td><code>path=</code></td><td>Path prefix, blacklist, bucket, or loop match</td></tr>
|
|
<tr><td><code>tempradio=</code></td><td>Temporary-radio state</td></tr>
|
|
<tr><td><code>do drop</code></td><td>Do not retransmit</td></tr>
|
|
<tr><td><code>do scope=</code></td><td>Set the outgoing transport scope</td></tr>
|
|
<tr><td><code>do rate=</code></td><td>Apply a per-minute rate and burst</td></tr>
|
|
<tr><td><code>do timing=</code></td><td>Select fast, normal, or slow scheduling</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<p class="filter-primer-note">
|
|
There is no <code>class:txt</code>. Use <code>type=grp_txt</code> for
|
|
channel text or <code>type=txt_msg</code> for peer text.
|
|
</p>
|
|
</div>
|
|
<div class="filter-example-grid">
|
|
<button type="button" data-example="channel_scope">
|
|
<span>Set #BlackHole86 scope on all #rgdata group traffic</span>
|
|
<code>when type=class:group hops=all channel=#rgdata do scope=#BlackHole86 timing=fast</code>
|
|
</button>
|
|
<button type="button" data-example="blackhole">
|
|
<span>Add #BlackHole86 scope to unscoped #rgdata data</span>
|
|
<code>when type=grp_data hops=all channel=#rgdata rx.scope=none do scope=#BlackHole86 timing=fast</code>
|
|
</button>
|
|
<button type="button" data-example="scope_rewrite">
|
|
<span>Replace #usa with #BlackHole86 on #rgdata data</span>
|
|
<code>when type=grp_data hops=all channel=#rgdata rx.scope=scope:usa do scope=#BlackHole86 timing=fast</code>
|
|
</button>
|
|
<button type="button" data-example="prefix_rate">
|
|
<span>Rate-limit packets whose path starts with 860C</span>
|
|
<code>when type=any hops=all path=prefix:860C do rate=10/min burst=10</code>
|
|
</button>
|
|
<button type="button" data-example="high_traffic">
|
|
<span>Drop selected flood types at their hop limits</span>
|
|
<code>when type=control hops=1+ do drop<br>when type=req hops=3+ do drop; same for type=grp_data<br>when type=response hops=9+ do drop; same for type=anon_req and type=path</code>
|
|
</button>
|
|
<button type="button" data-example="moderation">
|
|
<span>Rate-limit Public messages from “Noisy User”</span>
|
|
<code>when type=grp_txt hops=all channel=public sender="Noisy User" do rate=5/min burst=5</code>
|
|
</button>
|
|
<button type="button" data-example="blacklist">
|
|
<span>Stop forwarding traffic from blacklisted internet gateways</span>
|
|
<code>when type=any hops=all path=blacklist do drop</code>
|
|
</button>
|
|
<button type="button" data-example="factory">
|
|
<span>Three defaults: OTA, distant #wardriving, and bridge/crossover #wardriving</span>
|
|
<code>when type=ota hops=all tempradio=inactive do drop<br>when type=any channel=#wardriving hops=5+ do drop<br>when type=any channel=#wardriving hops=all via=bridge,cross do drop</code>
|
|
</button>
|
|
<button type="button" data-example="wildcards">
|
|
<span>Set #BlackHole86 scope on login and bucket-matched other traffic</span>
|
|
<code>when type=class:login hops=all do scope=#BlackHole86 timing=fast<br>when type=class:other hops=all path=bucket:2 do scope=#BlackHole86 timing=slow</code>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="filter-tool-grid">
|
|
<section class="filter-panel filter-builder" aria-labelledby="filter-builder-title">
|
|
<div class="filter-panel-heading">
|
|
<div>
|
|
<p class="filter-eyebrow">Rule builder</p>
|
|
<h2 id="filter-builder-title">Create a policy rule</h2>
|
|
</div>
|
|
<button type="button" data-role="reset-form">Reset form</button>
|
|
</div>
|
|
|
|
<p class="filter-field-help">The factory example contains all three repeater defaults.
|
|
The playground's <code>via=</code> traffic-path matcher corresponds to firmware
|
|
<code>mode=radio|bridge|cross|bridge,cross</code>; the advanced Active/Shadow/Disabled
|
|
mode is a separate playground setting. See the
|
|
<a href="../flood_filtering/#filter-bridge-and-radio-crossover-traffic">firmware mode guide</a>.
|
|
This simulator models flood packets; firmware bridge/cross rules also cover direct routes.</p>
|
|
<h3>Common match settings</h3>
|
|
<div class="filter-form-grid">
|
|
<label>
|
|
Payload type or class
|
|
<select data-field="type">
|
|
<option value="any">Any payload type</option>
|
|
<option value="class:group">Class: group text and data</option>
|
|
<option value="class:login">Class: login/admin family</option>
|
|
<option value="class:other">Class: every other payload</option>
|
|
<option value="req">REQ</option>
|
|
<option value="response">RESPONSE</option>
|
|
<option value="txt_msg">TXT_MSG</option>
|
|
<option value="ack">ACK</option>
|
|
<option value="advert">ADVERT</option>
|
|
<option value="grp_txt">GRP_TXT</option>
|
|
<option value="grp_data">GRP_DATA</option>
|
|
<option value="anon_req">ANON_REQ</option>
|
|
<option value="path">PATH</option>
|
|
<option value="trace">TRACE</option>
|
|
<option value="multipart">MULTIPART</option>
|
|
<option value="control">CONTROL</option>
|
|
<option value="ota">OTA</option>
|
|
<option value="13">Reserved type 13</option>
|
|
<option value="14">Reserved type 14</option>
|
|
<option value="raw_custom">RAW_CUSTOM</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Received hops
|
|
<input data-field="hops" value="all" placeholder="all, 5+, 2-6, or 3">
|
|
</label>
|
|
<label>
|
|
Channel (optional)
|
|
<input data-field="channel" placeholder="*, #rgdata, public, hash:A7, or key">
|
|
</label>
|
|
<label>
|
|
Original incoming scope
|
|
<input data-field="incoming" list="policy-incoming-options" value="any" placeholder="any">
|
|
<datalist id="policy-incoming-options">
|
|
<option value="any"></option>
|
|
<option value="none"></option>
|
|
<option value="scoped"></option>
|
|
<option value="allowed"></option>
|
|
<option value="unknown"></option>
|
|
<option value="scope:usa"></option>
|
|
<option value="region:west"></option>
|
|
</datalist>
|
|
</label>
|
|
<label>
|
|
Path matcher
|
|
<select data-field="path-kind">
|
|
<option value="none">No path condition</option>
|
|
<option value="prefix">Ordered 1/2/3-byte pbyte prefix</option>
|
|
<option value="blacklist">Passive blacklist</option>
|
|
<option value="bucket:1">Path bucket 1</option>
|
|
<option value="bucket:2">Path bucket 2</option>
|
|
<option value="bucket:3">Path bucket 3</option>
|
|
<option value="bucket:4">Path bucket 4</option>
|
|
<option value="bucket:5">Path bucket 5</option>
|
|
<option value="bucket:6">Path bucket 6</option>
|
|
<option value="loop:strict">Own-ID loop: strict</option>
|
|
<option value="loop:moderate">Own-ID loop: moderate</option>
|
|
<option value="loop:minimal">Own-ID loop: minimal</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Ordered pbyte prefix
|
|
<input data-field="path-prefix" placeholder="86, 860C, or 860C,12A4">
|
|
</label>
|
|
<label>
|
|
Decrypted sender (optional)
|
|
<input data-field="sender" maxlength="31" placeholder="Noisy User">
|
|
</label>
|
|
<label>
|
|
Traffic path (firmware mode)
|
|
<select data-field="via">
|
|
<option value="radio">Normal radio forwarding</option>
|
|
<option value="bridge">Bridge entry/exit</option>
|
|
<option value="cross">Radio profile crossover</option>
|
|
<option value="bridge,cross">Bridge and crossover</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Temporary-radio state
|
|
<select data-field="temp-radio">
|
|
<option value="any">Either state</option>
|
|
<option value="inactive">Inactive</option>
|
|
<option value="active">Active</option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
|
|
<h3>Common actions</h3>
|
|
<p class="filter-field-help">
|
|
Choosing a phase-specific action automatically selects a compatible
|
|
phase and ACL owner. Open the advanced section to inspect or override
|
|
those choices.
|
|
</p>
|
|
<div class="filter-form-grid">
|
|
<label>
|
|
Forwarding verdict
|
|
<select data-field="verdict">
|
|
<option value="continue">No verdict change</option>
|
|
<option value="drop">Drop / do not retransmit</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Region-gate decision
|
|
<select data-field="scope-gate">
|
|
<option value="unchanged">Leave global gate unchanged</option>
|
|
<option value="require_allowed">Require original allowed region</option>
|
|
<option value="bypass_global">Bypass global gate for this packet</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Scope rewrite target
|
|
<select data-field="target-kind">
|
|
<option value="none">Do not rewrite scope</option>
|
|
<option value="scope">Regionless public scope</option>
|
|
<option value="region">Configured region</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Target name
|
|
<input data-field="target" placeholder="BlackHole86">
|
|
</label>
|
|
<label>
|
|
Token rate per minute (optional)
|
|
<input data-field="rate" type="number" min="1" max="65534" inputmode="numeric" placeholder="unlimited">
|
|
</label>
|
|
<label>
|
|
Burst tokens
|
|
<input data-field="burst" type="number" min="1" max="65534" inputmode="numeric" placeholder="defaults to rate">
|
|
</label>
|
|
<label>
|
|
Rewrite timing
|
|
<select data-field="timing">
|
|
<option value="inherit">Inherit normal behavior</option>
|
|
<option value="fast">Fast-track rewrite</option>
|
|
<option value="normal">Normal queue timing</option>
|
|
<option value="slow">Slow receive/transmit timing</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Queue priority
|
|
<select data-field="queue">
|
|
<option value="inherit">Inherit</option>
|
|
<option value="high">High</option>
|
|
<option value="normal">Normal</option>
|
|
<option value="low">Low</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Retry path bucket
|
|
<select data-field="retry-bucket">
|
|
<option value="none">No retry action</option>
|
|
<option value="bucket:1">Bucket 1</option>
|
|
<option value="bucket:2">Bucket 2</option>
|
|
<option value="bucket:3">Bucket 3</option>
|
|
<option value="bucket:4">Bucket 4</option>
|
|
<option value="bucket:5">Bucket 5</option>
|
|
<option value="bucket:6">Bucket 6</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Retry attempts
|
|
<input data-field="retry-attempts" type="number" min="1" max="10" inputmode="numeric" placeholder="1">
|
|
</label>
|
|
<label>
|
|
Decision tag (optional)
|
|
<input data-field="tag" maxlength="24" placeholder="blackhole-ingress">
|
|
</label>
|
|
</div>
|
|
|
|
<details class="filter-advanced">
|
|
<summary>Advanced execution, ownership, and flood route</summary>
|
|
<p class="filter-field-help">
|
|
Direct packets already carry a supplied path and are intentionally
|
|
outside this engine. The route condition below only distinguishes
|
|
unscoped floods from transport-scoped floods.
|
|
</p>
|
|
<div class="filter-form-grid">
|
|
<label>
|
|
Stable rule ID
|
|
<input data-field="id" value="rule-1" maxlength="32" placeholder="blackhole-rewrite">
|
|
</label>
|
|
<label>
|
|
Processing phase
|
|
<select data-field="phase">
|
|
<option value="scope_gate">1 - Incoming scope gate</option>
|
|
<option value="rewrite">2 - Scope rewrite</option>
|
|
<option value="forward">3 - Forwarding decision</option>
|
|
<option value="content">4 - Decrypted content</option>
|
|
<option value="schedule">5 - Scheduling and retry</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Rule owner / capability
|
|
<select data-field="owner">
|
|
<option value="scope">ACL 4 - Region/scope manager</option>
|
|
<option value="filter">ACL 5 - Filter manager</option>
|
|
<option value="admin">Administrator</option>
|
|
<option value="system">Firmware-managed system rule</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Priority
|
|
<input data-field="priority" type="number" min="0" max="255" inputmode="numeric" value="100">
|
|
</label>
|
|
<label>
|
|
Mode
|
|
<select data-field="mode">
|
|
<option value="active">Active</option>
|
|
<option value="shadow">Shadow - observe only</option>
|
|
<option value="disabled">Disabled</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Rule processing after a match
|
|
<select data-field="stop">
|
|
<option value="none">Continue to later rules</option>
|
|
<option value="phase">Skip later rules in this phase</option>
|
|
<option value="policy">Skip all later policy rules</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Flood route
|
|
<select data-field="route">
|
|
<option value="flood">Either flood route</option>
|
|
<option value="unscoped_flood">Unscoped flood only</option>
|
|
<option value="scoped_flood">Transport-scoped flood only</option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
</details>
|
|
|
|
<div class="filter-live-preview">
|
|
<div>
|
|
<span class="filter-preview-label">Readable policy definition</span>
|
|
<code data-role="live-command"></code>
|
|
</div>
|
|
<p data-role="live-explanation"></p>
|
|
<ul class="filter-inline-warnings" data-role="live-warnings" hidden></ul>
|
|
</div>
|
|
|
|
<div class="filter-builder-actions">
|
|
<button class="filter-primary-action" type="button" data-role="save-rule">Add rule to policy</button>
|
|
<button type="button" data-role="copy-live">Copy definition</button>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="filter-panel filter-policy" aria-labelledby="filter-policy-title">
|
|
<div class="filter-panel-heading">
|
|
<div>
|
|
<p class="filter-eyebrow">Policy draft</p>
|
|
<h2 id="filter-policy-title">Rules in execution order</h2>
|
|
</div>
|
|
<button type="button" data-role="clear-policy">Clear policy</button>
|
|
</div>
|
|
<div class="filter-policy-target">
|
|
<label>
|
|
Approximate target budget
|
|
<select data-role="target-profile">
|
|
<option value="stm32">Compact STM32 - 2 KB</option>
|
|
<option value="nrf52" selected>nRF52 - 8 KB</option>
|
|
<option value="esp32">Classic ESP32 - 16 KB</option>
|
|
<option value="esp32_roomy">Roomy ESP32 - 64 KB</option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<p class="filter-field-help">
|
|
Rules match the same immutable packet facts. Ordering is phase, then
|
|
descending priority, then authenticated channel, raw hash, or wildcard
|
|
specificity, then stable rule ID. Drop decisions are sticky.
|
|
</p>
|
|
<div class="filter-empty-state" data-role="empty-policy">
|
|
Add a rule or load an example to start exploring.
|
|
</div>
|
|
<ol class="filter-rule-list" data-role="rule-list"></ol>
|
|
<div class="filter-policy-summary" data-role="policy-summary"></div>
|
|
<ul class="filter-inline-warnings" data-role="policy-warnings" hidden></ul>
|
|
</section>
|
|
</div>
|
|
|
|
<section class="filter-panel filter-simulator" aria-labelledby="filter-simulator-title">
|
|
<div class="filter-panel-heading">
|
|
<div>
|
|
<p class="filter-eyebrow">Immutable packet simulator</p>
|
|
<h2 id="filter-simulator-title">Explain an evaluation</h2>
|
|
</div>
|
|
<button type="button" data-role="reset-packet">Reset packet</button>
|
|
</div>
|
|
<div class="filter-packet-reader">
|
|
<div class="filter-packet-reader-heading">
|
|
<div>
|
|
<h3>Read a raw MeshCore packet</h3>
|
|
<p class="filter-field-help">
|
|
Paste an on-air packet as hexadecimal. The decoder follows the
|
|
<a href="../packet_format/">MeshCore wire format</a>, displays its
|
|
header, route, pbyte path, and clear payload envelope, then loads
|
|
only facts actually present on the wire into the simulator.
|
|
</p>
|
|
</div>
|
|
<span>Runs locally</span>
|
|
</div>
|
|
<label>
|
|
Raw packet hex
|
|
<textarea data-role="raw-packet-input" rows="3" spellcheck="false">014e912ceebb98918b86772df5dacf1bcba9e4127ffffaa8665596aa3e2903a3b1901fdc53497dfca6b5d7df2d771bea68de</textarea>
|
|
</label>
|
|
<div class="filter-builder-actions">
|
|
<button class="filter-primary-action" type="button" data-role="decode-packet">Decode and load packet</button>
|
|
</div>
|
|
<div class="filter-error" data-role="packet-decode-error" role="alert" hidden></div>
|
|
<div class="filter-packet-decode" data-role="packet-decode-result" aria-live="polite" hidden></div>
|
|
</div>
|
|
<div class="filter-form-grid filter-simulator-facts">
|
|
<label>
|
|
Packet traffic path
|
|
<select data-packet="via">
|
|
<option value="radio">Normal radio forwarding</option>
|
|
<option value="bridge">Bridge entry/exit</option>
|
|
<option value="cross">Radio profile crossover</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Received route
|
|
<select data-packet="route">
|
|
<option value="unscoped_flood">Unscoped flood</option>
|
|
<option value="scoped_flood">Transport-scoped flood</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Payload type
|
|
<select data-packet="type">
|
|
<option value="req">REQ</option>
|
|
<option value="response">RESPONSE</option>
|
|
<option value="txt_msg">TXT_MSG</option>
|
|
<option value="ack">ACK</option>
|
|
<option value="advert">ADVERT</option>
|
|
<option value="grp_txt">GRP_TXT</option>
|
|
<option value="grp_data" selected>GRP_DATA</option>
|
|
<option value="anon_req">ANON_REQ</option>
|
|
<option value="path">PATH</option>
|
|
<option value="trace">TRACE</option>
|
|
<option value="multipart">MULTIPART</option>
|
|
<option value="control">CONTROL</option>
|
|
<option value="ota">OTA</option>
|
|
<option value="13">Reserved type 13</option>
|
|
<option value="14">Reserved type 14</option>
|
|
<option value="raw_custom">RAW_CUSTOM</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Received hops
|
|
<input data-packet="hops" type="number" min="0" max="63" inputmode="numeric" value="4">
|
|
</label>
|
|
<label>
|
|
Channel
|
|
<input data-packet="channel" value="#rgdata" placeholder="#name, public, hash:A7, key, or blank">
|
|
</label>
|
|
<label>
|
|
Received pbyte path
|
|
<input data-packet="path" value="860C,12A4" placeholder="same-width IDs">
|
|
</label>
|
|
<label>
|
|
Original scope status
|
|
<select data-packet="scope-status">
|
|
<option value="none">Unscoped</option>
|
|
<option value="allowed">Allowed region</option>
|
|
<option value="unknown">Unknown or denied scope</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Original scope name
|
|
<input data-packet="scope-name" placeholder="usa">
|
|
</label>
|
|
<label>
|
|
Resolved region name
|
|
<input data-packet="region-name" placeholder="west">
|
|
</label>
|
|
<label>
|
|
Decrypted sender
|
|
<input data-packet="sender" placeholder="Noisy User">
|
|
</label>
|
|
<label>
|
|
Passive blacklist result
|
|
<select data-packet="blacklist">
|
|
<option value="no">No match</option>
|
|
<option value="yes">Matched</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Matching path buckets
|
|
<input data-packet="buckets" placeholder="1,3,6">
|
|
</label>
|
|
<label>
|
|
Own-ID loop result
|
|
<select data-packet="loop-level">
|
|
<option value="0">No loop match</option>
|
|
<option value="1">Strict only</option>
|
|
<option value="2">Moderate and strict</option>
|
|
<option value="3">Minimal, moderate, and strict</option>
|
|
</select>
|
|
</label>
|
|
<label class="filter-simulator-check">
|
|
<input data-packet="temp-radio" type="checkbox">
|
|
Temporary radio is active
|
|
</label>
|
|
</div>
|
|
<div class="filter-builder-actions">
|
|
<button class="filter-primary-action" type="button" data-role="simulate">Run policy simulation</button>
|
|
</div>
|
|
<div class="filter-error" data-role="simulation-error" role="alert" hidden></div>
|
|
<div class="filter-decision" data-role="simulation-result" hidden></div>
|
|
</section>
|
|
|
|
<section class="filter-panel filter-import" aria-labelledby="filter-import-title">
|
|
<div class="filter-panel-heading">
|
|
<div>
|
|
<p class="filter-eyebrow">Import and explain</p>
|
|
<h2 id="filter-import-title">Paste readable policy or a saved draft</h2>
|
|
</div>
|
|
</div>
|
|
<p class="filter-field-help">
|
|
Accepts one-line <code>policy set ... when ... do ...</code> definitions,
|
|
playground JSON, or a playground Base64 bundle.
|
|
</p>
|
|
<textarea data-role="import-input" spellcheck="false" placeholder="policy set rgdata-scope phase=rewrite owner=scope priority=150 when route=flood type=grp_data hops=all channel=#rgdata rx.scope=none do scope=#BlackHole86 timing=fast"></textarea>
|
|
<div class="filter-builder-actions">
|
|
<button class="filter-primary-action" type="button" data-role="explain-input">Explain input</button>
|
|
<button type="button" data-role="load-input">Load into builder</button>
|
|
</div>
|
|
<div class="filter-error" data-role="import-error" role="alert" hidden></div>
|
|
<div class="filter-explain-results" data-role="explain-results" hidden></div>
|
|
</section>
|
|
|
|
<section class="filter-panel filter-export" aria-labelledby="filter-export-title">
|
|
<div class="filter-panel-heading">
|
|
<div>
|
|
<p class="filter-eyebrow">Export</p>
|
|
<h2 id="filter-export-title">Move or save this design</h2>
|
|
</div>
|
|
</div>
|
|
<div class="filter-export-tabs" role="tablist" aria-label="Policy export format">
|
|
<button type="button" data-export-tab="dsl" aria-selected="true">Readable policy</button>
|
|
<button type="button" data-export-tab="json" aria-selected="false">Policy JSON</button>
|
|
<button type="button" data-export-tab="bundle" aria-selected="false">Playground Base64</button>
|
|
</div>
|
|
<div data-export-panel="dsl">
|
|
<p class="filter-field-help">Proposed human-readable definition. Current firmware does not accept it yet.</p>
|
|
<textarea data-role="export-dsl" readonly spellcheck="false"></textarea>
|
|
</div>
|
|
<div data-export-panel="json" hidden>
|
|
<p class="filter-field-help">Structured draft used by this page.</p>
|
|
<textarea data-role="export-json" readonly spellcheck="false"></textarea>
|
|
</div>
|
|
<div data-export-panel="bundle" hidden>
|
|
<p class="filter-field-help">Browser-playground interchange only. It is not the final packed firmware codec.</p>
|
|
<textarea data-role="export-bundle" readonly spellcheck="false"></textarea>
|
|
</div>
|
|
<div class="filter-builder-actions">
|
|
<button type="button" data-role="copy-export">Copy visible export</button>
|
|
<button type="button" data-role="download-json">Download JSON</button>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
|
|
<h2 id="payload-type-reference">Payload type reference</h2>
|
|
<p>Use an exact <code>type=</code> value when a rule should match only one payload type.
|
|
The class column shows which broader selector also matches it.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th><code>type=</code> value</th>
|
|
<th>Payload</th>
|
|
<th>Class</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>req</code></td>
|
|
<td>Request</td>
|
|
<td><code>class:login</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>response</code></td>
|
|
<td>Response</td>
|
|
<td><code>class:login</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>txt_msg</code></td>
|
|
<td>Peer text message</td>
|
|
<td><code>class:login</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ack</code></td>
|
|
<td>Acknowledgment</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>advert</code></td>
|
|
<td>Node advertisement</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>grp_txt</code></td>
|
|
<td>Group-channel text</td>
|
|
<td><code>class:group</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>grp_data</code></td>
|
|
<td>Group-channel datagram</td>
|
|
<td><code>class:group</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>anon_req</code></td>
|
|
<td>Anonymous request</td>
|
|
<td><code>class:login</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>path</code></td>
|
|
<td>Returned path</td>
|
|
<td><code>class:login</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>trace</code></td>
|
|
<td>Path trace</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>multipart</code></td>
|
|
<td>One frame in a multipart sequence</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>control</code></td>
|
|
<td>Control or discovery data</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ota</code></td>
|
|
<td>OTA-over-LoRa data</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>13</code></td>
|
|
<td>Reserved payload type 13</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>14</code></td>
|
|
<td>Reserved payload type 14</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>raw_custom</code></td>
|
|
<td>Application-defined raw data</td>
|
|
<td><code>class:other</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2 id="current-fpf7-command-mapping">Current FPF7 command mapping</h2>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Firmware command</th>
|
|
<th>FPF7 role</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>fr</code> / <code>flood.rule</code> / <code>flood.filter</code></td>
|
|
<td>Forward-phase match and action rows</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>flood.channel.data</code></td>
|
|
<td>Compatibility view over one visible <code>type=grp_data</code> forward drop row</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>flood.channel.scope</code></td>
|
|
<td>Scope-rewrite phase rows</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>flood.filter.blacklist</code></td>
|
|
<td>One shared unordered path-ID set referenced by <code>path=blacklist</code> rows</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>Generalized repeaters expose 63 forward rows and commit those sections
|
|
together. The blacklist is useful
|
|
for refusing to retransmit floods associated with internet gateways dumping
|
|
bulk traffic, but a path ID is truncated and unauthenticated; it identifies a
|
|
routing pattern, not a person.</p>
|
|
<p>The firmware accepts both full and short CLI forms for the same forward row:</p>
|
|
<pre><code class="language-text">set flood.rule.3 type=any channel=#wardriving hops=all mode=bridge,cross drop
|
|
set fr.3 any c=#wardriving m=bc d
|
|
</code></pre>
|
|
<p>Use <code>get fr.3</code> on the device to obtain a short setter ready to copy. This CLI
|
|
syntax is separate from the playground's proposed policy/bundle format.
|
|
See the <a href="../flood_filtering/#shorthand-for-copying-rules">shorthand reference</a>.</p>
|
|
<h2 id="proposed-evaluation-contract">Proposed evaluation contract</h2>
|
|
<p>The simulator uses these rules:</p>
|
|
<ol>
|
|
<li>Only flood retransmission enters the policy. Direct routing and local packet
|
|
delivery remain outside it.</li>
|
|
<li>Every matcher reads the same immutable receive-time packet facts.</li>
|
|
<li>Rules run by phase and descending numeric priority. At an equal priority,
|
|
authenticated channel matches run before raw one-byte hash matches, which
|
|
run before wildcard channel matches; stable rule ID breaks the remaining
|
|
tie. An explicitly higher numeric priority overrides channel specificity.</li>
|
|
<li>A drop decision is sticky and cannot be undone by a later rule.</li>
|
|
<li>The first matching scope, timing, queue, and retry action in execution order
|
|
wins.</li>
|
|
<li>All matching token-bucket rate constraints remain attached to the decision.</li>
|
|
<li><code>stop=phase</code> skips later rules in that phase. <code>stop=policy</code> skips later
|
|
configurable rules, but never mandatory packet validation or radio safety.</li>
|
|
<li>Shadow rules report what they would do without changing the decision or
|
|
stopping other rules.</li>
|
|
<li>Expensive facts such as channel-key matching, decryption, and path-table
|
|
lookup are resolved once per packet and reused by every matching rule.</li>
|
|
</ol>
|
|
<p>The byte-budget display is deliberately approximate until the packed firmware
|
|
codec exists. It demonstrates why simple mappings should not reserve a maximum-
|
|
sized structure for every possible condition and action.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
|
|
|
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-copyright">
|
|
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
|
|
|
|
|
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
|
|
|
|
<script src="../_javascript/firmware_picker.js"></script>
|
|
|
|
<script src="../_javascript/telemetry_decoder.js"></script>
|
|
|
|
<script src="../_javascript/filter_tool.js"></script>
|
|
|
|
|
|
</body>
|
|
</html> |