From 38f8036252d4875b0a82fd027187f1e6905ca2f5 Mon Sep 17 00:00:00 2001 From: mrambossek Date: Sat, 1 Aug 2026 09:35:54 +0200 Subject: [PATCH] app: link.ra_source router identification + brand icons + DEV build variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit link.ra_source answers "who advertises IPv6 here, and which box is it": RA source per network, MAC recovered from the modified-EUI-64 link-local (privacy addresses reported as such, not guessed), vendor via a curated OUI table, UPnP/SSDP M-SEARCH for the gateway's server banner + device description (manufacturer/model/friendly name), and reverse DNS. All SSDP responders are recorded so a rogue RA sender that isn't the gateway can still be matched; the MAC accompanies every identity source as the hook for future LLDP/mDNS cross-matching. UI gains a "Router / IPv6 advertiser" panel. Icons: branding adaptive icon converted to vector drawables (+ PNG mipmaps, monochrome layer). The debug build is now a separate app — applicationIdSuffix .dev, label "Echolot DEV", DEV-badged icon — so it installs alongside a production build and can't be confused with it. Co-Authored-By: Claude Opus 5 --- docs/build-status.md | 26 +++ echolot-app/app/build.gradle.kts | 6 + .../debug/res/drawable-hdpi/ic_dev_badge.png | Bin 0 -> 1384 bytes .../debug/res/drawable-mdpi/ic_dev_badge.png | Bin 0 -> 948 bytes .../debug/res/drawable-xhdpi/ic_dev_badge.png | Bin 0 -> 1787 bytes .../res/drawable-xxhdpi/ic_dev_badge.png | Bin 0 -> 2738 bytes .../res/drawable-xxxhdpi/ic_dev_badge.png | Bin 0 -> 3761 bytes .../drawable/ic_launcher_foreground_dev.xml | 8 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/debug/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3993 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3993 bytes .../src/debug/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2312 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2312 bytes .../debug/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5182 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5182 bytes .../debug/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9239 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9239 bytes .../debug/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11707 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 11707 bytes .../app/src/debug/res/values/strings.xml | 4 + echolot-app/app/src/main/AndroidManifest.xml | 4 +- .../kotlin/app/echo_lot/app/MainActivity.kt | 49 +++++ .../kotlin/app/echo_lot/app/RunViewModel.kt | 2 + .../res/drawable/ic_launcher_background.xml | 17 ++ .../res/drawable/ic_launcher_foreground.xml | 22 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3907 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3907 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2185 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2185 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5058 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5058 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9480 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9480 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11941 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 11941 bytes .../app/src/main/res/values/strings.xml | 4 + .../bin/main/app/echo_lot/measurement/Test.kt | 2 + .../kotlin/app/echo_lot/measurement/Test.kt | 2 + .../src/main/kotlin/app/echo_lot/probe/Oui.kt | 62 ++++++ .../app/echo_lot/probe/RouterIdentityProbe.kt | 203 ++++++++++++++++++ 43 files changed, 432 insertions(+), 1 deletion(-) create mode 100644 echolot-app/app/src/debug/res/drawable-hdpi/ic_dev_badge.png create mode 100644 echolot-app/app/src/debug/res/drawable-mdpi/ic_dev_badge.png create mode 100644 echolot-app/app/src/debug/res/drawable-xhdpi/ic_dev_badge.png create mode 100644 echolot-app/app/src/debug/res/drawable-xxhdpi/ic_dev_badge.png create mode 100644 echolot-app/app/src/debug/res/drawable-xxxhdpi/ic_dev_badge.png create mode 100644 echolot-app/app/src/debug/res/drawable/ic_launcher_foreground_dev.xml create mode 100644 echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher.png create mode 100644 echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/debug/res/mipmap-mdpi/ic_launcher.png create mode 100644 echolot-app/app/src/debug/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/debug/res/values/strings.xml create mode 100644 echolot-app/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 echolot-app/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 echolot-app/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 echolot-app/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 echolot-app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 echolot-app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 echolot-app/app/src/main/res/values/strings.xml create mode 100644 echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/Oui.kt create mode 100644 echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/RouterIdentityProbe.kt diff --git a/docs/build-status.md b/docs/build-status.md index 7081bae..3e43a0b 100644 --- a/docs/build-status.md +++ b/docs/build-status.md @@ -452,3 +452,29 @@ gained `POST /report`, `GET /reports`, `GET /report/`), shows the result f finishes itself — leaving the device as it was found. On upload failure it stays open so the error is visible. Grant permissions once via `adb shell pm grant app.echo_lot.app android.permission.ACCESS_FINE_LOCATION` so nothing blocks on a dialog. + +## App: router identification, brand icons, DEV build variant (2026-08-01) +**`link.ra_source` — who is advertising IPv6 here, and what box is it?** New app-tier probe +(registry addition). Identification chain, each step recorded as evidence so nothing is guessed: +1. RA source = next-hop of the `::/0` route per network (a `fe80::` link-local). +2. **MAC recovered from the modified-EUI-64 link-local** (strip `ff:fe`, flip the U/L bit) — + e.g. `fe80::7a9a:18ff:fe54:b8f9` → `78:9a:18:54:b8:f9`. RFC 7217/privacy addresses don't encode + a MAC and are reported as such rather than guessed. +3. Vendor via a curated OUI table (`Oui.kt` — SOHO/router vendors; unknown OUIs are printed + verbatim). Locally-administered (randomized) MACs are flagged. +4. **UPnP/SSDP M-SEARCH** → the gateway's `SERVER:` banner + device-description XML gives + manufacturer / model / friendly name. This is what usually names the exact box. +5. Reverse DNS for both gateways. +All SSDP responders are recorded (not just the gateway) so a rogue RA sender that isn't the +gateway can still be matched — and the MAC travels with every identity source, which is the hook +for the future LLDP / mDNS cross-matching. +UI: a "Router / IPv6 advertiser" panel above the network list, leading with the identified +vendor/model. + +**Icons + DEV variant.** The branding adaptive icon is now the app icon: `icon-adaptive-*.svg` +converted to Android vector drawables (SVG transform baked in, gradient background, monochrome +layer for themed icons) plus PNG mipmaps for legacy launchers. The **debug build is a separate +app**: `applicationIdSuffix .dev`, label "Echolot DEV", and a DEV-badged icon (layer-list = +production foreground + generated amber DEV ribbon) so it is unmistakable next to a real install +and both can be installed side by side. +NOTE for tooling: the dev package is `app.echo_lot.app.dev`, activity `app.echo_lot.app.MainActivity`. diff --git a/echolot-app/app/build.gradle.kts b/echolot-app/app/build.gradle.kts index f084067..33c25fa 100644 --- a/echolot-app/app/build.gradle.kts +++ b/echolot-app/app/build.gradle.kts @@ -25,6 +25,12 @@ android { } buildTypes { release { isMinifyEnabled = false } + debug { + // The dev build is a separate app: own package (installs alongside a real + // Echolot), own label and a DEV-badged icon (src/debug/res). + applicationIdSuffix = ".dev" + versionNameSuffix = "-dev" + } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/echolot-app/app/src/debug/res/drawable-hdpi/ic_dev_badge.png b/echolot-app/app/src/debug/res/drawable-hdpi/ic_dev_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d75fe077721f7241ac5cd61fd3e0cc3b22f802 GIT binary patch literal 1384 zcmchX`!^E`0LPsUUAc#JNr|*OA&)Sx9_$uvn4#>FSjl5%%)(@uM>5IsDEE>qTMn0A zm${6lk)6WIJk~gEhUt#H+n7AZ=GGt3ulIY-=ll8f`_uRC1%EGXtwUOBYHHdrZwTU> ztG}bU`&++VHZW3C)3Ad<+yhgo(y>^KakTL}IYngMV=glF3oRM(@vAlG2u#Z%R?Xh< zW4jUgxMj~z`d7*N@O^trfxwkqJ0Cf%=!7hhm*pro{o9)IQUsmO7tCrG0BSF@4PUK7iw*dq1tykRnOSp^Mepkf?^R|&bsgJRH;WnT z+zCnR?+d}A$)b~p&QMSiy_5(}*IK{(O5+2NNv5~Bpm zJ@+RyXfs25UCS=icG5Zr5_E#j+sXY&0fBl8`)gVQxm4#~at zOTnpBgBBt~Wzv5%fkTE9n_mFvViQ`SZKz{in)JjXejr`$UB4*N%9D+?y=(>2Jqk{r zGGeC`@q3=(6%Cf7$rV1+77kAp+XNibhI41cRveGnSK{;YN|are{bL5tvoHX;AU1S{ zvab=wL<_wIBD|LS<+C=AM^CvUJp&Yhl{}O4YrM(qay%L!K3>3z81l>%y^Gh3L;#$G zeotEQZm#>qOQ8uYd$0-FQmjnYtFg;kcCV!XgnL#Aj+N%!CPv9K2G(JTcb`x{`S_ue^1; zG~O`RLU5qlC1~CPfrjXs!A>Wk--7Ia5wws;v2c8t)$@9*LLvCl$s-$g=gPMgF**K? ztdcAHsKz z(Y1Tw66hLS7l@c^GQZe>whI+|}L^nRnwk&{Tzs rXenVXT=ROry*f$r9Dw{o^=PUzLaS(twr)Y`> z<@xe-S)Tj4$Nx=VGEZB(bMN_WPkmNf&o_Pb{Ff19#u>p43FR@>A2x0G=wTL)>HK)O zJ?+7MrBF|kY)dm`ld>7glKxU&$B(y^{fk>(_rUAIR3FJxU)62<(({$R&0IXU^ZnfK zi?^!xU6_3Jv6oPPeEVDdTgql11$?9<=U6`X3idE(>(2WdQ@QE1kYrd&@YIR-7EQTP zU8eKh{nBUidEZjJuFW@?zVldn?ERFROAi)ld^>-uA%=0X+2Nu{`44XW_bZ-@JYK%` z;lE{yx2Lo{zZdgaFV@(~Kdf|_eg2w{uHWNw$~%38e&6`_b?U=6MHcm0nR^ZePYF^{ zs%@Lu`>A$sW$gUPm9e`|+^U>>x6rWes^HenPa4&hTVf9I1RKv6c$+-$Rd$=1{L6P2 z62qr%Eq=m1W2slt2J3m12Ws@H&vpFux;$~4;)Bk2Hs6owO3gmzu2_3JsQ$^n1j`t! z%{tFYYk%)kXZB9Lu{K@axcAr^LuczF_n#Ku?sdIsMz7_}{IJulaK8_P;jgh~T#`_h0;J^gejH9Pbp@iwoAQ(b7Nh>%Xt(pSbPn zYi7jC&7S&L_D%Y8-8o@W`)?YoJZ`gn*Dc{h6f|*lx|ANV?WE|@ zlfko(eG|*F-M&up5u?HRt2663C-!cUoVIM$qh+^vKE6J(t3iEN>Bjy3cb+)awO4fR zyJHf-=el@f%CQ6c)Rh0VBpXiC?)-1flxB#Oe!I5TFy23^es77(;c1|3;pyt=R)zKs9? literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/drawable-xhdpi/ic_dev_badge.png b/echolot-app/app/src/debug/res/drawable-xhdpi/ic_dev_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6b74818229d39d73299618c3744e5857c48207 GIT binary patch literal 1787 zcmc(gX;c!38io~9CntxQv7%8CZPCoDmZqj@dK-7eyyZe-MBW(}P$-vh1D8&YT592z zD@W0kOh8jyD6!Ei0}6$bkrL!6ZlvUB5~(=Nx&Q7t_x`=#Ip6!9_uu#adA@?+ARm1_ zLp==*4Shdf&x>DN^w)l+^F<3xtyeTObbj^o{Ch}h?TT1l5)uQ}{ZLgmDxq}&Y+&#N zv#+gvBlbiUw2zcIp6}A{5`m!Gx-8y)x4FxXCL7ElVAD%*KpkEkGa?V;Y#5Az#l_eb=^-L zr|$(h$i`*V$@nz&y3s-i9GsP>|I!?HWR7v*QagvH))p-Fd z>Y?Wk{cbeYy1*a!LY&1kS?yI<}`7UYM<$@v`Z z_dqOg&WCLg74v!I(d7<}^;4QPW;Hz!Y#NGPFdqWWM1>KeUbQF8mb0blxHB1xo->W( zYZn6&O~sB zK+56Kp{>v&YB}*VVNy6$%ig%%{ryoITx~aPRh6MKh%_LTGXCH!B z+%yZvZ7#HoyKR5I!XY1C*bDO@E&c`-vyQ5b)XiDn%r`RBf$%3yNspNh2DS#a6VxpA zO3wCgu#3vzv{YxnK@sTSFcWu++`KVBCfiGph29gfLW(Qllc(AG2rI7*@#4u|*|l!| zQP70fzV{4gXhECNCIrG0pJS;y-wsEF6GMt?chyTPEo~_VSt>5&VN*1_&Z%cV+8Wr# zYrk>o2n^|T^CyGK!(exNMCI;Qtgvq>FVm6|csC3uj4)X?ne-k6pwV~T*FAOe0#Z~v zkRlf#E#LhtSPsGZR$Bxto7ik62i%ykDD{c9F-PXe>^RORj*eOK%8Ej(4FpZ=x3eIH z=9LEAA(X;`Zx2HX<`RkXnLnnPhbKnHJ{Lc{cv{aZpxMTCV5LaCUE#BUKb=OvB=&W> z-X$>9>ucV7Id_pc`Ui*s&sSY+ZT-{pTpVEWpJpZNrSJS?GnJs85-(_3Rqu#ACtLd_ ziVi!5tm>CE8HFW-hyyK~%-!;WSKJ?YMV#;GgOA$76!HWry42M0_Ua0{1e%M@S`YkZ z11!jWwWr8w9(KcnE4-n^Z0%0@%izs5sYzVB>p&_Z>D1Id ziN?@vIZo^qp5|$mvk(gA&Y3>k>YszZxTK z6`W$)JFTe)n=3I@k@bd}HMtZFjS=@&JhP}m+bOEJQPLy=y#cp4t>l^X3DJD0@l_P- zp4T&;z%e-m%ZXHW2oD0aEpn|(DAg#xv)as#SJY*|Xi ztYKvHP4`=C@uC5vOXkRlqy68JdD!Ugm{Eaw?I1Kkb9Vj!DUkYNMg+YLhgUU_y9jkbGZBP%Vz*^{$H=e&nw82dLEhkC+5mi AzW@LL literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/drawable-xxhdpi/ic_dev_badge.png b/echolot-app/app/src/debug/res/drawable-xxhdpi/ic_dev_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..e18cd26b895c931da3187730f92738708b3b62b3 GIT binary patch literal 2738 zcmeHJ`!^Ge8{b>r7s;*O$|VX7U2N47ax0g-QxcVhScu77GUn1Yd%aId+N3MSQy}LnMyK1HC|3d^}mOVF#`Um)-;xvnD&&DLRhzV zBlg_Wn5Pb6D?pG~UmV&o0_Q)Sh2dr3PV^)tF=6=@|wpZ5fWnna9^*)I=$&xTG>~d@TFT7Q5AwbTz;s=G}eYrizE( zB{Xgi5iNWfIgo(T=f42Y8%ieQqxF@9F$~w9F*?m0&q}-@N}7FOA@p^&0_~l^J1cM$ z^j17lm4Fb;#=(;#6Wisb;nH$&-9)6Qc)H0IC?sOaJgZ;poxv`-Q{RUddM`KCan{1q z395575i;D{`YL9V?Q?0&;QXp78f=sn3@#EvP?FkKl%WgnB~@JKrATg2T0Gd?BtALV zZMzWFoV4(BN$sx=Z!Hj!g+f;EtS8godHcIHwrH_jlycJ zkP3=#e|9;=L>h1-LIXTFFmwl)^)|fEonBxf5}yueA-ICTmJz6GMs?^gWHS{+?KYmS zsMO|Am+#pa%6AP06*KSj2oIhljpMQf4VK$zANOun-(t6QZG}10&v|urneH5I41y24 zyo>Q(sB$oizGD)>M$bs`vE6|RY+lBpsOe07SW{gsHM%x{2s0$!_)D(3)t^ebS^*-H zK3#_`=46#>Lx6A+UeGM{R~S`bzKe6~Yo)v#LU;A|ekrUuyD986+Hd=zxCb#qKVaLT zAR|2@mGM~-}Y-B zPYNQRVtNZsF`*}j>Euy0ntf|U;yr;%vS6n8N-^O*w)zR}i2FoleT`XG84MJdZbW9; zeWr#9r!Uvs(e4aYZ&iwKj{{lyq0YSdi?tuTajtNsMiH3jR-rDQ>g0ii=Z-ynK?K*_ z0z1j*Zry*~7jUreF_=u@n6A4F+};-|d)VCg2&b0&1wk`WLhEmTsapX?<@8WKlcf6U zyvG;s{T>U+^~FDChs~8b^H#}6%ZgGl7J~6O@t~KYo(o9XUzbn~%$`_Jtr+>tb1=rF zWCydCr1gc+l)uIvuv@3UWvc5Gl<=5%3p(<3{N^iy6cTu)YEo26Hvy48-_f|nI6Q>* zE}}ZktLdEmplZ}{NpvmxLc?T&RXUh`Hd*%eyjuLTz-ovtf>5l+St`jT00L22iN|_0dAT=9BF~ z+Y>}I4GNBL2W<1Fj!)HpGS+Q*K6ETf^n!|yi@Qt6Qw|_D_#G-HdtLjH)FPci#n{-Q z+$~?=LgPGjA^{hM?MHoF#5Aw%N763|B+-*d8q}yO)O2#zaIWT@^J`}(>*n3}L*7<; zKYWN>ks@Tlcv}SJ!MCBNa@O-sewF3vQ=ta=sXLN!3fb>JR~8QhLW>rcY=B#BxY7Lg z)(sNTCTiphKXQNa-fz=GHi8-5?oZkyFQpe7r)oP|3W1lmUecf61Q9~wq2qt3ab$FN zH%g-5g7Pe0iOCCFzmZya{SHM8u3&RoLD`!A$_EkIY~#vk)b;T^>POiju*7@(fMznH zJ9T0%Lm#T+Hd`6MDnrG}@oPr->yS4e-{H=G$&LY(LAgiTIC0xxy?+1>^xmk^z>t;EwCfy)wl^Y-ew7B$Opp2)2j4sCW zA?|yx33Wu?;nL9%SEB2$g2Dg6U)I6_)e*g3bGp=9U3Tat+&0Lq@_lDX>~U9 zxZd~~3>+D1&e&Qf$-o* zqgtIbbI*;SCl`-ZM^C=3q*PHud>7OIu)@1xbOhe&Z_}WR`Ia>gWPtp>T^R|`EQ6*9 zUs0JJH+`w>fDb%kc*0^}2Jdsp^AdtQ>YLCGC~%(qaqFx$#`ia{9!K%!_GxtouMMWD zmz(L|8b*2`ZTY!7N>%A)5#nr^-Nq}Dx7=r7G6;*dQ`Gup|K%P9MB9;Dj$*myaD5oD z=iK>wrI`jpuoC+Dn`z`+Fy+FlH`pbpQIWmD)f0(rZCkUZWp$DbIFEihX)XUoT*@xl zXXO?3sD*fKfLhp?txU3<-S5d4|5s?oPU4@9U3m1VYSjG4?*p~JW>;Zz_m6)8h6UZ= literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/drawable-xxxhdpi/ic_dev_badge.png b/echolot-app/app/src/debug/res/drawable-xxxhdpi/ic_dev_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..4b74edbdf1dc2056961d7a02b8a472795066c9f4 GIT binary patch literal 3761 zcmeHKX*e6`7EZOdx}hCa#H6MZx=^K-+Dc|d32h~))>1^P)(DD-NQkPf6*a1MrLC4R z)>71vL{Wx_rD{)NEUDNMTS!FYX6EPpfA6pRJ&Jm)#*J?Ht(d*1Jf9SkaS1b74h z0La)_UvmHe_SO7-4;_?P{)Fjh006R)HrIZ3j4W7TAc+OTSn1VV#!DA&)wYk9@8xHy zsJNzy*!Q0jKIq#YJ%c`SQs+*-mA_+|)0x{SOUECdKfUAV51HFY%nB0%;3kx-t zp!xs#e+T}v1F;#Jh-h}F=$rru_@ORq86gEYR|MGqgN@X&Shd4Cfahwh0PE-fRYU#D z<)c5iV}h7N*m)7o1S!Z%7{Nz6rl16F7$_1Ab6T3CkE4b^m)1LFMZY4|hT22DX|+`j z!BC`u6BL1u4DOo0LLSdFwbaVHTYz8b*EZsF#4(>x+B^z5xW(X`K^v}R zbgWP?=sY>mPx+!K+=VoIPqQnX`XLTeoUFp(I zvr_dUs%X=g@eb~Bd7I5E7oIgq(L##>u+KZxd7{{6PE|pk6~OsaDm@9ovgpM;auw~a zbjtgF8OT(=_L6EfS7Gqbi{mzZ4-B$#cwxx29)dAQ+LiNI7O#5=P1}+#H_^4S`@1(k zQ65rXvptPZY@L{KP%u#n5D}|dQZkM zU4+&EGaC)|IG5Co8ThWGfrdTbz8yTF!F9EPkGcxpd1+cc8rlU zTFp_BLwfQ)$^vf#G~PO#mN_si&?wenCQ`E!p_Tg7ELC9pct)V^TE!mg@noOlN_Ha zm%&>TEm}dMg{cNPMOosDyWjeP%3Xvzef#CLCL@TJgif}(T6xLt(u-SAzbk&o?s=1^ zTElx)Ba6zSgzk;LoZE+0G6{mG#2Q1`GssmQQ7G&y2PeogqK^0cD&Cv04i~JR zVp){f#HLr+MI2#ujLk!K+Uz!y0>Is&Nw-pTXZFM8PPH#}IM-E_w>9x5S)n7_`4?M;oClEfsE_zi1 zTdvJ)C=lj%U;}p~!^zu-t-EAH%h&5Q|A5VP_4~)GV0>-g)|MU0NAymES~ATgnL9-4 zg+_I!Kk42zEJ`!|Nq@H`h7-rXps_0UUzEhPz@6DU-VqXL9jRZAa8n=*c;|S3^hdhs zbr~X*G~(;%_X~wL%7vXrD{UJ=X(q=#)vCwxR!&Z>InYgP!HWxil^)Hydz^C(#2nU~ zHzVomQvew2BFpVBK@4oY0Z>W+F zSfhazHi`gF^*(GFPj>N9twKx&Z=Esl0_%0>pZBE}yC~$e@`bS>2=PSdQ04VsVa?FPJ+M`fz zmKR2u*{D?|)TzK#VnWmn&PqJ*DwiM&3hymD7E^1>j9;93McHbiU`MmB z(B0K&o}_MVbV72&_`SwC)z2Np=d1BSsrSRK^O6~17MPA3y})RGObaN3Y_rnK$&(n zsPJqx@~;K{ncC3`w!verl7vYJ11voV5Q&?uTpOWH&WupZ-~W#Jaha4NQvUgr6!C#* zB|~~bx@%@DHX+)&jG z7jd`!%b{i566(y23>}c94e?Dl6;4d?d?Xa#GSp)UV!_?Ml%{(o=4;h{V7G@$68ewv zlenNj1X{SYM^iSDd#rPTsqCmX$sq^EG;HB>WV^~jdJfg`dNKoo!tuJ0@V8%TF*TdB zwmnl=)Y}?=>g%lmY4 zXLF*H(DT-;qAd%;IERdp>6D9Oy%EgkF( zB1MrK1pdq>CVqUgS(<>i`vznr^&XQ5jq{RWLkKqCq?-mg>qOL6t9zgO68mttiSce< zQlhSf{=#YGpWA$^-iTh9i|*w!^-qTrkT7M z=vn!_Z-;bX7hWHJHIP?*YSJ~70n!@AGEf<+Y^|G@@~6zPeQ_?V8`%+=+8%V5EBC9( zZGX*D`xiAtT}#CYW7RH*cAL}3!T+dg`~Cy5w~`J1Co=j!#k$+mJ(bv$?_FA9{gOW@ P0AOPYyH@p!XWYL5U>SJ@ literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/drawable/ic_launcher_foreground_dev.xml b/echolot-app/app/src/debug/res/drawable/ic_launcher_foreground_dev.xml new file mode 100644 index 0000000..7b7f2a7 --- /dev/null +++ b/echolot-app/app/src/debug/res/drawable/ic_launcher_foreground_dev.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..be66051 --- /dev/null +++ b/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..be66051 --- /dev/null +++ b/echolot-app/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d741c1472e6710d04765be2f1fee337b39d0ba64 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/echolot-app/app/src/debug/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d741c1472e6710d04765be2f1fee337b39d0ba64 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/echolot-app/app/src/debug/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..df2fe2bff1156386eef3dcb5403a1a11127f65fd GIT binary patch literal 2312 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/echolot-app/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..39c7b82443c329ce33ae350853f0b037268b601f GIT binary patch literal 5182 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..058e3fd714349d090e99285e89c50b488055fe55 GIT binary patch literal 9239 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/echolot-app/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..058e3fd714349d090e99285e89c50b488055fe55 GIT binary patch literal 9239 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..19f836d74b75f04d22a1fce23d47518bc15f1187 GIT binary patch literal 11707 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 R_JaTb002ovPDHLkV1gV&I?4b5 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/echolot-app/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..19f836d74b75f04d22a1fce23d47518bc15f1187 GIT binary patch literal 11707 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 R_JaTb002ovPDHLkV1gV&I?4b5 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/debug/res/values/strings.xml b/echolot-app/app/src/debug/res/values/strings.xml new file mode 100644 index 0000000..79c5982 --- /dev/null +++ b/echolot-app/app/src/debug/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Echolot DEV + diff --git a/echolot-app/app/src/main/AndroidManifest.xml b/echolot-app/app/src/main/AndroidManifest.xml index 91f394c..f1941bc 100644 --- a/echolot-app/app/src/main/AndroidManifest.xml +++ b/echolot-app/app/src/main/AndroidManifest.xml @@ -13,7 +13,9 @@ diff --git a/echolot-app/app/src/main/kotlin/app/echo_lot/app/MainActivity.kt b/echolot-app/app/src/main/kotlin/app/echo_lot/app/MainActivity.kt index 242826c..becc9f5 100644 --- a/echolot-app/app/src/main/kotlin/app/echo_lot/app/MainActivity.kt +++ b/echolot-app/app/src/main/kotlin/app/echo_lot/app/MainActivity.kt @@ -138,6 +138,8 @@ private fun Results(doc: MeasurementDocument) { FlowCategories(summary.categories) } + RouterPanel(doc) + SectionTitle("Networks (${doc.networks.size})") for (n in doc.networks) { Text("• ${n.transport.name.lowercase()} ${n.iface ?: ""} — " + @@ -175,6 +177,53 @@ private fun Results(doc: MeasurementDocument) { } } +/** + * Who advertises IPv6 here, and what box is it? Pulled from the link.ra_source evidence and shown + * up front — a rogue/misconfigured RA sender is a top cause of broken IPv6, and "some router" is + * not actionable without an identity. + */ +@Composable +private fun RouterPanel(doc: MeasurementDocument) { + val test = doc.tests.firstOrNull { it.type == TestType.LINK_RA_SOURCE } ?: return + val nets = (test.evidence?.get("networks") as? kotlinx.serialization.json.JsonArray) ?: return + if (nets.isEmpty()) return + + SectionTitle("Router / IPv6 advertiser") + for (el in nets) { + val o = el as? kotlinx.serialization.json.JsonObject ?: continue + fun f(k: String): String? = + (o[k] as? kotlinx.serialization.json.JsonPrimitive)?.content?.takeIf { it.isNotBlank() } + val ra = f("ra_source") + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(f("network") ?: "network", fontWeight = FontWeight.Medium) + // The identity line: vendor/model if we could pin it down. + val identity = listOfNotNull( + f("upnp_manufacturer"), f("upnp_model"), f("ra_source_vendor"), + ).distinct().joinToString(" · ").ifBlank { null } + identity?.let { + Text(it, fontWeight = FontWeight.SemiBold, color = Color(0xFF35E0C4), fontSize = 15.sp) + } + f("upnp_friendly_name")?.let { Row0("name", it) } + ra?.let { Row0("RA source", it) } + f("ra_source_mac")?.let { Row0("RA source MAC", it) } + f("ra_source_reverse_dns")?.takeIf { it != "(none)" }?.let { Row0("reverse DNS", it) } + f("v4_gateway")?.let { Row0("IPv4 gateway", it) } + f("v4_gateway_reverse_dns")?.takeIf { it != "(none)" }?.let { Row0("gateway rDNS", it) } + f("upnp_server")?.let { Row0("UPnP server", it) } + } + } + } +} + +@Composable +private fun Row0(label: String, value: String) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Text("$label:", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(value, fontSize = 12.sp, fontFamily = FontFamily.Monospace) + } +} + @Composable private fun FlowCategories(categories: Map) { Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { diff --git a/echolot-app/app/src/main/kotlin/app/echo_lot/app/RunViewModel.kt b/echolot-app/app/src/main/kotlin/app/echo_lot/app/RunViewModel.kt index 4731468..c8ab7d4 100644 --- a/echolot-app/app/src/main/kotlin/app/echo_lot/app/RunViewModel.kt +++ b/echolot-app/app/src/main/kotlin/app/echo_lot/app/RunViewModel.kt @@ -19,6 +19,7 @@ import app.echo_lot.probe.StunProbe import app.echo_lot.probe.NetworkInventory import app.echo_lot.probe.Probe import app.echo_lot.probe.ProbeIds +import app.echo_lot.probe.RouterIdentityProbe import app.echo_lot.shizuku.ShizukuProbe import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -82,6 +83,7 @@ class RunViewModel(app: Application) : AndroidViewModel(app) { val probes: List = listOf( LinkSnapshotProbe(entries), + RouterIdentityProbe(entries), IcmpProbe(entries, v6 = false), IcmpProbe(entries, v6 = true), CaptivePortalProbe(entries), diff --git a/echolot-app/app/src/main/res/drawable/ic_launcher_background.xml b/echolot-app/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..aacffeb --- /dev/null +++ b/echolot-app/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/echolot-app/app/src/main/res/drawable/ic_launcher_foreground.xml b/echolot-app/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..736f111 --- /dev/null +++ b/echolot-app/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..93542a7 --- /dev/null +++ b/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..93542a7 --- /dev/null +++ b/echolot-app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/echolot-app/app/src/main/res/mipmap-hdpi/ic_launcher.png b/echolot-app/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1a55522254da870ff43d019b41780d99a5bcce63 GIT binary patch literal 3907 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 LNkvXXu0mjf#;hwG literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/echolot-app/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..62a85f6bed0cf11d4f754c121c769f457aa621c7 GIT binary patch literal 2185 zcmV;42zK|0P)hh+4atPH%`>hlF}wIwOdE@Cv^g90!a}m5HhHYXbI z%-l0~zI*O>e(s$RdgMp|9J6v(8lOBwOivK#Fuh!r2 zOEIDskZ&mM+Bacx^gV#TKxB;c1ZHfA5JCPiI|tBlPVmjjwX=Wi9z;3-e`929-w_AA zY>X+hm3FoOnOkW2r6Sf7@Bsw@oO2b1eY!ez{#Xk$wJkro_lOC?pNl>-Cqxut6A8C4 zkpbD{%X8Cy5Mo&>kA8d{#-1mjz|2fUrbQasXyEAJU}i@|#6SZs*;|?Z^Hs4jGc~_& zOc=3E5`aSP;`|1&f0?8>46{op2qVYlMF5|t@~+885b!DQsmk~N17YzCf~A87#vLUx zq=8Gvxmj$!lBD<;teA~EDinH@Wk5ie^*8e%+EkL?M?(hhq}HH#b(hs}EDmL|F>Sr{ zS+S~_@0J;eIu`F|c}*q=i$%Rk;yOs(Wux@bYAc3dc*Dzx`b~hd2%{pld~{qd=ij-a zFF`*`t+PI9==6y?>>%$y0#W9rt|T4wG0?i}!~bO_P-*vr89X+f;;4Iy{a`6rZY6dM zwq2B{*Hupf$1+{(c`v!AxBo#D@*)&U=VZ0C%L+KD*F5Of)H+5|t@Rdr1O&wb$OK*b z0bnhXN~0GOk?O+G3jGfNpW@9#q4xV)z|%RVLLS>bvk#QdL5e?VcMFTCow*1XH#~41 zsD+6ND1UkqW+<=GMv60DY@+hU1@OY6Cvq%@1c;yQBJ)&i=>qyII&8f+PTa4?<>DWuyu={h2a7cCb&g! zQDH`|-oWfHPwIu8o!3q%|0V6CRXk>0H+g$|+)5!WgF0i&Y6FkVF@oU;!PYXuttGg` z!X^$oMgn}OAa%J$gNRxD76ICbL4;1kbHwcGx9Jw_pCd^ojk)&2)b&+@TV9;`5g6>fDRht@3Z*f!7{oplNK z_BHUGZS_uD&k!{d|xIoC`ojyqRX3yQIB%qQ5rJ%_V@tK+3#-&D)X zA?I>W+C)bw?$T$i&&tdCC({>Cw@~q}J=vVNd%+QOIr08Inz+Ol#ECyORz%!%I5ibx zzc?{~v(qsSjzx%a1}CTL-ieny3-yDwEPy;-)1LY^1^OS#c{yY~U5imV@Bqet`d$5X zwHPKaI5Qn1$`KxWsHB{iL(b)%w26*e@~o}J+Gnf(K{&ec`aF<1k9F<`$YDae=guXp-$j+5@XsqfbzMn_pdP-usE?;R_guqH{)|Y4+^CW z!B%4=GxL5@okLKJ@a|lKf6Vwq78ptS3^!jzQ%Z@Md3^@5K2TbAYJu$7J>GOZkWNXz zCD5{`y}s^OE;KbE$vrb1fg1~`p1y#vv4EU}%G7sEG=wcudKZS2Lh_7TXnKEYEy31W z(NRjFPB>eG34}#W58#fkeG%pxPk5k1d0hRO35@SDkUe^n{ZfN*& znipj=aBc7JW*kL#-j_KF^}HvwYWdJ!P#EfpOB0hUQchpc$fDU=COeH-BX!mT8KO{H z$mNP9y=>O2{w3m^Bc&AvDpt2%pMa($CKL40b?x6}{d0yW)G>YkDNrz_GPX_Juh%n| z-bS-lQBbYq(+g^4eQ>%)&ZtkVHFZDq*`g4w5TpB@-wJ&%eq&2E7CwBhlhxg-F3^uc zyg~Zi`x1pa#%n}W^oe0LA)RVH)2SUq(Dl=2AAh8_4Cd@bb9vX#y2 zrq6IJbsYG*0qAwVpCVuP20gd7T(>Uztbe4&mw9-dqT9zFVWRXCQ}6m<6N~dC!a)8~NLIO;8ZN0N`;c!_vO6F+%CD{GSc{f^G8L;s<}f+``(e(UNvU zVf*MIXUvo2a0rB*0GDrJl#(b@0dSoOCyaAHYuubp|GP~Gqg?zC#4>Akc}U%Z00000 LNkvXXu0mjf#;hwG literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd1f87897172a7e5cdd941a9ea4aa690a84ac79 GIT binary patch literal 5058 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/echolot-app/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd1f87897172a7e5cdd941a9ea4aa690a84ac79 GIT binary patch literal 5058 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/echolot-app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc0fc4b1b134d3bd5c774412c59ae9cc9a83c35 GIT binary patch literal 9480 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
    1~QmC<_WQ+6T1H^FG5}3o@&VBxC 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
      1~QmC<_WQ+6T1H^FG5}3o@&VBxC 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 literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/echolot-app/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..68eafdd73251457dfea1500fc8820b2b81fd0c4a GIT binary patch literal 11941 zcmV;WE?UuvP)5d*)#u#13oLfAi^U!Q2!ObVgCGENK`FvC6tqd(f<@YrNZD4HG%1=6|B-Bo zFlkbhA{-ViQsxhbNl|2kAV8!fiVj&Jo8s~SK|+fK333TwFJMpXH8Z<2(`Qws7MECsqU#4JKJAZ*YWbz%gmQAU%nI=90}~-@8H0J008}kG_mLIo8UM%BT%;r zA>Ih!W~Feg0CGxTOei%5A>0A-n$TKFDNhNpBovkuP!s|epzw--`f;GdPXYgxh2t+A zX}C&a|9*)B2Yk8%20&r}&yc_q06rEfeQw_!J5nn35Fj2>0uMvsW+COIU~UAIQnm6k zPH1RJSQQfxj1|996$Doy@Ul>N29VEGMd_L1(HBqGE_~bpo>q;GWzX5`<_H&&;1V^rJ|R zz>0(TR)GC3aKIxpvG?wWAe@f~g?9 z%Bn)}RREt}IQsmvjXD;m3P61scX7F$_iRt6#YdG8zbd4Z%J<2p@dbo!>Ej~s^~Xdt zGjIL*5wXEasUQ$SIFK$7_`Xu=fBK&DvBGQ5y>9eY^ujD6#a$y&*Tjsd@qPFHt5jP4 z0FL`_040^@@n~K^&^e}mGX+hsq3B>g!O(ILtTQwk^gSO+Inr_8@4CTrQ@ii`m$fkg z>)v|y0Bo1}(>LC;D{$rKgmfM=rjDloc3TQFs%6X_K!OuFsP6SaDNji0(!f~-{$EK? zePI68L$9sXBwB3+2)m&1y?4J;3g>e|$ZbJDExwRceZw(cLM@42aU!FxD4>CYl&+(K z;H*OMfrVp-z7{pX2Vnw*51ZQirr(j${c`|T`5n>tPRYbga3TlvL?0yS80(tAb|Ia= znAmskZ(9?5HTv9b14Iu9aNBL^iAwg1Qo8R}zUP~vi)?Jw5}e3E^+6vDvC<32bpqe} zl=8iA zpjiB83uj-t+)X9uv;y!ACvSUjlPXpJMmX|KD)2l3;U=y8+FG=vp}?BtpoOVC;kd2} z{DUG>`ukT8AD->B5_DoS>F4cuFsDkDuW043dO$5WEy_%SyOTp=E@Dk`(39!HRYA2X zq;sz-Wxujx$Ah^}eGIa*u!bkZM7r`N;W&>f-}31<)6c?Y-w09N|2v0-tW;2qA=>q)6UfqQi(^{pI;%;W(~e z@!zxb+My@gRRYo0<3kHog#3X3CbiO2JWuUOkvZN3uSO0OBtkJ@i44&@UDAO>JcA5e z6%}#c)l&zLwHg#R8v_WvfaP%qN_;^GIjywz*OcExvzm_tuT~CL`4btUcXHqm1W7t8 zq?}f%;1BUQh3q`hw83vu0cgEq^M3}Js1SfJpT=hY>(~ce# zyN^u%-7D|cD-ub!m$mlGDg=czZ*$V(MF~*rZ{vOv>IcQcZpKJr4lAW0tD5&c`NqP@ zgEo{pG=&;!#N&LqLfUBa^O|y6s6C)U4KT{18BGBjrZLG>HiQwy5aYP5*lW*N?$?X-L>%Qi!WQ9 zH$8x{i)8h~LOL1h2u#h1T$|uT4r*BSfppnt-IngZi|V}f@Tkchw`~g2=_5jjO?nMl zl8dMRqO#imuk-($u6IH-__iKFh&KK9Mu}F9-8gfE=Um)(0L9 zxTUA84xUtp1w`JQo%G8IjUw3$T!j>zTj!1+JjsJ#U#dr?bn=vMq84tQtY+`K9Qb=8 zXH5f<1GWD?>AENUN9m~c0try2=GxG?q1#AspX9*b6FFm$I;ML8%1ZmNsQ~+3<*NrN zf>aNR8w{WXCvp%Yqz@2M>$-Xb`}SqT*xtKtmw|W=0y)Z5zAUd#LJ5r)ks(Bj1xkT% z@0UWUTOb4}KX(C*rfGr`IjGUn2g+JVp%Gbu>P;?`yakfN<|ti%B=9qu+AzV19MlNu zgZ<*;W(s3|B>NYg8M87`#q8QVC7(D2dEOYYt@jv{vW-HZBj2n&| z(2*Ooa80uxzK1yQneeY-BlAWasSRTif>wXom41L5if)$~HjSLRTFCYT_goDzWc67 z`&0{tjvHo<1u${LZe*sW!P~D!Hc}IggYx`57EYZA&&7!FZ`-DI#cIg;Z-VuY=&5zV!kThwIQeglb!oz_ zO~cwwhhv2KyAbdzWp*F7&DKKQu;;1BT2)l8@#HBz`siHhT*SZ@v-EU=n7D1&Fc~L{kzl;(8Vwm}FQ!W6mtq%>Q zi5I4wR2+%o#n<8HvdB!$EO*1XF3MNtQMh=XU2v%>UeQ@IN_YX5oi~|29~R z-*{(ahQNLzo|p|wq1|!QGmvH?hPvJI{49z*5mUGFVaWJD->i{}5&r=%8_!)!?$9CR ze;F3G0t^vx3{b!=j+06m`?>-}8(31y6L(7Zj}?jWU3XeHP>gEkN|?SX(*={inT9f> z#DCmL3_1Tba%$b5AXty&c-FEfySF2M?=5g=qWpHsGg|U1xDv$W9Ss8OPZJBI*U;9+ z2_ueK`3snN$0OMG8@~*9^Hg}wYKe5wyL<&_f9H=d|Ml;{naBfv(2@sLm#CO`Ziu{x z2JA@q3k6L7!$)xaufG@0rpYyLVHooJsV`#we}9+x70ho3{EQ3+#MrJoDAXzJ7HcnS zL@~9br82TN?Zn$n_?;jC!d91EaUk5{tL=SPeEkTdSz4-er$&=cwna${NOozM;GuH1y*q!37b=258jTW}L zr^*$KKXeD2sc{5LWeC^dXva1Exeok7iA|G;|eKT@>4TPR>0I-70Z}-#8-7L#3&6FWvDmNR?s1d{~ zS`UF%wuSHh5R1>e$Q8j>g6QRS*v_j|JuE!?6IOomsE{cXw(hNXtLb>SIa^aqy+A&T zxj#FA(o3&l?7`b1QaX^gp(Clo!YY5Mf{BOjz{JCM>E2@{vrnzS&j?`q9^GZB%j}yO zMZ7`{V2@2Eg{6Zp;q}iv4QG0sU71$NqYA$aQ{|zaV{(j_JL;#J6pbzUiP%GJ_~+p> zr6!rov$v-3Lb?gMbJEeUA;g0Q(;Y4 zOD=o&R0+~>r^ne##4UM;L={M%Z?(`qy%lfa++^+aCRm?J+2sPRWISl?kl5oxpBm|=i`H00u4UUl=!hSi znuN>I;dn;0D9h+!{mlf!MSiow9zk4R{LZLr|8iHn5kqR#(5%ovUa4xE8@d{QeM$>`MC9g5Z!k8 z!-Z`y)XG)Bo}+rk1K(3b2Fv=8J}2Cx)(n%?@RwH&0jAHoLGZ?*PAubYt>+eZFyZ(f zji-%yk&=SEle`{*h>p`Z)${eMkwX6-4dw3vCp|c4^l0N%0NeC-cH*kZDsR{xsuCN}EXuR@N=!POY^!iXQ|Dmlr);TJ+hzFIBaY6VdP4 zl)zL@^0k}B9Jr3)K{5Ri?cS2YWLDw_uNG0RDmZon5UaIKBks^qdHrSOZM@GYVjBw- zjfb`}7*)*gT!%X^{op6?=NI&{z+#EdA?(dv#nQ7s;g}l^321dsBg?4rzhzGj(|HFa zPq*H#*-PTwyoci#E4Z}ea|>=e+-Tq$-TKTNKnbq5j5*kIO$u8lT@L&Ad~H5$8h7{^ z-#gw=3EHH6>7=|1%gVdnDN6=`O&u_~K^r^(ql^OuC!0p;m6JI0+h63BR_>$@d?U>9 z{6|i*La;s3XbxFy8Vx#yZ1ekX%wj69TYkEP2Ea6sedcHp&mJ%0!h+8YaM}^v;#1`y z1*SjO9HVQ<45D+tf4qcejummWsE{(bJII`(XFPCYmak*CYB(scJwb$7E^naA`|?Sg z`IIiN(@@@WU3pvFXVkFi1;p6S+w}}hoiH)_m=tKK#A!yxAH1Dk{^Ab~qkQ5V!wreS)wOUZ}ZxvDh|F@(%zx4MO&e~g%UD1>he-h-BOq39XU+zkSoAO zB}eiqDOxZ>3Pei}=})h{ZBL}66<=ZJw2S-qcTlF|# zsic=lj^!lAGI}ClsT^RbsQ2F;&q_U@W}OxAjal-*?ku*MN>V8N8AnCFbJ+YHo}-ZE$I}S2zod4AhPhh-L=~M$T$MGY|F4>lm3w@Ggt8O z{A)Gkr}M}}S}X@V5AgF3OyV7PP2i3lSzJG@*CU<1;^D>9CH&L+);~B~B zRJw-`h38L}@Ni0EGVk!fn4U?`CUc1@Nk_>YgVmOIRIz}_@4UUy2NVm|R>C#XzYL0h z{uJ6C-+N6OcioU>Y*!h6_h==Vnnje=a;H zyr#$eSO)@yDX_xQ9Do!!f7N3oFt&XMCU@_x7k0>>~R0qhb^K*BN9(5 z;22>oP=Ubrk=weBH<%8p)jHu4rem4uO~_rljnB2$_L?87pt+RPW(n~YP|K`aU{*pi zNAQo|GzqoJC{C_gj=($bo-}({=ow79FZBZC1)^sYZ@DyuR@XnLxAI49in&`kb@&s9~ z{2)L+=di0&u!pGg*549cL)YH9GlP7dY<#od0FO7c+togsc;VEZ4RZmiS6Hd8xOJIHStJ3~R5%j&xdg6%gHEZi_&ilG|y6mj(un3i> z+rn5=qj6<)Ot77yXKa3m+PQJVez}amt2Xa`!wUqT<5%i8kmwZ;wpCM+Sbh>>N@|af zRYU3>iWP;63m%V%S33rvw?p?RR z4DL0Tjb>1sFfmHIx>PFcYLkvz3*3qlC6IMolxAlUR4c|jXy}G}f^|#}M}3-~$o?if zTxWX_JRl`6&<{_Qpm?m%eHGwkldj}@EENMi*=5o@QZSs&j?QBOnoQ#XiRQ28@)uhE zrFQaH4f2n!J&21gHDY0QhzSQQ4I}$FVEV=;fa9R>`dO6bXCc$+I(HjkI!3=0&!2;k zIuKv=fgd3h$Lf?!t4w-F1J>z0MV5!@aGAb(@G1n40lK$?I3tm-_#XP%2=6_UcTAj- zcDYgyK|B#}EVDkzzt~RxsWi$g|FeCSe=l)p0u2MP39JHKJ$?j>XHRiAYhSikDP!@> zDgI3nO z+~pbGl_tdKo^DQJZmxyH=d72F#cQ}5B{_Ljm++&!9@bpLL%q{r%h0mVkYx5ZyE=;3w0Y#wl8e_{x z!N-*XRk{|7{6|gxJ*J_l0Ci+%DQOo*8iAT)gXnf`%Rzp4ip0b`|_BgSz#I@n0tQvl>(ba_F4TX?`SWGx&GFMHNkYk2EmR4RVwQxg47+- z?kkiXffb`sZuJ=jY%j25#>M@+X-T9$hfJY!SE~5_@uK#QkiVYnbrUAdOCJH`vyxYR z(L~!)$w#56wRp@diDa{fKH0~w@a8=^Y@14C;?3ZgdJ=A#OnOC{U$|#imcyTI9w9nLtH2JOD)BPQ z@CCLhFPSQSi}K3xoE~Av;k^tPH<&;hgIF0B3YhsPZ^QNf@qKWo#`(B6zlbxR`U2*@ z`px>C9$VijoPvF5ZysAFwEa&+t@7NGj~|{cV|LN!o`97<+5+({mSfU$YWXS7|E`@G z_WDHcOS8k@J61HkQKa{7(cP2D(|LJCj7*e1VwRn1W&*W-F(ZK~GeW71>@B;n@5>+K z?M8X)Q2HsCfvR{o`imdsyg?#sg1Xw=vpz9ao+rf0H2K9AhjxXYob_<@LK%ytTAIYh zdPTnkN>7(fk4R3^YiNz7HDY+Jv~*j60k@olG7MaWLW6mlk|H_i9A>>w4|xxRdgZ zKX4lgFWT}(!yMFTV{$IkdWV>FP5s272_oU-DH)U=3xq@gHsoO;o0yNQ4(_j8Z}JFH zC3xmo0e4)V!LBW7?ceux+z^cecFd&skLLj*8)lF@lT9R>9E+|AdlCKniHnpRw`7vz znwGzTQ(fNQ4x=dV=c&0WE-v_N$J1T`6edA7JohOk#@}9E%MfAGEe47c zY@L~_;?%5%k{2LtyghXm**ceZ6tEcs#HU8~6?Yjh#&TN4v*;_OE2IglBj+nPajD7+ z*RPpyd61lSZGv3Q4V_mprqbL}z_C3PYQb?qlr%Sz_ot3xQr@A(;TT{8ks8!faue%6|QZVp+D^=d11D#!&Lw=V1=;C%NyeHGCcjAeEoXT zOEX1$aZaIVZl4}7&~*=hjYYC?k6^u1>}X>B*}d}gf(QDhy*~OlukWIX7!yoqdE=E} zb-zyN97gfYoGXu6*ixgm0ouaHaad8#t7oNzcwT!grgUG@a17^8tp=xVB@l} zI=&J=Dk6KWe;r`r%_wR#^F>q4vH!X(;YH0046PJeHl!pS^E0H_me8dL2rjVwjI;ow zhIPRswoOxA5K!eZytxH!MouqJ2PSIe9H@@CT?w!nO@BjH~yVCJ1~#r41WD;&XDK+$Z5fo~raKA>MYx-$F!9LU9A8h$YPG2;KN0IpwZOVUmNEI(yV>mVX0LDxlAe=j z(gUo(+puH$S4LGAUtQ9|Xy>H#jKz*;wy+9?h zrD=~y=_Qb~G}6|}mH8PR%soJ~>T3s{6~yRauJx3mA(KMk(97@(MaW#1cTlfeD6$%& zF4iDq-eb`}Lr5)07#ouC{g6E3Ig`;ptC)9`k?xEy%H~ zPB+q)ADd3M9X9+HN|be z5LXMx-nt7D58VlwVvq1DNkCProMxnW_*I=@fzkzb#haa;S&k9%yM)|ryD|QjJHmCn zt7!%Z1yv6V&%B7zORuuWO0NZO&BG{SQvq&?y!SY?(F4L{i@OfDtYov3mt;+qit^)U z(ri{Jvq@a%eNqQR{5q0-`s~g$tH)N|6Vk+8Cap6=G|TtDK}h7b-4aQQ5+D5>7!Fef zt})F95ziW{E_vwgSvsu2nzL)pfSz#a>ljZ^eQ^QzZ)L9 zd_-hm-Mf|m@oA6-g$J;JMcu5Hb`#OM(g8x$MT;g0r&Sm7jiFmebF z*pCEbP;%hjpmB?&XzfVwVC0a{`jF`jbOngEP8c$bnDLYFKRj56LPT1mp=tH?XolQ( z+J$F48L{9k;XgidUIFVKATl6}y&b9nZ^$Mk+BSH?6=nYgpTjnh0LZckf{`N9#pF+&tAgP>t||Pt1t}@|E1YWC@kaO-Xk7Z z@kSfN%YQwNPK4F{Xsb$`aP4zy-z~__Y=-i^F!KTD)TCX?=Pu#O(N|(vmbLJ|-io5? zD)H3bVdcLOYtkmrvLE7vwQV2xKJweHXW<7`y-Bkr!a=oy?93KEhtAcPixJ@8z8|a; z7W|LGJMz~JBmb?i{)@Ol*PEf%m}WnnbOyOC*C6mclgqw=XyJ(O@i|V~Z2UH?{HHAc zH6>d=QhJlW)Ufj3o}}r-%-8j9En8p;G)t!;omBmDszxFk)k#67X{(=Lc=^v*{^Rgo z1oPr#hL!(zn35E8d2C#x&VUdnTw}S(##&8CdqZm{4k!OLvY98;I^h}(C;u(6`7}L% zN!MWu5F^Ylf%my8vA3b^VsPq)s}(-i&J_$F|5f&Vqnp$Eo8Z!RdmWz&Mue&+iAJTpzX4onec@}6QhTVyquBo4hxqLC42y1M8;>%X58&{zmR{oXN zsG;FsW6d2;;8kc4T+pSk7F|4;Y>p$G(tDuP-!#}YHMdsThlPJfukq!sxAuG7`3GxC zB=!2x@NX)x?TZBp5=t!9dM$gJia!opn;ITU{`oMWng-bvWpTxt)R6Pf*4qNb0xi{w zWKT=*;N(!F1P?|Ikz+;LlJ=5y5Y=8wLW843?FTOhYJ+Ipf=e<`;;2#l$QEKzt1rR* zlS9o1`-GklL_>)o)rjxtRK`T zxPNkpzLP}GgOP*z&XKE9ydr(5my}XP6Bkt14%vptwiQ5@&K^4jrM?Nt3&iv`=l1*r_fZa!_mapN z{g(p*qvPKw&K^BYx-WtKx)*T7lOmi9Hr+;o`z#0gn#dW0)i>J8^GS{O+pSTcuw%!j zOeOn@5Mpy}xxjjlSQ4DbLG*0&OEKFjP?yW)%1yX(a*j?gYuDi5^yygv^(SU6tzX|o zCzR08lTYqX1^ls5eje}I3`eZ(f$#o)5CmoWW9{0+QJu&^4KwCOUMasQl=|<{A8iF7 z|G!hY{PN2X>M2M`o>IHjVL}NFH<2z&PJ#8O<%`FTng*Wdyc%=di69XF4T170X;wpZ zN+_XWBnt15q|<@&|7)XPG+F_u#h2BKM_zymzDVoc6fOLW45SmB$N@vA4>a>j-cI#} z>V*?OGCChxH;p|2J56O!{Y@1Fvw}v=cHT1L6H0I*2Q>uxKuN2$=f}S!gX(WJx`mom z0J4i@;nK--Q0k+m=J;V+Idg4-dnE@=fjNZ$^wEjvwQMmZp>qg(};@#@(p~x}% zlbNmi4hSJ1Qi1Q&76^7uO^1w{_4Nr}gB{Hn;X3hLmy1AShF0c|i>ORUTFy4|({ zz|NyztC9o5NKHua+T>t*RZozv`rfBYmySJU zl;8FM%c$8Hpz(K}56E1*=Sd;m#})691Gh1zF{uNI9K`zT11rA@yr;?+j=#tJWNm+R z+XGnr<{OmLmG>g>zR9%NeLA_uXa`cTy^zyFPL&VO%IciSoWN@^@kaEt@36!r9B^y!Q`O z;QuK-n5UI_rF}vP4UUx7M_&jhrGnt;O1}D7x5`hn8ojj-km+mp{Js><2RT$4Wi#kxrS%r*P=DuF+c zLcE=O1Epwy?9^>`74@4Y*tTT#8&>h51T)!9L}-pzPj2}T($zcBsJ~Va|JF=$Ih}ZW zT2U`d_i&;ivvtp}s6hN@A>|DSIEK#G%Px5rGIM%T1M1|ExX&~-m4lwu6||a5IuzOb znh3ADk=h{pl{u6|HKj5TwvN@^^g7!0_>Kq@VG8Q=T zA2*Q$MK$m$MGodvsse@2l^yX(yngheIeS$mPb2l(c@x&i)Rw((l0yA^0FMhHGrAYk zq1C3sB#xtmqGTtoNHxfOrr~4-5KjjRzgN9<>|n22{V4TA3B$1geMxQId%FnmVF5f2 zA!hgtor2UihMuhqB0jBhf(IZ6Gs-1p;O$zRP#u+;Q@~S7s?S!>AOEpFxHenA74@?f zwu;RaA;0B@Z9bgG6vX2~U_YeH@mVB{n!Ohp`bR27(pwBGsmN#Jd!=nAYo<>S6cunl zKt1ii|0`aUrO9R}=}Y3~L6{+R6@e(Tb=Qr7avl-^9u&Y^0qlbmWA!XW_C4)wrB7&( zBpTZ=^DYCm2!SI?;X6v=St-2lmCv6%5xKIjiXXDq&zmoQ)_w;#z@y^GaW{S4uA7AK z-T(x90o($Jy$ZNS08>g~T0l)hh|B rD(7B15^WfDV@atx574oJw0i#^kFt+>0i8;w00000NkvXXu0mjfmFAlO literal 0 HcmV?d00001 diff --git a/echolot-app/app/src/main/res/values/strings.xml b/echolot-app/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..4b89fa3 --- /dev/null +++ b/echolot-app/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Echolot + diff --git a/echolot-app/core-measurement/bin/main/app/echo_lot/measurement/Test.kt b/echolot-app/core-measurement/bin/main/app/echo_lot/measurement/Test.kt index eccec5b..c26f202 100644 --- a/echolot-app/core-measurement/bin/main/app/echo_lot/measurement/Test.kt +++ b/echolot-app/core-measurement/bin/main/app/echo_lot/measurement/Test.kt @@ -55,6 +55,8 @@ object TestType { const val LINK_SNAPSHOT = "link.snapshot" const val LINK_DHCP_RENEWAL_WATCH = "link.dhcp_renewal_watch" const val LINK_IP_MONITOR = "link.ip_monitor" + /** Who advertises IPv6 on this link (+ gateway identity). Registry addition, v1.1. */ + const val LINK_RA_SOURCE = "link.ra_source" // net — connectivity validation (reproduces Android's NetworkMonitor generate_204 checks) const val NET_CAPTIVE_PORTAL = "net.captive_portal" // icmp diff --git a/echolot-app/core-measurement/src/main/kotlin/app/echo_lot/measurement/Test.kt b/echolot-app/core-measurement/src/main/kotlin/app/echo_lot/measurement/Test.kt index eccec5b..c26f202 100644 --- a/echolot-app/core-measurement/src/main/kotlin/app/echo_lot/measurement/Test.kt +++ b/echolot-app/core-measurement/src/main/kotlin/app/echo_lot/measurement/Test.kt @@ -55,6 +55,8 @@ object TestType { const val LINK_SNAPSHOT = "link.snapshot" const val LINK_DHCP_RENEWAL_WATCH = "link.dhcp_renewal_watch" const val LINK_IP_MONITOR = "link.ip_monitor" + /** Who advertises IPv6 on this link (+ gateway identity). Registry addition, v1.1. */ + const val LINK_RA_SOURCE = "link.ra_source" // net — connectivity validation (reproduces Android's NetworkMonitor generate_204 checks) const val NET_CAPTIVE_PORTAL = "net.captive_portal" // icmp diff --git a/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/Oui.kt b/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/Oui.kt new file mode 100644 index 0000000..5d52b12 --- /dev/null +++ b/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/Oui.kt @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2026 Echolot contributors +// SPDX-License-Identifier: GPL-3.0-or-later + +package app.echo_lot.probe + +/** + * Minimal OUI → vendor lookup for identifying gateways/routers from a MAC address. + * + * Deliberately a small curated table rather than the full IEEE registry (~35k entries, ~1.5 MB): + * the goal is naming the box that routes a home/office LAN, and consumer/SOHO gear concentrates + * in a handful of vendors. An unknown OUI is reported verbatim so it is never silently wrong — + * and the SSDP/UPnP identity in [RouterIdentityProbe] usually names the exact model anyway. + */ +object Oui { + + private val table: Map = mapOf( + // AVM (FRITZ!Box) — dominant in DE/AT + "00:04:0E" to "AVM", "38:10:D5" to "AVM", "5C:49:79" to "AVM", "C8:0E:14" to "AVM", + "3C:A6:2F" to "AVM", "9C:C7:A6" to "AVM", "E0:28:6D" to "AVM", "24:65:11" to "AVM", + // Ubiquiti + "00:15:6D" to "Ubiquiti", "04:18:D6" to "Ubiquiti", "24:5A:4C" to "Ubiquiti", + "44:D9:E7" to "Ubiquiti", "68:72:51" to "Ubiquiti", "78:8A:20" to "Ubiquiti", + "74:AC:B9" to "Ubiquiti", "F0:9F:C2" to "Ubiquiti", "B4:FB:E4" to "Ubiquiti", + "E0:63:DA" to "Ubiquiti", "78:45:58" to "Ubiquiti", "AC:8B:A9" to "Ubiquiti", + // 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", + // 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", + // Netgear + "00:09:5B" to "Netgear", "20:4E:7F" to "Netgear", "A0:40:A0" to "Netgear", + "C4:04:15" to "Netgear", "9C:3D:CF" to "Netgear", + // ASUS + "00:1B:FC" to "ASUS", "2C:56:DC" to "ASUS", "50:46:5D" to "ASUS", "AC:9E:17" to "ASUS", + "04:D9:F5" to "ASUS", "1C:B7:2C" to "ASUS", + // Cisco / Meraki + "00:1A:2F" to "Cisco", "00:26:99" to "Cisco", "E0:CB:BC" to "Cisco", + "00:18:0A" to "Cisco Meraki", "88:15:44" to "Cisco Meraki", "E0:55:3D" to "Cisco Meraki", + // Zyxel / Draytek / Huawei / ZTE + "00:13:49" to "Zyxel", "5C:F4:AB" to "Zyxel", "00:1D:AA" to "DrayTek", + "00:E0:FC" to "Huawei", "48:46:FB" to "Huawei", "00:1E:73" to "ZTE", + // AVM-adjacent ISP CPE / others common on consumer LANs + "00:17:3F" to "Belkin", "B8:27:EB" to "Raspberry Pi", "DC:A6:32" to "Raspberry Pi", + "E4:5F:01" to "Raspberry Pi", "00:50:56" to "VMware", "52:54:00" to "QEMU/KVM", + "18:E8:29" to "Ubiquiti", "70:A7:41" to "Ubiquiti", + ) + + /** Vendor for a MAC, or null when the OUI isn't in the curated table. */ + fun vendor(mac: String): String? { + val norm = mac.uppercase().replace('-', ':').trim() + if (norm.length < 8) return null + return table[norm.substring(0, 8)] + } + + /** True for a locally-administered (often randomized) MAC — not a real vendor identity. */ + fun isLocallyAdministered(mac: String): Boolean { + val first = mac.replace('-', ':').split(':').firstOrNull() ?: return false + val b = first.toIntOrNull(16) ?: return false + return (b and 0x02) != 0 + } +} diff --git a/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/RouterIdentityProbe.kt b/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/RouterIdentityProbe.kt new file mode 100644 index 0000000..0423281 --- /dev/null +++ b/echolot-app/core-probe/src/main/kotlin/app/echo_lot/probe/RouterIdentityProbe.kt @@ -0,0 +1,203 @@ +// SPDX-FileCopyrightText: 2026 Echolot contributors +// SPDX-License-Identifier: GPL-3.0-or-later + +package app.echo_lot.probe + +import android.content.Context +import app.echo_lot.measurement.Test +import app.echo_lot.measurement.TestStatus +import app.echo_lot.measurement.TestType +import app.echo_lot.measurement.Tier +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put +import kotlinx.serialization.json.putJsonArray +import kotlinx.serialization.json.addJsonObject +import java.net.DatagramPacket +import java.net.DatagramSocket +import java.net.HttpURLConnection +import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.URL + +/** + * link.ra_source — identifies **who is advertising IPv6 on this network** (and the IPv4 gateway), + * with as much attribution as an unprivileged app can gather. + * + * Why it matters: a rogue or misconfigured RA sender is one of the most common causes of broken + * IPv6, and "some router advertises a default route" is useless without knowing *which box*. + * + * Identification chain, best-effort and each step recorded as evidence: + * 1. **RA source** — the next-hop of the `::/0` route (a link-local `fe80::` address) per network. + * 2. **MAC from EUI-64** — a link-local formed the classic way encodes the sender's MAC + * (`fe80::7a9a:18ff:fe54:b8f9` → `78:9a:18:54:b8:f9`): strip `ff:fe` from the middle and flip + * the U/L bit. Privacy/stable-private addresses (RFC 7217) don't encode it — reported as such + * rather than guessed. + * 3. **Vendor** — OUI lookup on that MAC ([Oui]). + * 4. **UPnP/SSDP** — an M-SEARCH usually gets the router itself to answer with a `SERVER:` banner + * and a device-description URL; fetching it yields manufacturer / model / friendly name. This + * is what usually pins down the exact box. + * 5. **Reverse DNS** for the gateway addresses. + * + * Future cross-matching (same MAC seen via LLDP or in an SSDP/mDNS inventory) is why the MAC is + * always reported alongside every identity source. + */ +class RouterIdentityProbe(private val entries: List) : Probe { + override val type = TestType.LINK_RA_SOURCE + override val tier = Tier.APP + + override suspend fun run(ctx: Context, ids: ProbeIds): Test = withContext(Dispatchers.IO) { + val b = TestBuilder(type, tier, ids) + val ssdp = ssdpDiscover() // ip -> (server banner, description url) + var raSenders = 0 + + val evidence: JsonObject = buildJsonObject { + putJsonArray("networks") { + for (e in entries) { + val n = e.model + val v6Gw = n.link.routes.firstOrNull { it.dst == "::/0" }?.gateway + val v4Gw = n.link.routes.firstOrNull { it.dst == "0.0.0.0/0" }?.gateway + addJsonObject { + put("network", "${n.transport.name.lowercase()}:${n.id}") + put("interface", n.iface ?: "") + + // --- IPv6 RA sender --- + put("ra_source", v6Gw ?: "(none — no IPv6 default route)") + if (v6Gw != null) { + raSenders++ + val mac = macFromEui64LinkLocal(v6Gw) + put("ra_source_mac", mac ?: "(not EUI-64 — privacy/RFC 7217 address)") + if (mac != null) { + put("ra_source_vendor", Oui.vendor(mac) ?: "unknown OUI ${mac.take(8)}") + put("ra_source_mac_locally_administered", Oui.isLocallyAdministered(mac)) + } + put("ra_source_reverse_dns", reverseDns(v6Gw)) + } + + // --- IPv4 gateway (usually the same box) --- + 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 -> + 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") + } + } + } + } + // Every SSDP responder, so a rogue RA sender that is not the gateway can still be + // matched later (by IP now, by MAC once LLDP/mDNS inventories land). + putJsonArray("ssdp_responders") { + for ((ip, s) in ssdp) addJsonObject { + put("ip", ip); put("server", s.server); put("location", s.location) + s.details?.let { + put("manufacturer", it.manufacturer); put("model", it.model) + put("friendly_name", it.friendlyName) + } + } + } + } + + val metrics = buildJsonObject { + put("ra_senders", raSenders) + put("ssdp_responders", ssdp.size) + } + val status = if (entries.isEmpty()) TestStatus.FAILED else TestStatus.OK + b.build(status, evidence = evidence, metrics = metrics) + } + + /** + * Recovers the sender MAC from a modified-EUI-64 link-local address. The middle `ff:fe` marker + * must be present, and bit 1 of the first byte (U/L) is inverted back. + */ + private fun macFromEui64LinkLocal(addr: String): String? { + val bytes = runCatching { InetAddress.getByName(addr.substringBefore('%')).address }.getOrNull() + ?: return null + if (bytes.size != 16) return null + // fe80::/10 with EUI-64: bytes 11,12 are 0xFF,0xFE + if ((bytes[11].toInt() and 0xFF) != 0xFF || (bytes[12].toInt() and 0xFF) != 0xFE) return null + val mac = byteArrayOf( + (bytes[8].toInt() xor 0x02).toByte(), bytes[9], bytes[10], + bytes[13], bytes[14], bytes[15], + ) + return mac.joinToString(":") { "%02X".format(it) } + } + + private fun reverseDns(ip: String): String = runCatching { + val clean = ip.substringBefore('%') + val host = InetAddress.getByName(clean).canonicalHostName + if (host == clean) "(none)" else host + }.getOrDefault("(none)") + + private data class Ssdp(val server: String, val location: String, val details: Upnp?) + private data class Upnp(val manufacturer: String, val model: String, val friendlyName: String) + + /** SSDP M-SEARCH for the InternetGatewayDevice + root devices; returns responder IP -> identity. */ + private fun ssdpDiscover(): Map { + val out = LinkedHashMap() + val targets = listOf("urn:schemas-upnp-org:device:InternetGatewayDevice:1", "upnp:rootdevice") + runCatching { + DatagramSocket().use { sock -> + sock.soTimeout = 2500 + sock.broadcast = true + for (st in targets) { + val msg = ("M-SEARCH * HTTP/1.1\r\n" + + "HOST: 239.255.255.250:1900\r\n" + + "MAN: \"ssdp:discover\"\r\n" + + "MX: 2\r\nST: $st\r\n\r\n").toByteArray() + sock.send( + DatagramPacket(msg, msg.size, InetSocketAddress("239.255.255.250", 1900)) + ) + } + val deadline = System.currentTimeMillis() + 3000 + while (System.currentTimeMillis() < deadline) { + val buf = ByteArray(2048) + val dp = DatagramPacket(buf, buf.size) + try { + sock.receive(dp) + } catch (e: java.net.SocketTimeoutException) { + break + } + val ip = dp.address?.hostAddress ?: continue + if (out.containsKey(ip)) continue + val text = String(buf, 0, dp.length) + val server = header(text, "SERVER") ?: "" + val location = header(text, "LOCATION") ?: "" + out[ip] = Ssdp(server, location, location.takeIf { it.isNotBlank() }?.let(::fetchUpnp)) + } + } + } + return out + } + + private fun header(msg: String, name: String): String? = + msg.lineSequence().firstOrNull { it.startsWith("$name:", ignoreCase = true) } + ?.substringAfter(':')?.trim() + + /** Fetches the UPnP device description and pulls the identifying fields. */ + private fun fetchUpnp(location: String): Upnp? = runCatching { + val conn = (URL(location).openConnection() as HttpURLConnection).apply { + connectTimeout = 2500; readTimeout = 2500; requestMethod = "GET" + } + val xml = conn.inputStream.bufferedReader().use { it.readText().take(20_000) } + conn.disconnect() + Upnp( + manufacturer = tag(xml, "manufacturer"), + model = listOf(tag(xml, "modelName"), tag(xml, "modelNumber")) + .filter { it.isNotBlank() }.joinToString(" "), + friendlyName = tag(xml, "friendlyName"), + ) + }.getOrNull() + + private fun tag(xml: String, name: String): String = + Regex("<$name>(.*?)", RegexOption.DOT_MATCHES_ALL) + .find(xml)?.groupValues?.get(1)?.trim() ?: "" +}