Files
infix/dev/wifi/index.html
T

4055 lines
97 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="Infix Documentation">
<link rel="canonical" href="https://kernelkit.github.io/infix/dev/wifi/">
<link rel="prev" href="../vpn-wireguard/">
<link rel="next" href="../discovery/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Wireless LAN (WiFi) - User's Guide</title>
<link rel="stylesheet" href="../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="stylesheet" href="../extra.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>
<link href="../assets/stylesheets/glightbox.min.css" rel="stylesheet"><script src="../assets/javascripts/glightbox.min.js"></script><style id="glightbox-style">
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: black; }
.glightbox-clean .gslide-media { -webkit-box-shadow: none; box-shadow: none; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color); }
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color); }
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color); }
</style></head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange">
<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="#wi-fi-wireless-lan" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden="">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://www.kernelkit.org/" title="User's Guide" class="md-header__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" 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"></path></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">
User's Guide
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Wireless LAN (WiFi)
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden="">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"></path></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden="">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"></path></svg>
</label>
</form>
<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"></path></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"></path></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"></path></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard="" data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"></path></svg>
</a>
<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"></path></svg>
</button>
</nav>
</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/kernelkit/infix/" 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"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</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="https://www.kernelkit.org/" title="User's Guide" class="md-nav__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" alt="logo">
</a>
User's Guide
</label>
<div class="md-nav__source">
<a href="https://github.com/kernelkit/infix/" 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"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</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 md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2">
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
CLI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
CLI
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../cli/introduction/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/configure/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/keybindings/" class="md-nav__link">
<span class="md-ellipsis">
Keybindings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/netcalc/" class="md-nav__link">
<span class="md-ellipsis">
Network Calculator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/tcpdump/" class="md-nav__link">
<span class="md-ellipsis">
Network Monitoring
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/quick/" class="md-nav__link">
<span class="md-ellipsis">
Quickstart Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/text-editor/" class="md-nav__link">
<span class="md-ellipsis">
Text Editor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrading
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../container/" class="md-nav__link">
<span class="md-ellipsis">
Docker Containers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked="">
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Networking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Networking
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../networking/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../iface/" class="md-nav__link">
<span class="md-ellipsis">
Common Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bridging/" class="md-nav__link">
<span class="md-ellipsis">
Bridging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lag/" class="md-nav__link">
<span class="md-ellipsis">
Link Aggregation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ethernet/" class="md-nav__link">
<span class="md-ellipsis">
Ethernet Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vlan/" class="md-nav__link">
<span class="md-ellipsis">
VLAN Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ip/" class="md-nav__link">
<span class="md-ellipsis">
IP Addressing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../routing/" class="md-nav__link">
<span class="md-ellipsis">
Routing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firewall/" class="md-nav__link">
<span class="md-ellipsis">
Firewall Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qos/" class="md-nav__link">
<span class="md-ellipsis">
Quality of Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../eth-counters/" class="md-nav__link">
<span class="md-ellipsis">
RMON Counters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tunnels/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling (L2/L3)
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13">
<label class="md-nav__link" for="__nav_4_13" id="__nav_4_13_label" tabindex="0">
<span class="md-ellipsis">
VPN Tunnels
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_13">
<span class="md-nav__icon md-icon"></span>
VPN Tunnels
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../vpn/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vpn-wireguard/" class="md-nav__link">
<span class="md-ellipsis">
WireGuard
</span>
</a>
</li>
</ul>
</nav>
</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">
Wireless LAN (WiFi)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Wireless LAN (WiFi)
</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="#architecture-overview" class="md-nav__link">
<span class="md-ellipsis">
Architecture Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-conventions" class="md-nav__link">
<span class="md-ellipsis">
Naming Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#current-limitations" class="md-nav__link">
<span class="md-ellipsis">
Current Limitations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#supported-wi-fi-adapters" class="md-nav__link">
<span class="md-ellipsis">
Supported Wi-Fi Adapters
</span>
</a>
<nav class="md-nav" aria-label="Supported Wi-Fi Adapters">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#known-working-chipsets" class="md-nav__link">
<span class="md-ellipsis">
Known Working Chipsets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#usb-wifi-dongles" class="md-nav__link">
<span class="md-ellipsis">
USB WiFi Dongles
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#radio-configuration" class="md-nav__link">
<span class="md-ellipsis">
Radio Configuration
</span>
</a>
<nav class="md-nav" aria-label="Radio Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#country-code" class="md-nav__link">
<span class="md-ellipsis">
Country Code ⚠
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#basic-radio-setup" class="md-nav__link">
<span class="md-ellipsis">
Basic Radio Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bands-and-channels" class="md-nav__link">
<span class="md-ellipsis">
Bands and Channels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wifi-6-support" class="md-nav__link">
<span class="md-ellipsis">
WiFi 6 Support
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#discovering-available-networks" class="md-nav__link">
<span class="md-ellipsis">
Discovering Available Networks
</span>
</a>
<nav class="md-nav" aria-label="Discovering Available Networks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enable-background-scanning" class="md-nav__link">
<span class="md-ellipsis">
Enable Background Scanning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#view-available-networks" class="md-nav__link">
<span class="md-ellipsis">
View Available Networks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#passphrase-requirements" class="md-nav__link">
<span class="md-ellipsis">
Passphrase Requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#station-mode-client" class="md-nav__link">
<span class="md-ellipsis">
Station Mode (Client)
</span>
</a>
<nav class="md-nav" aria-label="Station Mode (Client)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#step-1-configure-password" class="md-nav__link">
<span class="md-ellipsis">
Step 1: Configure Password
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-2-connect-to-network" class="md-nav__link">
<span class="md-ellipsis">
Step 2: Connect to Network
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#access-point-mode" class="md-nav__link">
<span class="md-ellipsis">
Access Point Mode
</span>
</a>
<nav class="md-nav" aria-label="Access Point Mode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#basic-ap-configuration" class="md-nav__link">
<span class="md-ellipsis">
Basic AP Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssid-hiding" class="md-nav__link">
<span class="md-ellipsis">
SSID Hiding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multi-ssid-configuration" class="md-nav__link">
<span class="md-ellipsis">
Multi-SSID Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fast-roaming-between-access-points" class="md-nav__link">
<span class="md-ellipsis">
Fast Roaming Between Access Points
</span>
</a>
<nav class="md-nav" aria-label="Fast Roaming Between Access Points">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#80211r-fast-bss-transition" class="md-nav__link">
<span class="md-ellipsis">
802.11r - Fast BSS Transition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#80211k-radio-resource-management" class="md-nav__link">
<span class="md-ellipsis">
802.11k - Radio Resource Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#80211v-bss-transition-management" class="md-nav__link">
<span class="md-ellipsis">
802.11v - BSS Transition Management
</span>
</a>
<nav class="md-nav" aria-label="802.11v - BSS Transition Management">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#band-steering-mbo" class="md-nav__link">
<span class="md-ellipsis">
Band Steering (MBO)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#opportunistic-key-caching-okc" class="md-nav__link">
<span class="md-ellipsis">
Opportunistic Key Caching (OKC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#recommended-configuration" class="md-nav__link">
<span class="md-ellipsis">
Recommended Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#80211s-mesh-point-mode" class="md-nav__link">
<span class="md-ellipsis">
802.11s Mesh Point Mode
</span>
</a>
<nav class="md-nav" aria-label="802.11s Mesh Point Mode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#80211s-vs-easymesh" class="md-nav__link">
<span class="md-ellipsis">
802.11s vs EasyMesh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-configuration" class="md-nav__link">
<span class="md-ellipsis">
Mesh configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-portal-bridge-integration" class="md-nav__link">
<span class="md-ellipsis">
Mesh portal (bridge integration)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-with-roaming-aps" class="md-nav__link">
<span class="md-ellipsis">
Mesh with roaming APs
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5">
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../discovery/" class="md-nav__link">
<span class="md-ellipsis">
Device Discovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dhcp/" class="md-nav__link">
<span class="md-ellipsis">
DHCP Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ntp/" class="md-nav__link">
<span class="md-ellipsis">
NTP Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ptp/" class="md-nav__link">
<span class="md-ellipsis">
PTP (IEEE 1588/802.1AS)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6">
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
System
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
System
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../boot/" class="md-nav__link">
<span class="md-ellipsis">
Boot Procedure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../system/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nacm/" class="md-nav__link">
<span class="md-ellipsis">
Access Control (NACM)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware/" class="md-nav__link">
<span class="md-ellipsis">
Hardware Info &amp; Status
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../management/" class="md-nav__link">
<span class="md-ellipsis">
Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../keystore/" class="md-nav__link">
<span class="md-ellipsis">
Keystore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../syslog/" class="md-nav__link">
<span class="md-ellipsis">
Syslog Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../support/" class="md-nav__link">
<span class="md-ellipsis">
Support Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Scripting
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Scripting
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../scripting/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-sysrepocfg/" class="md-nav__link">
<span class="md-ellipsis">
Legacy Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-netconf/" class="md-nav__link">
<span class="md-ellipsis">
NETCONF Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-restconf/" class="md-nav__link">
<span class="md-ellipsis">
RESTCONF Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-prod/" class="md-nav__link">
<span class="md-ellipsis">
Production Testing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8">
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Developer's Corner
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Developer's Corner
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a href="../branding/" class="md-nav__link">
<span class="md-ellipsis">
Branding &amp; Releases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../developers-guide/" class="md-nav__link">
<span class="md-ellipsis">
Developer's Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../override-package/" class="md-nav__link">
<span class="md-ellipsis">
Developing with Buildroot
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../netboot/" class="md-nav__link">
<span class="md-ellipsis">
Netboot HowTo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Regression Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../test-arch/" class="md-nav__link">
<span class="md-ellipsis">
Test System Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../virtual/" class="md-nav__link">
<span class="md-ellipsis">
Virtual Environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vpd/" class="md-nav__link">
<span class="md-ellipsis">
Vital Product Data (VPD)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../license/" class="md-nav__link">
<span class="md-ellipsis">
Origin &amp; Licensing
</span>
</a>
</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="#architecture-overview" class="md-nav__link">
<span class="md-ellipsis">
Architecture Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-conventions" class="md-nav__link">
<span class="md-ellipsis">
Naming Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#current-limitations" class="md-nav__link">
<span class="md-ellipsis">
Current Limitations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#supported-wi-fi-adapters" class="md-nav__link">
<span class="md-ellipsis">
Supported Wi-Fi Adapters
</span>
</a>
<nav class="md-nav" aria-label="Supported Wi-Fi Adapters">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#known-working-chipsets" class="md-nav__link">
<span class="md-ellipsis">
Known Working Chipsets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#usb-wifi-dongles" class="md-nav__link">
<span class="md-ellipsis">
USB WiFi Dongles
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#radio-configuration" class="md-nav__link">
<span class="md-ellipsis">
Radio Configuration
</span>
</a>
<nav class="md-nav" aria-label="Radio Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#country-code" class="md-nav__link">
<span class="md-ellipsis">
Country Code ⚠
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#basic-radio-setup" class="md-nav__link">
<span class="md-ellipsis">
Basic Radio Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bands-and-channels" class="md-nav__link">
<span class="md-ellipsis">
Bands and Channels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wifi-6-support" class="md-nav__link">
<span class="md-ellipsis">
WiFi 6 Support
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#discovering-available-networks" class="md-nav__link">
<span class="md-ellipsis">
Discovering Available Networks
</span>
</a>
<nav class="md-nav" aria-label="Discovering Available Networks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enable-background-scanning" class="md-nav__link">
<span class="md-ellipsis">
Enable Background Scanning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#view-available-networks" class="md-nav__link">
<span class="md-ellipsis">
View Available Networks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#passphrase-requirements" class="md-nav__link">
<span class="md-ellipsis">
Passphrase Requirements
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#station-mode-client" class="md-nav__link">
<span class="md-ellipsis">
Station Mode (Client)
</span>
</a>
<nav class="md-nav" aria-label="Station Mode (Client)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#step-1-configure-password" class="md-nav__link">
<span class="md-ellipsis">
Step 1: Configure Password
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-2-connect-to-network" class="md-nav__link">
<span class="md-ellipsis">
Step 2: Connect to Network
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#access-point-mode" class="md-nav__link">
<span class="md-ellipsis">
Access Point Mode
</span>
</a>
<nav class="md-nav" aria-label="Access Point Mode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#basic-ap-configuration" class="md-nav__link">
<span class="md-ellipsis">
Basic AP Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssid-hiding" class="md-nav__link">
<span class="md-ellipsis">
SSID Hiding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multi-ssid-configuration" class="md-nav__link">
<span class="md-ellipsis">
Multi-SSID Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fast-roaming-between-access-points" class="md-nav__link">
<span class="md-ellipsis">
Fast Roaming Between Access Points
</span>
</a>
<nav class="md-nav" aria-label="Fast Roaming Between Access Points">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#80211r-fast-bss-transition" class="md-nav__link">
<span class="md-ellipsis">
802.11r - Fast BSS Transition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#80211k-radio-resource-management" class="md-nav__link">
<span class="md-ellipsis">
802.11k - Radio Resource Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#80211v-bss-transition-management" class="md-nav__link">
<span class="md-ellipsis">
802.11v - BSS Transition Management
</span>
</a>
<nav class="md-nav" aria-label="802.11v - BSS Transition Management">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#band-steering-mbo" class="md-nav__link">
<span class="md-ellipsis">
Band Steering (MBO)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#opportunistic-key-caching-okc" class="md-nav__link">
<span class="md-ellipsis">
Opportunistic Key Caching (OKC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#recommended-configuration" class="md-nav__link">
<span class="md-ellipsis">
Recommended Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#80211s-mesh-point-mode" class="md-nav__link">
<span class="md-ellipsis">
802.11s Mesh Point Mode
</span>
</a>
<nav class="md-nav" aria-label="802.11s Mesh Point Mode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#80211s-vs-easymesh" class="md-nav__link">
<span class="md-ellipsis">
802.11s vs EasyMesh
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-configuration" class="md-nav__link">
<span class="md-ellipsis">
Mesh configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-portal-bridge-integration" class="md-nav__link">
<span class="md-ellipsis">
Mesh portal (bridge integration)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mesh-with-roaming-aps" class="md-nav__link">
<span class="md-ellipsis">
Mesh with roaming APs
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation">
<ol class="md-path__list">
<li class="md-path__item">
<a href=".." class="md-path__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-path__item">
<a href="../networking/" class="md-path__link">
<span class="md-ellipsis">
Networking
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<h1 id="wi-fi-wireless-lan">Wi-Fi (Wireless LAN)<a class="headerlink" href="#wi-fi-wireless-lan" title="Permanent link"></a></h1>
<p>Infix includes comprehensive Wi-Fi support for both client (Station) and
Access Point modes. When a compatible Wi-Fi adapter is detected, the system
automatically creates a WiFi radio (PHY) in factory-config, that can
host virtual interfaces.</p>
<h2 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link"></a></h2>
<p>Infix uses a two-layer WiFi architecture:</p>
<ol>
<li>
<p><strong>WiFi Radio (PHY layer)</strong>: Represents the physical wireless hardware</p>
<ul>
<li>Configured via <code>ietf-hardware</code> module</li>
<li>Controls channel, transmit power, regulatory domain</li>
<li>One radio can host multiple virtual interfaces</li>
</ul>
</li>
<li>
<p><strong>WiFi Interface (Network layer)</strong>: Virtual interface on a radio</p>
<ul>
<li>Configured via <code>infix-interfaces</code> module</li>
<li>Can operate in Station (client) or Access Point mode</li>
<li>Each interface references a parent radio</li>
</ul>
</li>
</ol>
<h2 id="naming-conventions">Naming Conventions<a class="headerlink" href="#naming-conventions" title="Permanent link"></a></h2>
<p>Like other interface types in Infix, WiFi components follow naming conventions
that allow the CLI to automatically infer types:</p>
<table>
<thead>
<tr>
<th><strong>Name Pattern</strong></th>
<th><strong>Type</strong></th>
<th><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>radioN</code></td>
<td>WiFi Radio</td>
<td>Hardware component for WiFi PHY</td>
</tr>
<tr>
<td><code>wifiN</code></td>
<td>WiFi Interface</td>
<td>Virtual WiFi interface on a radio</td>
</tr>
</tbody>
</table>
<p>Where <code>N</code> is a number (0, 1, 2, ...).</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Using these naming conventions simplifies configuration since type/class
settings are automatically inferred. For example, creating a hardware
component named <code>radio0</code> automatically sets its class to <code>wifi</code>, enabling
the <code>wifi-radio</code> configuration container.</p>
<p><strong>Note:</strong> This inference only works with the CLI. Configuring WiFi over
NETCONF or RESTCONF requires setting the class/type explicitly.</p>
</div>
<h2 id="current-limitations">Current Limitations<a class="headerlink" href="#current-limitations" title="Permanent link"></a></h2>
<ul>
<li>USB hotplug is not supported - adapters must be present at boot</li>
<li>Interface naming may be inconsistent with multiple USB Wi-Fi adapters</li>
<li>AP and Station modes cannot be mixed on the same radio</li>
</ul>
<h2 id="supported-wi-fi-adapters">Supported Wi-Fi Adapters<a class="headerlink" href="#supported-wi-fi-adapters" title="Permanent link"></a></h2>
<p>Wi-Fi support is primarily tested with Realtek chipset-based adapters.</p>
<h3 id="known-working-chipsets">Known Working Chipsets<a class="headerlink" href="#known-working-chipsets" title="Permanent link"></a></h3>
<ul>
<li>Built-in Wi-Fi on Banana Pi BPi-R3</li>
<li>Built-in Wi-Fi on Raspberry Pi 4/CM4</li>
<li>Realtek:<ul>
<li>RTL8188CU</li>
<li>RTL8188FU</li>
<li>RTL8821CU</li>
</ul>
</li>
</ul>
<p>Other Realtek chipsets may work but are not tested.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Some Realtek chipsets require proprietary drivers not included in the
standard kernel.</p>
<ul>
<li>Firmware requirements vary by chipset</li>
<li>Check kernel logs if your adapter is not detected</li>
</ul>
</div>
<h3 id="usb-wifi-dongles">USB WiFi Dongles<a class="headerlink" href="#usb-wifi-dongles" title="Permanent link"></a></h3>
<p>USB WiFi dongles may be slow to initialize at boot due to firmware
loading. If your USB dongle is not detected reliably, configure a
<code>probe-timeout</code> on the radio to wait for the PHY:</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio0 wifi-radio</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set probe-timeout 30</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p>This waits up to 30 seconds for the radio PHY to appear before creating
WiFi interfaces. If the PHY is not detected within the timeout, a dummy
interface is created as a placeholder, allowing IP configuration to proceed.
Reboot when the radio becomes available.</p>
<h2 id="radio-configuration">Radio Configuration<a class="headerlink" href="#radio-configuration" title="Permanent link"></a></h2>
<p>Before configuring WiFi interfaces, you must first configure the WiFi radio.
Radios are automatically discovered and named <code>radio0</code>, <code>radio1</code>, etc.</p>
<h3 id="country-code">Country Code ⚠<a class="headerlink" href="#country-code" title="Permanent link"></a></h3>
<p>The radio defaults to "00" for World domain, but some systems may ship with a
factory default country code (typically "DE" for the BPi-R3).</p>
<div class="admonition tip">
<p class="admonition-title">Legal notice!</p>
<p>The <code>country-code</code> setting is <strong>legally required</strong> and determines
which WiFi channels and power levels are permitted in your
location. Using an incorrect country code may violate local wireless
regulations.</p>
</div>
<p><strong>Common country codes, see <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a> for the complete list</strong>:</p>
<ul>
<li>Europe:<ul>
<li>DE: Germany</li>
<li>SE: Sweden</li>
<li>GB: UK</li>
<li>FR: France</li>
<li>ES: Spain</li>
</ul>
</li>
<li>Americas:<ul>
<li>US: United States</li>
<li>CA: Canada</li>
<li>BR: Brazil</li>
</ul>
</li>
<li>Asia-Pacific:<ul>
<li>JP: Japan</li>
<li>AU: Australia</li>
<li>CN: China</li>
</ul>
</li>
</ul>
<h3 id="basic-radio-setup">Basic Radio Setup<a class="headerlink" href="#basic-radio-setup" title="Permanent link"></a></h3>
<p>Configure the radio with channel, power, and regulatory domain.</p>
<p><strong>For Station (client) mode:</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio0 wifi-radio</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set country-code DE</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p><strong>For Access Point mode:</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio0 wifi-radio</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set country-code DE</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set band 5GHz</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set channel 36</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set channel-width 80MHz</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p><strong>Key radio parameters:</strong></p>
<ul>
<li><code>country-code</code>: Two-letter <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a> code, determines allowed
channels and maximum power. Examples: US, DE, GB, SE, FR, JP.<br>
<strong>⚠ Must match your physical location for legal compliance! ⚠</strong></li>
<li><code>band</code>: 2.4GHz, 5GHz, or 6GHz (required for AP mode). Automatically enables
appropriate WiFi standards:<ul>
<li>2.4GHz: 802.11n/ax</li>
<li>5GHz: 802.11n/ac/ax</li>
<li>6GHz: 802.11ax</li>
</ul>
</li>
<li><code>channel</code>: Channel number (1-233) or "auto". When set to "auto", defaults to
channel 6 for 2.4GHz, channel 36 for 5GHz, or channel 37 for 6GHz</li>
<li><code>channel-width</code>: AP channel bandwidth. Supported values are <code>auto</code>, <code>20MHz</code>,
<code>40MHz</code>, <code>80MHz</code>, and <code>160MHz</code>. Wider channels require matching hardware,
regulatory approval, and are only available on 5GHz/6GHz where supported.</li>
<li><code>legacy-rates</code>: Allow legacy 802.11b rates (1, 2, 5.5, 11 Mbps) on 2.4GHz
(default: disabled). Slow 802.11b clients consume excessive airtime and
degrade throughput for all stations, so the rates are normally suppressed.
Enable only when old 2.4GHz-only IoT devices need them to associate. No
effect on 5GHz/6GHz.</li>
<li><code>probe-timeout</code>: Seconds to wait for PHY detection at boot (default: 0). Set
to a non-zero value (e.g., 30) for USB WiFi dongles that are slow to
initialize due to firmware loading</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>TX power is still determined by the driver based on regulatory
constraints and hardware capabilities. Channel width can now be set
explicitly for AP mode, or left at <code>auto</code> to let the driver choose.</p>
</div>
<h3 id="bands-and-channels">Bands and Channels<a class="headerlink" href="#bands-and-channels" title="Permanent link"></a></h3>
<p>Each band strikes a different balance between range and capacity. The
<code>country-code</code> decides which channels are legal in your location; the
lists below are the common allocations, and your regulatory domain may
allow fewer.</p>
<p><strong>2.4 GHz</strong></p>
<p>Channels 1-13 are available in most of the world, 1-11 in the US and
Canada, and 14 in Japan (802.11b only). At 20 MHz only three channels
avoid overlap: 1, 6, and 11. A 40 MHz channel takes up most of the
band, so it is seldom worth using here.</p>
<p>Drawbacks:</p>
<ul>
<li>This is the most crowded band. It is shared with Bluetooth, Zigbee,
cordless phones, microwave ovens, and most of the neighboring Wi-Fi.</li>
<li>Narrow channels and constant contention hold real throughput well
below 5 and 6 GHz.</li>
<li>The upside is range: 2.4 GHz reaches further and passes through walls
better, which keeps it useful for distant clients and 2.4 GHz-only
IoT devices.</li>
</ul>
<p><strong>5 GHz</strong></p>
<p>UNII-1 (channels 36-48) and UNII-3 (149-165) need no radar checks.
UNII-2 (channels 52-64 and 100-144) shares spectrum with radar and
requires DFS. ETSI regions such as the EU do not include UNII-3, so the
only non-DFS 5 GHz channels there are 36-48. This band supports 20, 40,
80, and 160 MHz, so it is the one to use for wide, fast channels.</p>
<p>Drawbacks:</p>
<ul>
<li>Shorter range than 2.4 GHz, and a weaker signal through walls and
floors.</li>
<li>A DFS channel must be monitored for radar for 60 seconds (up to 10
minutes near some weather radars) before the AP may transmit, which
delays start-up. If radar appears later, the AP has to leave the
channel within 10 seconds and avoid it for 30 minutes, dropping
clients during the move.</li>
<li>The widest 80 and 160 MHz channels almost always sit on DFS spectrum,
so the same radar rules apply to them.</li>
</ul>
<p><strong>6 GHz</strong></p>
<p>The FCC regions open 59 channels (1, 5, 9 ... 233) across 5925-7125 MHz.
ETSI regions, including the EU, currently open only the lower part,
5945-6425 MHz (channels 1-93), for indoor use. Clients find networks on
the 15 Preferred Scanning Channels (5, 21, 37 ... 229) spaced every
80 MHz, and <code>auto</code> selects channel 37. There is no DFS in 6 GHz, so
there is no radar start-up delay.</p>
<p>Drawbacks:</p>
<ul>
<li>The shortest range and the weakest wall penetration of the three
bands.</li>
<li>Only Wi-Fi 6E and newer clients can use it; older phones and IoT
devices cannot see the band at all.</li>
<li>AP operation requires WPA3-Personal (SAE) with management frame
protection, so WPA2-only and open networks are rejected.</li>
<li>Indoor power limits cap coverage further.</li>
</ul>
<h3 id="wifi-6-support">WiFi 6 Support<a class="headerlink" href="#wifi-6-support" title="Permanent link"></a></h3>
<p>WiFi 6 (802.11ax) is always enabled in AP mode on all bands, providing improved
performance through features like OFDMA, BSS Coloring, and beamforming.</p>
<p><strong>WiFi 6 Features (always enabled in AP mode on supported radios):</strong></p>
<ul>
<li><strong>OFDMA</strong>: Better multi-user efficiency in dense environments</li>
<li><strong>BSS Coloring</strong>: Reduced interference from neighboring networks</li>
<li><strong>Beamforming</strong>: Improved signal quality and range</li>
</ul>
<p><strong>Requirements:</strong></p>
<ul>
<li>Hardware must support 802.11ax</li>
<li>Client devices must support WiFi 6 for full benefits</li>
<li>Older WiFi 5/4 clients can still connect but won't use WiFi 6 features</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Important</p>
<p>6 GHz AP operation requires WPA3-Personal (SAE) with mandatory
management frame protection. Open networks and WPA2-only AP
configurations are not valid on 6 GHz.</p>
</div>
<h2 id="discovering-available-networks">Discovering Available Networks<a class="headerlink" href="#discovering-available-networks" title="Permanent link"></a></h2>
<p>Before connecting to a WiFi network, you need to discover which networks
are available. Infix automatically scans for networks when a WiFi interface
is created with a radio reference.</p>
<h3 id="enable-background-scanning">Enable Background Scanning<a class="headerlink" href="#enable-background-scanning" title="Permanent link"></a></h3>
<p>To enable scanning without connecting, configure the radio and create a WiFi
interface referencing it:</p>
<p><strong>Step 1: Configure the radio</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio0 wifi-radio</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set country-code DE</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p><strong>Step 2: Create WiFi interface with radio reference only</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit interface wifi0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi radio radio0</b>
admin@example:/config/interface/wifi0/&gt; <b>leave</b>
</code></pre>
<p>The system will now start scanning in the background. The interface will
operate in scan-only mode until you configure a specific mode (station or
access-point).</p>
<h3 id="view-available-networks">View Available Networks<a class="headerlink" href="#view-available-networks" title="Permanent link"></a></h3>
<p>Use <code>show interface</code> to see discovered networks and their signal strength:</p>
<pre class="cli"><code>admin@example:/&gt; <b>show interface wifi0</b>
name : wifi0
type : wifi
index : 3
mtu : 1500
operational status : up
ip forwarding : enabled
physical address : f0:09:0d:36:5f:86
ipv4 addresses : 192.168.1.100/24 (dhcp)
ipv6 addresses :
in-octets : 148388
out-octets : 24555
mode : station
ssid : MyNetwork
signal : -45 dBm (good)
rx bitrate : 72.2 Mbps
tx bitrate : 86.6 Mbps
──────────────────────────────────────────────────────────────────────
<span class="title">Available Networks</span>
<span class="header">SSID BSSID SECURITY SIGNAL CHANNEL</span>
MyNetwork b4:fb:e4:17:b6:a7 WPA2-Personal good 6
GuestWiFi c8:3a:35:12:34:56 WPA2-Personal fair 11
CoffeeShop 00:1a:2b:3c:4d:5e Open bad 1
</code></pre>
<p>In the CLI, signal strength is reported as: excellent, good, fair or bad.
For precise signal strength values in dBm, use NETCONF or RESTCONF to access
the <code>signal-strength</code> leaf in the operational datastore.</p>
<h2 id="passphrase-requirements">Passphrase Requirements<a class="headerlink" href="#passphrase-requirements" title="Permanent link"></a></h2>
<p>To ensure your connection is secure and compatible with all network
hardware, your passphrase must meet the following criteria:</p>
<ul>
<li>Length: Between 8 and 63 characters</li>
<li>Characters: Use only standard English keyboard characters<ul>
<li>Allowed: Letters (A-Z, a-z), numbers (0-9), and common symbols (e.g., ! @ # $ % ^ &amp; * ( ) _ + - = [ ] { } | ; : ' " , . &lt; &gt; / ? ~)</li>
<li>Spaces: Spaces are allowed, but not at the very beginning or very end of the passphrase</li>
<li>Prohibited: Emojis, accented characters (like á or ñ), and special "control" characters</li>
</ul>
</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Why the limit?</p>
<p>Standard WiFi security (WPA2/WPA3) requires a minimum of 8 characters to
prevent "brute-force" hacking. The character limit ensures your password
works on older routers and various operating systems.<br>
Tips for password strength, see <a href="https://xkcd.com/936/">XKCD #936</a>.</p>
</div>
<h2 id="station-mode-client">Station Mode (Client)<a class="headerlink" href="#station-mode-client" title="Permanent link"></a></h2>
<p>Station mode connects to an existing Wi-Fi network. Before configuring station
mode, follow the "Discovering Available Networks (Scanning)" section above to
scan for available networks and identify the SSID you want to connect to.</p>
<h3 id="step-1-configure-password">Step 1: Configure Password<a class="headerlink" href="#step-1-configure-password" title="Permanent link"></a></h3>
<p>Create a keystore entry for your WiFi password (8-63 characters):</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit keystore symmetric-key my-wifi-key</b>
admin@example:/config/keystore/…/my-wifi-key/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/my-wifi-key/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/keystore/…/my-wifi-key/&gt; <b>leave</b>
</code></pre>
<p>The <code>change</code> command prompts for the passphrase interactively and
handles the base64 encoding required by the keystore automatically.</p>
<h3 id="step-2-connect-to-network">Step 2: Connect to Network<a class="headerlink" href="#step-2-connect-to-network" title="Permanent link"></a></h3>
<p>Configure station mode with the SSID and password to connect:</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit interface wifi0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi station ssid MyHomeNetwork</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi station security secret my-wifi-key</b>
admin@example:/config/interface/wifi0/&gt; <b>leave</b>
</code></pre>
<p>The connection attempt will start immediately. You can verify the connection status:</p>
<pre class="cli"><code>admin@example:/&gt; <b>show interface wifi0</b>
name : wifi0
type : wifi
operational status : up
physical address : f0:09:0d:36:5f:86
mode : station
ssid : MyHomeNetwork
signal : -52 dBm (good)
</code></pre>
<p><strong>Station configuration parameters:</strong></p>
<ul>
<li><code>radio</code>: Reference to the WiFi radio (mandatory) - already set during scanning</li>
<li><code>station ssid</code>: Network name to connect to (mandatory)</li>
<li><code>station security mode</code>:<ul>
<li><code>auto</code>: default, WPA2/WPA3 auto-negotiation</li>
<li><code>disabled</code>: open network</li>
</ul>
</li>
<li><code>station security secret</code>: Reference to keystore entry, required unless mode
is <code>disabled</code></li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The <code>auto</code> security mode automatically selects WPA3-SAE or WPA2-PSK based on
what the access point supports, prioritizing WPA3 for better security.
Certificate-based authentication (802.1X/EAP) is not yet supported.</p>
</div>
<h2 id="access-point-mode">Access Point Mode<a class="headerlink" href="#access-point-mode" title="Permanent link"></a></h2>
<p>Access Point (AP) mode allows your device to create a WiFi network that
other devices can connect to. APs are configured as virtual interfaces on
a WiFi radio.</p>
<h3 id="basic-ap-configuration">Basic AP Configuration<a class="headerlink" href="#basic-ap-configuration" title="Permanent link"></a></h3>
<p>First, ensure the radio is configured (see Radio Configuration above). Then
create a keystore entry for your WiFi password and configure the AP interface:</p>
<p><strong>Step 1: Create keystore entry for the WiFi password</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit keystore symmetric-key my-wifi-secret</b>
admin@example:/config/keystore/…/my-wifi-secret/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/my-wifi-secret/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/keystore/…/my-wifi-secret/&gt; <b>end</b>
</code></pre>
<p><strong>Step 2: Create the AP interface</strong></p>
<pre class="cli"><code>admin@example:/config/&gt; <b>edit interface wifi0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi radio radio0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point ssid MyNetwork</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point security secret my-wifi-secret</b>
admin@example:/config/interface/wifi0/&gt; <b>leave</b>
</code></pre>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Using <code>wifiN</code> as the interface name automatically sets the type to WiFi.
Alternatively, you can use any name and explicitly set <code>type wifi</code>.</p>
</div>
<p><strong>Access Point configuration parameters:</strong></p>
<ul>
<li><code>radio</code>: Reference to the WiFi radio (mandatory)</li>
<li><code>access-point ssid</code>: Network name (SSID) to broadcast</li>
<li><code>access-point hidden</code>: Set to <code>true</code> to hide SSID (optional, default: false)</li>
<li><code>access-point security mode</code>: Security mode (see below)</li>
<li><code>access-point security secret</code>: Reference to keystore entry (for secured networks)</li>
</ul>
<p><strong>Security modes:</strong></p>
<ul>
<li><code>open</code>: No encryption (not recommended)</li>
<li><code>auto</code>: WPA2/WPA3 transitional mode on 2.4/5 GHz, WPA3-only on 6 GHz</li>
<li><code>wpa2-personal</code>: WPA2-PSK (most compatible)</li>
<li><code>wpa3-personal</code>: WPA3-SAE (more secure, requires WPA3-capable clients)</li>
<li><code>wpa2-wpa3-personal</code>: Mixed mode (maximum compatibility)</li>
</ul>
<h3 id="ssid-hiding">SSID Hiding<a class="headerlink" href="#ssid-hiding" title="Permanent link"></a></h3>
<p>To create a hidden network that doesn't broadcast its SSID:</p>
<pre class="cli"><code>admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point hidden true</b>
</code></pre>
<h3 id="multi-ssid-configuration">Multi-SSID Configuration<a class="headerlink" href="#multi-ssid-configuration" title="Permanent link"></a></h3>
<p>Multiple AP interfaces on the same radio allow broadcasting multiple SSIDs,
each with independent security settings. This is useful for guest networks,
IoT devices, or segregating traffic into different VLANs.</p>
<p><strong>Step 1: Configure the radio</strong> (shared by all APs)</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio0 wifi-radio</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set country-code DE</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set band 5GHz</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>set channel 36</b>
admin@example:/config/hardware/component/radio0/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p><strong>Step 2: Configure keystore secrets</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit keystore symmetric-key main-secret</b>
admin@example:/config/keystore/…/main-secret/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/main-secret/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/&gt; <b>edit keystore symmetric-key guest-secret</b>
admin@example:/config/keystore/…/guest-secret/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/guest-secret/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/&gt; <b>edit keystore symmetric-key iot-secret</b>
admin@example:/config/keystore/…/iot-secret/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/iot-secret/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/keystore/…/iot-secret/&gt; <b>leave</b>
</code></pre>
<p><strong>Step 3: Create multiple AP interfaces</strong> (all on radio0)</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
# Primary AP - Main network (WPA3 for maximum security)
admin@example:/config/&gt; <b>edit interface wifi0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi radio radio0</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point ssid MainNetwork</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point security mode wpa3-personal</b>
admin@example:/config/interface/wifi0/&gt; <b>set wifi access-point security secret main-secret</b>
# Guest AP - Guest network (WPA2/WPA3 mixed for compatibility)
admin@example:/config/&gt; <b>edit interface wifi1</b>
admin@example:/config/interface/wifi1/&gt; <b>set wifi radio radio0</b>
admin@example:/config/interface/wifi1/&gt; <b>set wifi access-point ssid GuestNetwork</b>
admin@example:/config/interface/wifi1/&gt; <b>set wifi access-point security mode wpa2-wpa3-personal</b>
admin@example:/config/interface/wifi1/&gt; <b>set wifi access-point security secret guest-secret</b>
admin@example:/config/interface/wifi1/&gt; <b>set custom-phys-address static 00:0c:43:26:60:01</b>
# IoT AP - IoT devices (WPA2 for older device compatibility)
admin@example:/config/&gt; <b>edit interface wifi2</b>
admin@example:/config/interface/wifi2/&gt; <b>set wifi radio radio0</b>
admin@example:/config/interface/wifi2/&gt; <b>set wifi access-point ssid IoT-Devices</b>
admin@example:/config/interface/wifi2/&gt; <b>set wifi access-point security mode wpa2-personal</b>
admin@example:/config/interface/wifi2/&gt; <b>set wifi access-point security secret iot-secret</b>
admin@example:/config/interface/wifi2/&gt; <b>set custom-phys-address static 00:0c:43:26:60:02</b>
admin@example:/config/interface/wifi2/&gt; <b>leave</b>
</code></pre>
<div class="admonition tip">
<p class="admonition-title">Important</p>
<p><strong>MAC Address Requirement for Multi-SSID:</strong>
When creating multiple AP interfaces on the same radio, you <strong>must</strong> configure
a unique MAC address for each secondary interface (wifi1, wifi2, etc.) using
<code>set custom-phys-address static &lt;MAC&gt;</code>. All interfaces on the same radio inherit
the radio's hardware MAC address by default, which causes network conflicts. Only
the primary interface (alphabetically first, e.g., wifi0) should use the default
hardware MAC address.</p>
<p>Choose MAC addresses from the same locally-administered range:</p>
<ul>
<li>Primary (wifi0): Uses hardware MAC (e.g., <code>00:0c:43:26:60:00</code>)</li>
<li>Secondary (wifi1): <code>00:0c:43:26:60:01</code> (increment last octet)</li>
<li>Tertiary (wifi2): <code>00:0c:43:26:60:02</code> (increment last octet)</li>
</ul>
</div>
<p><strong>Result:</strong> Three SSIDs broadcasting simultaneously on radio0:</p>
<ul>
<li><code>MainNetwork</code> (WPA3, most secure)</li>
<li><code>GuestNetwork</code> (WPA2/WPA3 mixed mode)</li>
<li><code>IoT-Devices</code> (WPA2 for compatibility)</li>
</ul>
<p>All APs on the same radio share the same channel and physical layer settings
(configured at the radio level). Each AP can have its own:</p>
<ul>
<li>SSID (network name)</li>
<li>Security mode and passphrase</li>
<li>Hidden/visible SSID setting</li>
<li>Bridge membership</li>
</ul>
<p>You can verify the configuration with <code>show hardware component radio0</code> to see
radio settings, and <code>show interface</code> to see all active AP interfaces.</p>
<div class="admonition tip">
<p class="admonition-title">Important</p>
<p>AP and Station modes cannot be mixed on the same radio. All virtual interfaces
on a radio must be the same mode (all APs or all Stations).</p>
</div>
<h2 id="fast-roaming-between-access-points">Fast Roaming Between Access Points<a class="headerlink" href="#fast-roaming-between-access-points" title="Permanent link"></a></h2>
<p>Fast roaming enables seamless client handoff between access points through
802.11k/r/v standards. These features can be enabled individually based on
your requirements.</p>
<h3 id="80211r-fast-bss-transition">802.11r - Fast BSS Transition<a class="headerlink" href="#80211r-fast-bss-transition" title="Permanent link"></a></h3>
<p>Enable 802.11r for fast handoff (&lt;50ms) between APs with the same SSID:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r mobility-domain 4f57
</code></pre></div>
<p><strong>Requirements:</strong>
- All APs in roaming group must have <strong>identical</strong> SSID
- All APs must have <strong>identical</strong> passphrase (same keystore secret)
- All APs must use the <strong>same mobility-domain</strong> identifier</p>
<p><strong>Mobility Domain Options:</strong>
- Explicit 4-character hex value (e.g., <code>4f57</code>) - default if not specified
- <code>hash</code> - Automatically derive from SSID using MD5 (OpenWrt-compatible)</p>
<p>Using <code>hash</code> allows multiple APs with the same SSID to automatically share
the same mobility domain without manual configuration:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r mobility-domain hash
</code></pre></div>
<p>The NAS-Identifier (Network Access Server Identifier) is a string that
uniquely identifies each AP within the 802.11r mobility domain. APs
exchange this identifier during fast BSS transition so they can look up
the correct PMK-R1 key for the roaming client. It must be unique per AP
BSS and stable across reboots.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r nas-identifier auto
</code></pre></div>
<p><code>auto</code> derives the identifier as:</p>
<p><code>&lt;interface-name&gt;-&lt;hostname&gt;.&lt;mobility-domain&gt;</code></p>
<p>Or set an explicit string:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r nas-identifier ap01.wifi0.4f57
</code></pre></div>
<h3 id="80211k-radio-resource-management">802.11k - Radio Resource Management<a class="headerlink" href="#80211k-radio-resource-management" title="Permanent link"></a></h3>
<p>Enable 802.11k for client neighbor discovery and better roaming decisions:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11k
</code></pre></div>
<p>Enables neighbor reports and beacon reports, allowing clients to discover
nearby APs before roaming.</p>
<h3 id="80211v-bss-transition-management">802.11v - BSS Transition Management<a class="headerlink" href="#80211v-bss-transition-management" title="Permanent link"></a></h3>
<p>Enable 802.11v for network-assisted roaming:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11v
</code></pre></div>
<p>Allows APs to suggest better APs to clients, improving roaming decisions.</p>
<h4 id="band-steering-mbo">Band Steering (MBO)<a class="headerlink" href="#band-steering-mbo" title="Permanent link"></a></h4>
<p>Enabling <code>dot11v</code> also turns on MBO (Multi-Band Operation), advertised in
beacons and association responses. MBO lets a dual-band client see that
the same SSID exists on another band and decide for itself when to move,
while 802.11v BSS Transition Management lets the AP suggest a better
target.</p>
<p>On top of the client-cooperative hints, the AP applies active steering:
on a 2.4 GHz access-point it suppresses probe responses to clients that
were recently seen on the same SSID on the 5/6 GHz band, nudging
dual-band clients onto the higher band. MBO is <strong>enabled by default</strong>
whenever <code>dot11v</code> is enabled:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11v
</code></pre></div>
<p>To turn it off while keeping BSS Transition Management:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11v band-steering false
</code></pre></div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Band steering only matters when the same SSID is offered on two or more
bands (one access-point per radio). On a single-band network there is
no other band to move to, so it has no effect.</p>
</div>
<h3 id="opportunistic-key-caching-okc">Opportunistic Key Caching (OKC)<a class="headerlink" href="#opportunistic-key-caching-okc" title="Permanent link"></a></h3>
<p>OKC reduces re-authentication time for roaming clients that do not
support 802.11r. The AP caches the PMK from previous associations and
shares it with other APs in the same mobility group. It is <strong>enabled by
default</strong> and only activates when both AP and client support it:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming okc false
</code></pre></div>
<h3 id="recommended-configuration">Recommended Configuration<a class="headerlink" href="#recommended-configuration" title="Permanent link"></a></h3>
<p>For optimal roaming experience, enable all three features:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11k
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11v
<a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r mobility-domain 4f57
</code></pre></div>
<p>Or use <code>hash</code> for automatic mobility domain derivation from SSID:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11k
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11v
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a>admin@example:/config/interface/wifi0/&gt; set wifi access-point roaming dot11r mobility-domain hash
</code></pre></div>
<p>Repeat for all APs that should participate in the roaming group.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Not all client devices support all roaming features. Modern devices typically
support 802.11k/r/v, but older devices may only support basic roaming without
fast transition.</p>
</div>
<h2 id="80211s-mesh-point-mode">802.11s Mesh Point Mode<a class="headerlink" href="#80211s-mesh-point-mode" title="Permanent link"></a></h2>
<p>IEEE 802.11s is a wireless mesh networking standard operating at Layer 2.
Mesh nodes form peer links directly with each other and route traffic
using HWMP (Hybrid Wireless Mesh Protocol), which is built into the
Linux mac80211 subsystem. There is no central controller; nodes
discover peers and find paths on their own.</p>
<p>The standard defines two node roles:</p>
<ul>
<li><strong>Mesh Point (MP)</strong> - a basic mesh node that forwards traffic within
the mesh</li>
<li><strong>Mesh Portal (MPP)</strong> - a mesh node that bridges traffic between the
mesh and an external network (e.g., a wired LAN)</li>
</ul>
<p>In practice, a node bridging the mesh interface to a LAN acts as a mesh
portal.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Not all WiFi hardware supports 802.11s mesh. The driver must implement
mesh point mode in mac80211. Check your adapter's capabilities with
<code>iw phy &lt;phy&gt; info</code> and look for "mesh point" under "Supported interface
modes".</p>
</div>
<h3 id="80211s-vs-easymesh">802.11s vs EasyMesh<a class="headerlink" href="#80211s-vs-easymesh" title="Permanent link"></a></h3>
<table>
<thead>
<tr>
<th></th>
<th><strong>802.11s</strong></th>
<th><strong>EasyMesh</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Standard</strong></td>
<td>IEEE (open, ratified)</td>
<td>Wi-Fi Alliance (certification)</td>
</tr>
<tr>
<td><strong>Topology</strong></td>
<td>Peer-to-peer, any-to-any</td>
<td>Controller-based tree</td>
</tr>
<tr>
<td><strong>Single point of failure</strong></td>
<td>None</td>
<td>Controller</td>
</tr>
<tr>
<td><strong>Multi-hop</strong></td>
<td>True N-hop</td>
<td>Limited (1-2 hops)</td>
</tr>
<tr>
<td><strong>Vendor lock-in</strong></td>
<td>None</td>
<td>Common</td>
</tr>
<tr>
<td><strong>Linux support</strong></td>
<td>Kernel-native (mac80211)</td>
<td>Requires proprietary firmware</td>
</tr>
</tbody>
</table>
<p>Infix uses 802.11s because it runs entirely in the kernel with no
proprietary components.</p>
<h3 id="mesh-configuration">Mesh configuration<a class="headerlink" href="#mesh-configuration" title="Permanent link"></a></h3>
<p>A mesh point requires the radio to have <code>band</code>, <code>channel</code>, and a valid
<code>country-code</code> configured. Mesh and AP modes cannot coexist on the same
radio.</p>
<p><strong>Step 1: Configure the radio</strong></p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit hardware component radio1 wifi-radio</b>
admin@example:/config/hardware/component/radio1/wifi-radio/&gt; <b>set country-code DE</b>
admin@example:/config/hardware/component/radio1/wifi-radio/&gt; <b>set band 5GHz</b>
admin@example:/config/hardware/component/radio1/wifi-radio/&gt; <b>set channel 36</b>
admin@example:/config/hardware/component/radio1/wifi-radio/&gt; <b>leave</b>
</code></pre>
<p><strong>Step 2: Create keystore entry for mesh security</strong></p>
<p>All mesh links use WPA3-SAE encryption. All nodes in the same mesh
network must share the same passphrase:</p>
<pre class="cli"><code>admin@example:/&gt; <b>configure</b>
admin@example:/config/&gt; <b>edit keystore symmetric-key mesh-secret</b>
admin@example:/config/keystore/…/mesh-secret/&gt; <b>set key-format passphrase-key-format</b>
admin@example:/config/keystore/…/mesh-secret/&gt; <b>change cleartext-symmetric-key</b>
Passphrase: ************
Retype passphrase: ************
admin@example:/config/keystore/…/mesh-secret/&gt; <b>end</b>
</code></pre>
<p><strong>Step 3: Configure the mesh interface</strong></p>
<pre class="cli"><code>admin@example:/config/&gt; <b>edit interface wifi-mesh</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>set type wifi</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>set wifi radio radio1</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>set wifi mesh-point mesh-id my-mesh</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>set wifi mesh-point security secret mesh-secret</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>leave</b>
</code></pre>
<p><strong>Mesh parameters:</strong></p>
<ul>
<li><code>mesh-id</code>: Network identifier, 1-32 characters. All nodes in the mesh
must use the same mesh ID</li>
<li><code>forwarding</code>: L2 mesh forwarding (default: true). When enabled, the
interface can be added to a bridge as a mesh portal</li>
<li><code>security secret</code>: Keystore reference for the WPA3-SAE passphrase</li>
</ul>
<h3 id="mesh-portal-bridge-integration">Mesh portal (bridge integration)<a class="headerlink" href="#mesh-portal-bridge-integration" title="Permanent link"></a></h3>
<p>To connect the wireless mesh to a wired LAN, add the mesh interface to
a bridge:</p>
<pre class="cli"><code>admin@example:/config/&gt; <b>edit interface wifi-mesh</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>set bridge-port bridge br0</b>
admin@example:/config/interface/wifi-mesh/&gt; <b>leave</b>
</code></pre>
<h3 id="mesh-with-roaming-aps">Mesh with roaming APs<a class="headerlink" href="#mesh-with-roaming-aps" title="Permanent link"></a></h3>
<p>You can combine 802.11s mesh backhaul with roaming-enabled access
points. Each node has a mesh interface for backhaul on one radio and
AP interfaces for clients on another:</p>
<p><a class="glightbox" data-type="image" data-width="100%" data-height="auto" href="../img/wifi-mesh-roaming.svg" data-desc-position="bottom"><img alt="802.11s mesh backhaul with roaming-enabled access points" src="../img/wifi-mesh-roaming.svg"></a></p>
<p>With 802.11r/k/v roaming enabled on the APs (same SSID, same
passphrase, same mobility domain), clients hand off between nodes while
the mesh carries backhaul traffic.</p>
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link"></a></h2>
<p>Use <code>show interface wifi0</code> to verify signal strength and connection status.
If issues arise, try the following troubleshooting steps:</p>
<ol>
<li><strong>Verify signal strength</strong>: Check that the target network shows
"good" or "excellent" signal in scan results</li>
<li><strong>Check credentials</strong>: Use <code>show keystore symmetric &lt;name&gt;</code> to verify
the passphrase matches the network password</li>
<li><strong>Review logs</strong>: Check system logs with <code>show log</code> for Wi-Fi related
errors</li>
<li><strong>Regulatory compliance</strong>: Ensure the country-code on the radio
matches your location</li>
<li><strong>Hardware detection</strong>: Confirm the WiFi radio appears in <code>show
hardware</code></li>
</ol>
<p>If issues persist, check the system log for specific error messages that
can help identify the root cause.</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">
<div class="md-copyright__highlight">
Copyright © 2022-2026 The KernelKit Team
</div>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["toc.follow", "navigation.path", "navigation.instant", "navigation.instant.progress", "navigation.tracking", "navigation.indexes", "search.highlight", "search.share", "content.code.copy", "content.code.annotate", "content.footnote.tooltips"], "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": {"provider": "mike"}}</script>
<script src="../assets/javascripts/bundle.d7400e89.min.js"></script>
<script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
document$.subscribe(()=>{ lightbox.reload(); });
</script></body></html>