Treat NET-101, NET-102, DNS-101 and DNS-105 as transient: the service stays alive, waits for a usable physical network through ConnectivityManager and retries with bounded backoff instead of publishing a terminal error. Restart on network change waits until Android configures the new link, and the quick settings tile gains the reconnecting state. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
26 lines
2.4 KiB
Markdown
26 lines
2.4 KiB
Markdown
# network-bootstrap
|
||
|
||
Узкий Android library-модуль для bootstrap до создания TUN. Он владеет только:
|
||
|
||
- выбором текущей non-VPN сети;
|
||
- согласованием `NetworkCapabilities` и `LinkProperties`;
|
||
- короткой стабилизацией snapshot и повторами при реальной смене network identity, validation/Private DNS или списка DNS-серверов;
|
||
- системным `DnsResolver`/`Network.getAllByName()`;
|
||
- стабильными support-кодами и безопасной технической причиной.
|
||
|
||
Модуль не знает о профилях, Compose, `libbox`, VPN allowlist, runtime JSON или LKG-кэше. Эти решения остаются в `app`. Он также не решает, что считать пригодной сетью: ожидание принимает предикат, потому что во время перехода Wi‑Fi ↔ cellular Android публикует кандидата задолго до того, как тот годится для bootstrap. Критерий зрелости и политика восстановления живут в `app`.
|
||
|
||
| Код | Значение |
|
||
|---|---|
|
||
| `NET-101` | Android не предоставил underlying-сеть |
|
||
| `NET-102` | Сеть менялась во время bootstrap и не стабилизировалась |
|
||
| `DNS-101` | DNS timeout |
|
||
| `DNS-102` | Имя не найдено / NXDOMAIN |
|
||
| `DNS-103` | DNS отказал / REFUSED |
|
||
| `DNS-104` | Успешный ответ без адресов |
|
||
| `DNS-105` | Системная ошибка Android resolver (`DnsException`/errno) |
|
||
| `DNS-106` | Другой DNS RCODE |
|
||
|
||
Коды `NET-110`, `DNS-110`, `VPN-1xx` и `VPN-2xx` принадлежат `app`: они описывают captive portal, strict Private DNS, deadline подключения и проверки поверх готового TUN.
|
||
|
||
`NET-101` и `NET-102` больше не означают конец сессии: `app` трактует их как транзиентные и переподключается сам в ограниченной серии попыток. Остальные коды остаются терминальными. Текст ошибки может уточняться, но смысл опубликованного кода не меняется.
|