app: router identification verified on-device — named a MikroTik RouterOS 7.23.2

The probe identified the LAN's IPv6 RA sender end to end from an
unprivileged app: EUI-64 MAC recovery (78:9A:18:54:B8:F9, matching the
Shizuku neighbor table) -> MikroTik by OUI, corroborated by the UPnP
device description (RouterOS/7.23.2, MikroTik Router) and reverse DNS
(router.hudelist.local). Cellular's RFC 7217 privacy RA source is
correctly reported as not-EUI-64 instead of guessed. The SSDP sweep also
inventoried a Synology DS1522+ and a Sky gateway — the raw material for
future LLDP/mDNS cross-matching.

Fixes found by running it: added the confirmed MikroTik OUI 78:9A:18 (+
other RouterBOARD ranges) and an elvis-operator bug that printed "no UPnP
response" alongside valid UPnP data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mrambossek
2026-08-01 09:42:06 +02:00
co-authored by Claude Opus 5
parent 38f8036252
commit 2e34463c0a
4 changed files with 516 additions and 5 deletions
@@ -25,6 +25,8 @@ object Oui {
// MikroTik
"00:0C:42" to "MikroTik", "4C:5E:0C" to "MikroTik", "6C:3B:6B" to "MikroTik",
"48:8F:5A" to "MikroTik", "2C:C8:1B" to "MikroTik", "DC:2C:6E" to "MikroTik",
"78:9A:18" to "MikroTik", "18:FD:74" to "MikroTik", "64:D1:54" to "MikroTik",
"74:4D:28" to "MikroTik", "C4:AD:34" to "MikroTik", "E4:8D:8C" to "MikroTik",
// TP-Link
"00:1D:0F" to "TP-Link", "14:CC:20" to "TP-Link", "50:C7:BF" to "TP-Link",
"A4:2B:B0" to "TP-Link", "C0:06:C3" to "TP-Link", "EC:08:6B" to "TP-Link",
@@ -80,15 +80,18 @@ class RouterIdentityProbe(private val entries: List<NetworkInventory.Entry>) : P
put("v4_gateway", v4Gw ?: "(none)")
if (v4Gw != null) {
put("v4_gateway_reverse_dns", reverseDns(v4Gw))
ssdp[v4Gw]?.let { s ->
put("upnp_server", s.server)
put("upnp_location", s.location)
s.details?.let { d ->
val gwSsdp = ssdp[v4Gw]
if (gwSsdp != null) {
put("upnp_server", gwSsdp.server)
put("upnp_location", gwSsdp.location)
gwSsdp.details?.let { d ->
put("upnp_manufacturer", d.manufacturer)
put("upnp_model", d.model)
put("upnp_friendly_name", d.friendlyName)
}
} ?: put("upnp", "no UPnP/SSDP response from the gateway")
} else {
put("upnp", "no UPnP/SSDP response from the gateway")
}
}
}
}