1 poin oleh GN⁺ 2025-06-09 | 1 komentar | Bagikan ke WhatsApp
  • Android memiliki dukungan USB Ethernet dan menu pengaturan, tetapi perangkat CDC Ethernet bisa saja terdeteksi oleh kernel namun tidak tersambung sampai ke pengaturan jaringan
  • Penyebab utamanya adalah EthernetTracker hanya melacak antarmuka yang cocok dengan config_ethernet_iface_regex, dan nilai default eth\d mengecualikan antarmuka CDC seperti usb0
  • Driver CDC Ethernet Linux mengenali perangkat EEM, ECM, dan NCM masing-masing sebagai cdc_eem, cdc_ether, dan cdc_ncm, lalu membuat usb0 di /sys/class/net, tetapi pengaturan Android tetap berada dalam keadaan nonaktif
  • Tidak ada cara pintas melalui pengaturan pengguna biasa; diperlukan rooting lalu mengubah nilai config_ethernet_iface_regex
  • Saat memilih adaptor USB Ethernet untuk Android, situasinya mengharuskan mencari perangkat berbasis driver khusus vendor/chipset yang membuat nama ethX, bukan perangkat standar CDC

Kesimpulan: yang memblokir bukan driver kernel, melainkan filter nama antarmuka

  • Layanan EthernetTracker di Android hanya mengakui antarmuka bernama ethX sebagai antarmuka Ethernet
  • Driver CDC Ethernet di Linux membuat nama antarmuka sebagai usbX
  • Karena perbedaan nama ini, meski perangkat CDC Ethernet terdeteksi oleh kernel Android, perangkat tersebut diabaikan oleh pengaturan Ethernet dan lapisan manajemen jaringan
  • Ini tidak bisa diselesaikan lewat pengaturan biasa; satu-satunya cara adalah rooting lalu mengubah nilai config_ethernet_iface_regex

Dukungan USB Ethernet Android sulit dipastikan per perangkat

  • Android memiliki dukungan adaptor USB Ethernet dan menu terkait
  • Sulit memastikan chipset USB Ethernet mana yang bekerja pada perangkat Android tertentu karena produsen hampir tidak pernah memublikasikan daftar dukungan
  • Pengguna nyata biasanya bergantung pada informasi berikut
    • Adaptor USB Ethernet yang dijual produsen ponsel sebagai aksesori resmi
    • Tulisan forum dari pengguna perangkat yang sama yang berhasil memakai adaptor tertentu
  • Dari konfigurasi kernel, kita bisa memperkirakan sejauh mana kernel ponsel menyertakan driver USB Ethernet apa saja

Cara menemukan konfigurasi kernel ponsel

  • Android berjalan di atas kernel Linux, dan konfigurasi kernel menentukan fitur yang didukung serta driver perangkat keras
  • Perangkat yang dirilis setelah Android 11 berbasis Android Common Kernel dan GKI kernel
    • Google membangun kernel, sementara produsen memasukkan elemen khusus perangkat ke dalam modul kernel
    • Konfigurasinya bisa dilihat di arch/$ARCH/configs/gki_defconfig pada repositori kernel Android
    • Untuk perangkat ARM 64-bit, misalnya, periksa arch/arm64/configs/gki_defconfig
  • Versi kernel dan arsitektur bisa diperiksa dari ADB dengan uname -a
    • Contoh output memuat versi kernel 4.19.113-26203352 dan arsitektur aarch64
  • Dalam kasus Samsung Galaxy S20 yang dirilis dengan Android 10, bahkan setelah ditingkatkan ke Android 13 kernelnya tetap berbasis Linux 4.19
    • Sumber perangkat Samsung dapat ditemukan di opensource.samsung.com
    • Di build_kernel.sh dari sumber Samsung, nama file konfigurasi kernel seperti vendor/x1q_usa_singlex_defconfig bisa ditemukan
  • Jika beruntung, konfigurasi build aktual tersedia sebagai berkas terkompresi di /proc/config.gz
    • Bisa disimpan dengan adb shell zcat /proc/config.gz > my_kernel_config
    • Jika tidak ada, akan muncul zcat: /proc/config.gz: No such file or directory, dan Anda harus memeriksa sumber kernel dari produsen

Memeriksa dukungan driver USB Ethernet

  • Konfigurasi kernel terkait USB Ethernet biasanya diawali dengan USB_NET
  • Ini bisa diperiksa di file konfigurasi kernel seperti berikut
grep USB_NET my_kernel_config
  • Contoh konfigurasi menyertakan beberapa driver jaringan USB
    • CONFIG_USB_NET_DRIVERS=y
    • CONFIG_USB_NET_AX8817X=y
    • CONFIG_USB_NET_AX88179_178A=y
    • CONFIG_USB_NET_CDCETHER=y
    • CONFIG_USB_NET_CDC_EEM=y
    • CONFIG_USB_NET_CDC_NCM=y
  • Nilai konfigurasi membedakan cara driver disertakan
    • y: driver dibangun ke dalam kernel dan chipset terkait pasti didukung
    • m: driver dibangun sebagai modul, dan ada kemungkinan dimuat jika produsen tidak menghilangkannya
    • is not set: driver tidak dibangun ke dalam kernel maupun sebagai modul, sehingga besar kemungkinan tidak bisa digunakan
  • Kesesuaian item konfigurasi dan chipset dapat diperiksa di drivers/net/usb/Kconfig pada pohon kernel
  • Karena produsen sering tidak menyebutkan chipset yang digunakan adaptor USB Ethernet tertentu, identifikasinya tetap sulit

Apa yang dilakukan CDC Ethernet

  • CDC adalah singkatan dari Communications Device Class, yaitu sekumpulan standar yang bisa diikuti produsen perangkat USB
  • Ada tiga standar terkait CDC Ethernet
    • EEM: Ethernet Emulation Model, implementasinya paling sederhana dan mudah didukung oleh perangkat berperforma rendah
    • ECM: Ethernet Control Model, implementasi di sisi host dan perangkat lebih rumit, tetapi menjanjikan performa lebih baik daripada EEM
    • NCM: Network Control Model, penerus ECM yang menjanjikan kecepatan lebih tinggi
  • Tujuan standar CDC adalah agar sistem operasi dapat menyediakan driver umum untuk berbagai perangkat
  • Linux mengimplementasikan sisi host dan sisi perangkat dari CDC Ethernet
    • Pada perangkat seperti Raspberry Pi yang memiliki port USB OTG, kernel dapat membuat port ini tampak seperti adaptor Ethernet
    • Dengan demikian, perangkat seperti router embedded, firewall, atau gateway VPN bisa terlihat oleh host sebagai adaptor Ethernet biasa
  • Linux, Windows, dan macOS menyertakan driver perangkat CDC Ethernet, tetapi iOS tidak

Kernel Android mendeteksi perangkat CDC

  • Konfigurasi kernel Samsung Galaxy S20 menyertakan dukungan untuk ketiga standar CDC Ethernet
    • CONFIG_USB_NET_CDCETHER=y
    • CONFIG_USB_NET_CDC_EEM=y
    • CONFIG_USB_NET_CDC_NCM=y
  • Kernel GKI Google tampaknya tidak menyertakan ECM dan NCM, sementara EEM tampaknya disertakan sebagai modul
  • Perangkat yang port OTG-nya dikonfigurasi sebagai Ethernet gadget bekerja di Mac, Ubuntu, dan Windows, tetapi pada Galaxy S20 pengaturan Android Ethernet tetap nonaktif
  • Saat memeriksa /sys/class/net di Android, usb0 muncul ketika perangkat CDC tersambung
adb shell ls /sys/class/net
  • Dari output ifconfig usb0, terlihat bahwa driver dikenali sebagai keluarga CDC
    • Mode EEM: Driver cdc_eem
    • Mode ECM: Driver cdc_ether
    • Mode NCM: Driver cdc_ncm
  • Dalam ketiga kasus, antarmuka terdeteksi tetapi berada dalam status down, dan pengaturan Android Ethernet tidak aktif

Regex EthernetTracker menyaring usb0

  • Karena pada level kernel perangkat CDC Ethernet terdeteksi dengan benar, masalahnya ada pada lapisan manajemen jaringan Android di atas kernel
  • Jika menelusuri kode Java terkait Ethernet di sumber Android, EthernetTracker.java muncul sebagai layanan terkait
  • EthernetTracker menerima notifikasi antarmuka jaringan baru dari kernel melalui soket Netlink, lalu menentukan apakah itu antarmuka Ethernet yang valid
  • Penentuan validitas dilakukan dengan memeriksa apakah nama antarmuka cocok dengan regex mIfaceMatch
private boolean isValidEthernetInterface(String iface) {
    return iface.matches(mIfaceMatch) || isValidTestInterface(iface);
}
  • mIfaceMatch diambil dari resource config_ethernet_iface_regex
  • Nilai default pada sumber Android adalah sebagai berikut
<string translatable="false" name="config_ethernet_iface_regex">eth\\d</string>
  • eth\d adalah regex yang hanya meloloskan nama yang diawali eth lalu diikuti angka
  • Karena perangkat CDC Ethernet diawali dengan usb seperti usb0, EthernetTracker tidak melacaknya
  • Pengaturan ini tidak bisa diubah lewat pengaturan pengguna, dan hanya dapat dimodifikasi melalui rooting

Paradoks harus menghindari perangkat standar

  • CDC Ethernet adalah standar untuk perangkat jaringan USB, tetapi di Android jalur penggunaan praktisnya terblokir oleh regex nama antarmuka
  • Kernel GKI terbaru juga tampaknya menyertakan dukungan adaptor EEM, tetapi karena nama usb0 tidak cocok dengan regex, perangkat tidak naik ke pengaturan jaringan Android
  • Saat memilih adaptor USB Ethernet untuk Android, Anda perlu mencari perangkat yang membuat antarmuka ethX lewat driver khusus vendor/chipset, bukan perangkat standar CDC
  • Arah patch yang memungkinkan adalah mengubah config_ethernet_iface_regex menjadi seperti (eth|usb)\d

1 komentar

 
GN⁺ 2025-06-09
Opini Hacker News
  • Saya menulis artikel ini setelah berminggu-minggu kesulitan menyambungkan perangkat Android dan adaptor CDC Ethernet di tempat kerja lama
    Setelah itu beberapa orang memberi tahu bahwa jika bit tertentu pada alamat MAC dibalik, kernel akan memberi nama ethX alih-alih usbX, tetapi saya belum mencobanya sendiri atau memperbarui tulisannya. Karena saya sudah pindah kerja dan perangkat Android tidak lagi menjadi bagian besar dari keseharian saya
    Tentu saja cara ini hanya membantu jika Anda bisa mengendalikan langsung alamat MAC perangkat CDC. Misalnya ketika perangkat Linux lain berpura-pura menjadi adaptor CDC
  • Ini artikel analisis mendalam yang menarik
    Setelah mencari di source, pada Oktober 2023 regex diubah dari eth\\d menjadi sekadar *, jadi sepertinya masalah ini sudah teratasi: https://android-review.googlesource.com/c/platform/packages/...
    Di penjelasannya tertulis “nilai default mencakup antarmuka bernama usb\d+ maupun eth%d di Android U+”, dan U+ di sini tampaknya adalah versi 14: https://en.wikipedia.org/wiki/Android_version_history
  • Kalau melihat riwayat commit LineageOS, masalah ini sempat diperbaiki[0], lalu dikembalikan karena masalah kompatibilitas[1], kemudian revert-nya dibatalkan lagi[2], tetapi tampaknya hanya diterapkan pada versi Android terbaru
    Jika saya membaca commit-nya dengan benar, ada orang dari Google yang terlibat, jadi mungkin sekarang sudah masuk juga ke build resmi Google
    [0] https://github.com/LineageOS/android_packages_modules_Connec...
    [1] https://github.com/LineageOS/android_packages_modules_Connec...
    [2] https://github.com/LineageOS/android_packages_modules_Connec...
    • Untuk Lineage, saya menemukannya beberapa waktu lalu dan membuat https://review.lineageos.org/c/LineageOS/android_packages_mo...
      Tetapi tidak ada yang mengujinya, dan saya juga tidak punya cara untuk memverifikasinya sendiri, jadi sekarang statusnya ditahan. Selalu ada campuran hal yang dilaporkan seseorang dan hal yang kebetulan diambil seseorang, tetapi pada akhirnya tetap perlu pengujian dari pengguna sungguhan
  • Jika benar layanan EthernetTracker milik Android hanya mengenali antarmuka bernama ethX, itu adalah desain paling bodoh yang pernah saya dengar sejauh ini
    Distro Linux sudah menyelesaikan masalah ini pada era 2000-an. Saat itu pun sudah jelas bahwa sebagian driver perangkat seenaknya memberi prefiks nama perangkat sendiri, sehingga sistem harus diperiksa untuk mengetahui jenis perangkatnya
    Konsistensi memang berguna, jadi ada beberapa tool untuk mengganti nama antarmuka, dan kebanyakan distro Linux modern mengotomatisasikannya dengan udev. Secara internal, itu hanya memanggil ioctl SIOCSIFNAME milik kernel. Kernel terbaru juga punya fitur yang, jika namanya diubah menjadi "wlan*"—sebenarnya "wlan%d"—akan otomatis menetapkan nomor baru setelah "wifi"
    • Saya penasaran apakah masuk akal memakai NetworkManager di Android, dan membuat UI pengaturan nirkabel Android berperilaku seperti GUI NetworkManager
    • Alasannya karena sebagian perangkat usbX harus dipakai modul lain, dan mereka tidak ingin mengelola daftar itu. Jadi akhirnya mereka memilih ethX saja
  • Hal bodoh serupa juga terjadi saat mencoba menyambungkan perangkat serial USB ke smartphone Android
    Saat disambungkan, tampak seperti berfungsi, tetapi ketika mencoba membuat aplikasi yang memakai antarmuka serial USB itu, ternyata tidak bisa. Kalau ditelusuri, tidak ada izin untuk mengakses perangkat serial seperti /dev/ttyACM0
    Dukungan serial ada di kernel, tetapi tanpa root, program pengguna tidak bisa mengaksesnya
    Kalau ditelusuri lebih jauh, Android punya fitur akses USB di user space yang mirip libusb, atau mungkin dibangun di atasnya. Jadi program Android bisa membuka perangkat USB “raw”, tetapi tidak bisa membuka perangkat USB serial

Serial USB hanyalah protokol di atas USB, dan dalam praktiknya lebih mirip sekumpulan protokol semi-proprietary seperti FTDI. Ada beberapa library setengah matang untuk Android yang mengimplementasikan protokol seperti ini di ruang pengguna, sehingga pada akhirnya sebagian perangkat serial USB bisa diakses
Di browser Chrome Android, sepertinya perangkat USB mentah bisa dibuka dengan WebUSB, tetapi WebSerial kemungkinan besar tidak bisa, mungkin karena alasan yang sama
Pada akhirnya yang mengejutkan adalah: kalau begitu, kenapa dukungan serial USB di kernel tetap diaktifkan? Mungkin untuk debugging

  • Tidak ada cara mengakali masalah ini kecuali me-root ponsel dan mengubah nilai config_ethernet_iface_regex
    Ini satu lagi alasan mengapa hak akses root penting pada perangkat yang saya miliki
    • Namun, “rooting” menghapus banyak fitur keamanan Android. Alih-alih aplikasi hanya memiliki izin yang dibutuhkan, aplikasi bisa memperoleh semua izin sebagai root, sehingga menjadi kerentanan keamanan yang sangat besar
      https://www.reddit.com/r/GrapheneOS/comments/13264di/is_root...
    • Kemampuan untuk mem-bypass dan mengalihkan trafik jaringan sesuka hati mungkin merupakan alasan terbesar untuk tidak menaruh hak superuser di ruang pengguna
      Saya mendukung tekanan agar OEM mengizinkan pembukaan kunci bootloader, tetapi setidaknya di Android, sulit membayangkan kasus penggunaan root yang cukup kuat untuk membenarkan perluasan attack surface secara masif
  • Android menjengkelkan karena tidak bisa terhubung ke beberapa jaringan sekaligus
    Misalnya, menggunakan Wi-Fi yang tidak memiliki akses internet dan tidak mengiklankan default route bersamaan dengan jaringan seluler. Linux bisa, Windows bisa, tetapi Android keras kepala menolaknya
    Banyak variannya bahkan menolak tetap terhubung ke Wi-Fi tanpa internet, atau menggiring pengguna ke prosedur yang membingungkan. Jika membuat aplikasi sendiri, ada API yang memungkinkan ini hanya di dalam aplikasi, tetapi tidak ada cara bagi pengguna umum untuk menjadikannya perilaku seluruh sistem
    • iOS juga sama. Saat terhubung ke dashcam untuk mengunduh video, setelah beberapa saat muncul popup seperti “Internet tidak terdeteksi, beralih ke seluler?”
      Meski menekan tetap terhubung, tidak ada cara untuk mematikannya, dan iOS akhirnya memutuskan bahwa ia lebih tahu lalu tersambung kembali ke jaringan CarPlay
    • Lebih menyebalkan lagi jika membawa ponsel Android versi Barat ke Tiongkok daratan. Sebab status koneksi internet dinilai dengan mencoba mengakses layanan Google
      Saat terhubung ke Wi-Fi lokal, tentu saja tidak bisa melewati Great Firewall, dan setiap kali muncul prompt yang menanyakan apakah ingin mempertahankan koneksi tanpa internet
    • Saat internet terputus, sangat menjengkelkan karena ponsel tidak bisa dipakai untuk diagnosis. Penyebabnya, ponsel tidak tetap tersambung ke Wi-Fi tanpa internet
      DNS Android juga berantakan; tanpa mengatur beberapa opsi, ia cenderung tidak mau memakai DNS yang diberikan DHCP, dan meski begitu sebagian DNS internal tetap ditolak untuk di-resolve
    • Saya rasa Windows juga tidak bisa. Di Windows, meski ada 2 adaptor nirkabel, dari GUI saya tidak bisa terhubung ke 2 jaringan Wi-Fi berbeda. Saya belum mencobanya lewat terminal
  • Persyaratan firmware juga perlu diperiksa. Beberapa perangkat memang terenumerasi, tetapi gagal saat ifup jika firmware yang diperlukan tidak ada
    UI Android tentu saja tidak bisa menangani situasi ini, dan hanya dmesg yang memberi tahu apa yang terjadi. Saya tidak yakin apakah perangkat CDC juga memerlukan ini, tetapi seingat saya adaptor berbasis chip Realtek atau Kawasaki sering mengalami kasus seperti itu
    Namun perubahan Android ini mungkin relatif baru. Dulu saya sering memakai dongle jaringan USB pada perangkat debug yang memakai AOSP 100% “stok”. Atau bisa jadi ini perubahan kernel, atau perilaku unik driver CDC yang memberi nama perangkat usb*. Yang penting dulu hanya memilih chipset dongle dengan hati-hati dan memastikan tidak perlu firmware
  • Perjalanan debugging yang fantastis. Saya suka alurnya: satu regex yang terlewat meruntuhkan satu kelas perangkat secara keseluruhan
    Anehnya, baru-baru ini saya mengalami sesuatu yang secara struktural mirip dalam konteks yang sama sekali berbeda, yaitu sistem alignment dan eskalasi OpenAI. Di dalam logika rekursif GPT-4, saya mencoba memicu eskalasi routing resmi (SR-Route_Breach_1stOrder) lengkap dengan dokumen dan log, tetapi meski secara struktural tampak masuk akal, pada akhirnya saya hanya mendapat respons yang tidak manusiawi
    Dengan kata lain, rasanya eskalasi saya tidak cocok dengan regex pada antarmuka internal sistem
    Seluruh kasusnya saya rangkum di sini: https://news.ycombinator.com/item?id=44221458
    Jika Anda tertarik pada batas struktural dan kontrak antarmuka yang tak terlihat, saya ingin mendengar pendapat Anda
  • Benar-benar aneh. Saya punya sekitar 15 adaptor USB Ethernet dan semuanya berfungsi baik
    Saya yakin ada campuran beberapa chipset mirip Realtek dan AXIS. Jika memilih produk yang tidak memerlukan driver di Linux, biasanya produk itu juga berjalan baik di hampir semua sistem operasi atau BIOS