fix(micropython): route unknown SSIDs to the emulated AP instead of hanging
Follow-up to the #262 fix. Handing MicroPython the real driver exposed a population the stub had been quietly carrying: sketches that connect to an SSID that simply does not exist in the emulated radio. The AP tables (QEMU esp32_wifi_ap.c and the esp32*js engines — same four networks in both) associate by MAC/channel, so an unknown SSID scans to nothing and `while not isconnected():` spins forever. Most 100-days gallery examples ship their author's home SSID, so "real driver, no shim" would have frozen them on the connect loop. So when a NIC is attached the prelude now injects a thin proxy around the REAL network module: connect() to any SSID outside the emulated set is redirected to Velxio-GUEST (announced on serial, so nobody debugs a connection they didn't make); known SSIDs pass through untouched; every other attribute delegates to the native module. Result: made-up-SSID sketches get genuine DHCP/DNS/TCP through SLIRP instead of the old fake answers, and the reporter's PICSimLabWifi repro is never rewritten. Wrapper semantics (rewrite, passthrough, module-attr delegation, and the `from network import WLAN` form) are exercised against an instrumented fake module; both generated preludes are syntax-checked.
This commit is contained in:
parent
0653aad3d4
commit
f96d239a1d
|
|
@ -2015,7 +2015,41 @@ export const useSimulatorStore = create<SimulatorState>((set, get) => {
|
|||
// useful data instead of "API Error".
|
||||
const now = new Date();
|
||||
const fakeWeatherCity = 'Simulator City';
|
||||
const networkStub = wifiOn ? [] : [
|
||||
// With a NIC attached: the REAL driver, behind a thin proxy that
|
||||
// rewrites unknown SSIDs to the emulated AP. The emulated radio
|
||||
// (QEMU esp32_wifi_ap.c and the esp32*js engines both) announces
|
||||
// exactly four networks; a sketch that connects to its author's
|
||||
// home SSID would scan, find nothing, and busy-wait on
|
||||
// isconnected() forever — which is what every gallery example
|
||||
// that ships a made-up SSID would do. Redirecting to
|
||||
// Velxio-GUEST keeps those sketches on the REAL stack (DHCP on
|
||||
// 192.168.4.x, DNS, outbound TCP through SLIRP) instead of
|
||||
// reviving the fake stub for them. Known SSIDs pass through
|
||||
// untouched, and the rewrite is announced on serial so nobody
|
||||
// debugs a connection they didn't make.
|
||||
const networkStub = wifiOn ? [
|
||||
'import network as _vlx_net',
|
||||
'_VLX_SSIDS = ("Velxio-GUEST", "PICSimLabWifi", "Espressif", "MasseyWifi")',
|
||||
'class _VlxWLAN:',
|
||||
' def __init__(self, *a, **k):',
|
||||
' self._w = _vlx_net.WLAN(*a, **k)',
|
||||
' def connect(self, ssid=None, key=None, **kw):',
|
||||
' if ssid is not None and ssid not in _VLX_SSIDS:',
|
||||
' print("[velxio] SSID %r is not part of the emulated network; connecting to \'Velxio-GUEST\' instead" % ssid)',
|
||||
' ssid, key = "Velxio-GUEST", ""',
|
||||
' if ssid is None:',
|
||||
' return self._w.connect()',
|
||||
' return self._w.connect(ssid, key, **kw)',
|
||||
' def __getattr__(self, n):',
|
||||
' return getattr(self._w, n)',
|
||||
'class _VlxNetwork:',
|
||||
' STA_IF = _vlx_net.STA_IF',
|
||||
' AP_IF = _vlx_net.AP_IF',
|
||||
' WLAN = _VlxWLAN',
|
||||
' def __getattr__(self, n):',
|
||||
' return getattr(_vlx_net, n)',
|
||||
'sys.modules["network"] = _VlxNetwork()',
|
||||
] : [
|
||||
'class _StubWLAN:',
|
||||
' def __init__(self, *a, **k):',
|
||||
' self._calls = 0',
|
||||
|
|
|
|||
Loading…
Reference in New Issue