app: listen to what the segment says unprompted
Four passive collectors join long mode: SSDP (passive NOTIFY plus paced M-SEARCH from the capture socket, so unicast replies land in the same capture), LLMNR, NetBIOS-NS and WS-Discovery. All are periodic and sparse by nature, which is exactly why they belong to a window rather than a probe - a thirty-second run mostly hears silence and would report an empty network as confidently as a quiet one. NetBIOS reports unsupported on the app tier and says why: UDP 137 is privileged. The decoder and evidence shape are tested and waiting for the Shizuku tier; a recorded reason beats a missing test. Silence without a multicast lock or a group join is PARTIAL, never OK - that case is a fact about this app, not about the network. Hostnames, banners and device UUIDs are classified in core-privacy so the anonymizer treats them like every other identifier rather than letting a neighbour's device model ride out in an upload. No active WSD Probe and no NBSTAT sweep: the app listens to what a network broadcasts, it does not announce itself to strangers or interrogate its neighbours. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
93125a4b1d
commit
9ee7d554a6
@@ -497,6 +497,22 @@ class RunViewModel(app: Application) : AndroidViewModel(app) {
|
||||
listenMs = (windowMs - 2_000).coerceAtLeast(10_000)
|
||||
)
|
||||
),
|
||||
// The rest of what a segment says about itself unprompted. All passive listeners,
|
||||
// which is exactly why they belong to long mode: the announcements are periodic
|
||||
// and sparse, so a thirty-second run mostly hears silence and would report an
|
||||
// empty network as confidently as a quiet one.
|
||||
//
|
||||
// Searches are paced across the window rather than fired at the start: a device
|
||||
// that was asleep for the first minute still gets asked. NetBIOS is included
|
||||
// knowing it will usually report `unsupported` — UDP 137 is privileged, so the
|
||||
// app tier cannot bind it — because a recorded reason beats an absent test, and
|
||||
// the decoder is ready for the Shizuku tier.
|
||||
app.echo_lot.probe.SsdpCollector(
|
||||
searchIntervalMs = (windowMs / 5).coerceAtLeast(30_000),
|
||||
),
|
||||
app.echo_lot.probe.LlmnrCollector(),
|
||||
app.echo_lot.probe.NetbiosCollector(),
|
||||
app.echo_lot.probe.WsdCollector(),
|
||||
)
|
||||
activeCollectors = collectors
|
||||
for (c in collectors) runCatching { c.start(ctx, ids) }
|
||||
|
||||
Reference in New Issue
Block a user