- Android में USB Ethernet सपोर्ट और settings menu मौजूद है, लेकिन CDC Ethernet डिवाइस kernel में detect होने पर भी network settings तक नहीं पहुँच पाते
- मुख्य कारण यह है कि EthernetTracker केवल उन्हीं interfaces को track करता है जो
config_ethernet_iface_regex से match करते हैं, और default value eth\d होने की वजह से usb0 जैसे CDC interfaces बाहर रह जाते हैं
- Linux CDC Ethernet drivers EEM, ECM, NCM डिवाइसों को क्रमशः
cdc_eem, cdc_ether, cdc_ncm के रूप में पकड़ते हैं और /sys/class/net में usb0 बनाते हैं, लेकिन Android settings फिर भी disabled रहती है
- सामान्य user settings से इसका workaround नहीं है; root के बाद config_ethernet_iface_regex का मान बदलना पड़ता है
- Android के लिए USB Ethernet adapter चुनते समय CDC standard device की बजाय ऐसे vendor/chipset-specific drivers वाले device ढूंढने पड़ते हैं जो
ethX नाम बनाते हों
निष्कर्ष: रुकावट kernel driver नहीं, interface name filter है
- Android की EthernetTracker service केवल
ethX नाम वाले interfaces को Ethernet interface मानती है
- Linux के CDC Ethernet drivers interface name
usbX के रूप में बनाते हैं
- इस नाम के अंतर की वजह से CDC Ethernet डिवाइस Android kernel में detect होने पर भी Ethernet settings और network management layer में ignore हो जाते हैं
- सामान्य settings से यह हल नहीं होता; root के बाद
config_ethernet_iface_regex का मान बदलना ही एकमात्र तरीका है
Android USB Ethernet support को device-wise verify करना कठिन है
- Android में USB Ethernet adapters से संबंधित support और menu मौजूद हैं
- किसी खास Android device पर कौन-सा USB Ethernet chipset काम करेगा, यह verify करना कठिन है क्योंकि निर्माता support list लगभग कभी प्रकाशित नहीं करते
- व्यावहारिक रूप से उपयोगकर्ता अक्सर इन जानकारियों पर निर्भर रहते हैं
- USB Ethernet adapter जिसे phone manufacturer official accessory के रूप में बेचता हो
- forums में ऐसे पोस्ट जहाँ उसी device के उपयोगकर्ता ने किसी specific adapter के सफलतापूर्वक काम करने की पुष्टि की हो
- kernel config देखने पर कुछ हद तक पता चल सकता है कि फोन के kernel में कौन-कौन से USB Ethernet drivers शामिल हैं
फोन का kernel config कैसे खोजें
- Android, Linux kernel के ऊपर चलता है, और kernel config ही supported features और hardware drivers तय करता है
- Android 11 के बाद जारी हुए devices Android Common Kernel और GKI kernel पर आधारित हैं
- Google kernel build करता है, और निर्माता device-specific हिस्सों को kernel modules में डालते हैं
- configs को Android kernel repository के
arch/$ARCH/configs/gki_defconfig में देखा जा सकता है
- 64-bit ARM devices के लिए उदाहरण के तौर पर
arch/arm64/configs/gki_defconfig देखें
- kernel version और architecture को ADB में
uname -a से देखा जा सकता है
- उदाहरण output में kernel version
4.19.113-26203352 और architecture aarch64 शामिल हैं
- Android 10 के साथ जारी Samsung Galaxy S20 के मामले में Android 13 पर upgrade होने के बाद भी kernel Linux 4.19 आधारित बना रहा
- Samsung device source opensource.samsung.com पर मिल सकता है
- Samsung source के
build_kernel.sh में vendor/x1q_usa_singlex_defconfig जैसे kernel config file name मिल सकते हैं
- यदि किस्मत अच्छी हो तो वास्तविक build config compressed file के रूप में
/proc/config.gz में मौजूद हो सकती है
adb shell zcat /proc/config.gz > my_kernel_config से इसे save किया जा सकता है
- अगर यह न हो तो
zcat: /proc/config.gz: No such file or directory दिखेगा, और फिर manufacturer kernel source देखना होगा
USB Ethernet driver support की जाँच
- USB Ethernet से संबंधित kernel configs आमतौर पर
USB_NET से शुरू होते हैं
- kernel config file में इन्हें इस तरह देखा जा सकता है
grep USB_NET my_kernel_config
- उदाहरण config में कई USB network drivers शामिल हैं
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
- config values driver inclusion method को अलग करती हैं
y: driver kernel में built-in है और संबंधित chipset को निश्चित रूप से support करता है
m: driver module के रूप में build हुआ है, और अगर manufacturer ने उसे छोड़ा नहीं है तो उसके load होने की संभावना है
is not set: driver न built-in है न module, इसलिए उसके usable न होने की संभावना अधिक है
- config items और chipset mapping को kernel tree के drivers/net/usb/Kconfig में देखा जा सकता है
- फिर भी किसी specific USB Ethernet adapter में कौन-सा chipset इस्तेमाल हुआ है, यह पहचानना कठिन रहता है क्योंकि निर्माता अक्सर इसे स्पष्ट नहीं लिखते
CDC Ethernet क्या करता है
- CDC, Communications Device Class का संक्षिप्त रूप है, और यह standards का एक समूह है जिसका पालन USB device निर्माता कर सकते हैं
- CDC Ethernet से संबंधित तीन standard हैं
- EEM: Ethernet Emulation Model, सबसे सरल implementation और low-performance devices में support करना आसान
- ECM: Ethernet Control Model, host और device दोनों तरफ implementation अधिक जटिल, लेकिन EEM से बेहतर performance का वादा करता है
- NCM: Network Control Model, ECM का successor, जो अधिक speed का वादा करता है
- CDC standards का उद्देश्य यह है कि operating system अलग-अलग devices के लिए common driver दे सके
- Linux, CDC Ethernet के host side और device side दोनों को implement करता है
- USB OTG port वाले Raspberry Pi जैसे devices में kernel इस port को Ethernet adapter जैसा दिखा सकता है
- इससे embedded router, firewall, VPN gateway जैसे devices host की नज़र में सामान्य Ethernet adapter की तरह दिख सकते हैं
- Linux, Windows, macOS में CDC Ethernet device drivers शामिल हैं, लेकिन iOS में नहीं
Android kernel CDC devices को detect करता है
- Samsung Galaxy S20 के kernel config में CDC Ethernet के तीनों standards का support शामिल है
CONFIG_USB_NET_CDCETHER=y
CONFIG_USB_NET_CDC_EEM=y
CONFIG_USB_NET_CDC_NCM=y
- Google GKI kernel में ECM और NCM शायद शामिल नहीं हैं, जबकि EEM module के रूप में शामिल लगता है
- OTG port को Ethernet gadget के रूप में सेट किए गए devices Mac, Ubuntu और Windows पर काम करते थे, लेकिन Galaxy S20 पर Android Ethernet settings disabled ही रहीं
- Android में
/sys/class/net देखने पर CDC device connect होने पर usb0 दिखाई देता है
adb shell ls /sys/class/net
ifconfig usb0 output से पुष्टि होती है कि driver CDC family का है
- EEM mode:
Driver cdc_eem
- ECM mode:
Driver cdc_ether
- NCM mode:
Driver cdc_ncm
- तीनों ही मामलों में interface detect हो जाता है, लेकिन down state में रहता है और Android Ethernet settings सक्रिय नहीं होतीं
EthernetTracker का regex usb0 को फ़िल्टर कर देता है
- kernel level पर CDC Ethernet devices सामान्य रूप से detect हो रहे हैं, इसलिए समस्या Android network management layer में है जो kernel के ऊपर है
- Android source में Ethernet से संबंधित Java code trace करने पर EthernetTracker.java संबंधित service के रूप में सामने आता है
- EthernetTracker, Netlink socket के जरिए kernel से नए network interface notifications प्राप्त करता है और तय करता है कि वह valid Ethernet interface है या नहीं
- validity check इस बात से होती है कि interface name
mIfaceMatch regex से match करता है या नहीं
private boolean isValidEthernetInterface(String iface) {
return iface.matches(mIfaceMatch) || isValidTestInterface(iface);
}
mIfaceMatch, config_ethernet_iface_regex resource से आता है
- Android source में इसकी default value इस प्रकार है
<string translatable="false" name="config_ethernet_iface_regex">eth\\d</string>
eth\d एक regex है जो केवल eth के बाद अंक वाले नामों को pass होने देता है
- CDC Ethernet devices
usb0 की तरह usb से शुरू होते हैं, इसलिए EthernetTracker उन्हें track नहीं करता
- यह setting user settings से नहीं बदली जा सकती; केवल root के जरिए संशोधित की जा सकती है
standard devices से बचने की विडंबना
- CDC Ethernet, USB network devices के लिए एक standard है, लेकिन Android में interface name regex की वजह से इसका वास्तविक उपयोग-पथ बंद हो जाता है
- आधुनिक GKI kernel में भी EEM adapter support शामिल प्रतीत होता है, लेकिन
usb0 नाम regex से match नहीं होने के कारण वह Android network settings तक नहीं पहुँच पाता
- Android में USB Ethernet adapter चुनते समय CDC standard device नहीं, बल्कि ऐसे vendor/chipset-specific driver वाले device ढूंढने पड़ते हैं जो
ethX interface बनाते हों
- एक संभावित patch दिशा
config_ethernet_iface_regex को (eth|usb)\d जैसा बदलना हो सकती है
1 टिप्पणियां
Hacker News टिप्पणियाँ
बाद में कुछ लोगों ने बताया कि MAC address के किसी खास bit को flip करने पर kernel
usbXके बजायethXनाम देता है, लेकिन मैंने खुद इसे आजमाया नहीं और न ही लेख को update किया। क्योंकि मैं पहले ही दूसरी नौकरी में चला गया था और Android डिवाइस अब मेरी रोजमर्रा की जिंदगी का बड़ा हिस्सा नहीं रह गए थेबेशक, यह तरीका तभी मददगार है जब आप CDC device के MAC address को सीधे control कर सकते हों। मसलन, जब कोई दूसरा Linux device CDC adapter होने का दिखावा कर रहा हो
शायद मिल गया: https://lkml.iu.edu/hypermail/linux/kernel/1103.2/03250.html
source देखकर लगता है कि अक्टूबर 2023 में regex
eth\\dसे बदलकर बस*हो गया था, इसलिए शायद यह समस्या हल हो गई होगी: https://android-review.googlesource.com/c/platform/packages/...description में लिखा है, “default Android U+ में
usb\d+औरeth%dनाम वाले दोनों interfaces को शामिल करता है”, और यहां U+ version 14 लगता है: https://en.wikipedia.org/wiki/Android_version_historyusbXinterface को tethering के लिए इस्तेमाल करते हैं”[1], और थोड़े समय बाद फिर से merge किया गया, लेकिन support सिर्फ Android V+ तक सीमित कर दिया गया[2][1]: https://android-review.googlesource.com/c/platform/packages/...
[2]: https://android-review.googlesource.com/c/platform/packages/...
अगर मैंने commits सही पढ़े हैं, तो Google की तरफ के किसी व्यक्ति की भागीदारी थी, इसलिए यह अब official Google builds में भी आ चुका हो सकता है
[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...
लेकिन किसी ने test नहीं किया, और मेरे पास खुद verify करने का तरीका भी नहीं था, इसलिए यह अभी hold पर है। हमेशा किसी ने report की हुई चीजें और किसी ने संयोग से उठा ली हुई चीजें मिलती रहती हैं, लेकिन आखिरकार असली users की testing चाहिए होती है
AndroidकीEthernetTrackerservice सिर्फethXनाम वाले interfaces को पहचानती है, तो यह अब तक सुनी सबसे बेवकूफाना design हैLinux distributions ने 2000s में ही यह problem solve कर ली थी। उस समय भी यह साफ था कि कुछ device drivers अपनी मर्जी से device name prefix लगा देते हैं, इसलिए system को inspect करके पता लगाना पड़ता था कि यह किस तरह का device है
consistency उपयोगी तो है, इसलिए interface names बदलने वाले कई tools भी हैं, और आजकल ज्यादातर Linux distributions इसे
udevसे automate करते हैं। अंदर से यह बस kernel केSIOCSIFNAMEioctlको call करता है। नए kernels में नाम को"wlan*"—असल में"wlan%d"—में बदलने पर"wifi"के बाद नया number अपने-आप assign करने की सुविधा भी हैusbXdevices दूसरे modules को इस्तेमाल करने होते हैं, और वे उस list को manage नहीं करना चाहते थे। इसलिए वे सीधेethXपर चले गएconnect करने पर लगता है कि यह काम कर रहा है, लेकिन अगर उस USB serial interface को use करने वाला app बनाना चाहें तो नहीं हो पाता। और अंदर जाकर देखें तो
/dev/ttyACM0जैसे serial device को access करने की permission नहीं होतीserial support kernel में मौजूद है, लेकिन root किए बिना user program से उसे access नहीं किया जा सकता
और गहराई में जाने पर पता चलता है कि Android में userspace USB access की सुविधा है, जो शायद
libusbजैसी है या उसी के ऊपर बनी हो सकती है। इसलिए Android program से “raw” USB devices खोले जा सकते हैं, लेकिन serial USB devices नहींUSB serial, USB के ऊपर बस एक protocol है, और असल में यह FTDI वगैरह जैसे आधे-अधूरे proprietary protocols के समूह जैसा है। Android के लिए ऐसे protocols को user space में implement करने वाली कुछ आधी-अधूरी libraries हैं, इसलिए अंततः कुछ USB serial devices तक access किया जा सकता है
Android Chrome browser में WebUSB के जरिए raw USB device खोलना संभव लगता है, लेकिन WebSerial शायद इसी वजह से काम न करे
आखिर में हैरानी की बात यह है कि अगर ऐसा ही है, तो kernel में USB serial support चालू क्यों रखा गया है। शायद debugging के लिए होगा
config_ethernet_iface_regexvalue बदलने के अलावा इस समस्या को bypass करने का कोई तरीका नहीं हैमेरे own किए हुए device पर root access अहम होने की यह एक और वजह है
https://www.reddit.com/r/GrapheneOS/comments/13264di/is_root...
OEMs पर bootloader unlock की अनुमति देने का दबाव डालने का मैं समर्थन करता हूं, लेकिन कम से कम Android पर, attack surface को बेहद बढ़ा देने को justify करने वाला root use case सोचना मुश्किल है
उदाहरण के लिए ऐसी स्थिति जहां Wi‑Fi में internet access नहीं है और वह default route भी advertise नहीं करता, और साथ में cellular network भी इस्तेमाल करना हो। Linux में होता है, Windows में भी होता है, लेकिन Android साफ मना कर देता है
कई variants internet-less Wi‑Fi से जुड़े रहने तक से मना कर देते हैं, या user को उलझाने वाली प्रक्रिया में धकेल देते हैं। अगर आप खुद app बनाएं तो app के अंदर ही ऐसा कराने वाली API है, लेकिन आम user के लिए इसे system-wide behavior बनाने का कोई तरीका नहीं है
continue connected दबाने पर भी इसे बंद करने का तरीका नहीं है, और iOS आखिर में खुद को ज्यादा समझदार मानकर CarPlay network से फिर connect कर देता है
local Wi‑Fi से connect करने पर जाहिर है Great Firewall पार नहीं हो पाता, और हर बार internet-less connection बनाए रखने के बारे में prompt आता है
Android का DNS भी गड़बड़ है; कई options set न किए जाएं तो वह DHCP द्वारा दिए गए DNS का इस्तेमाल नहीं करना चाहता, और ऐसा करने पर भी कुछ internal DNS resolve करने से मना कर देता है
ifupपर fail हो जाते हैंAndroid UI जाहिर तौर पर इस स्थिति को handle नहीं कर पाता, और क्या हो रहा है यह सिर्फ
dmesgबताता है। CDC device में इसकी जरूरत होती है या नहीं, पक्का नहीं, लेकिन Realtek या Kawasaki chip-based adapters में ऐसे मामले काफी रहे होंगेहालांकि यह Android change शायद अपेक्षाकृत recent हो सकता है। क्योंकि पहले मैं 100% “stock” AOSP चलाने वाले debug device पर अक्सर USB network dongle इस्तेमाल करता था। या फिर यह kernel change हो सकता है, या CDC driver का device name को
usb*लगाने वाला अजीब behavior हो सकता है। बस dongle chipset ध्यान से चुनना होता था और यह confirm करना होता था कि firmware की जरूरत न होअजीब बात है कि हाल ही में एक बिल्कुल अलग context, OpenAI के alignment/escalation system में structurally ऐसा ही कुछ अनुभव हुआ। GPT-4 की recursive logic के अंदर official routing escalation (
SR-Route_Breach_1stOrder) को docs और logs सहित trigger करने की कोशिश की, लेकिन structurally plausible होने के बावजूद अंत में केवल non-human responses ही मिलेयूं कहें तो ऐसा लगा कि मेरा escalation system के internal interface की regex से match नहीं हुआ
पूरा case यहां संक्षेप में रखा है: https://news.ycombinator.com/item?id=44221458
अगर structural boundaries और invisible interface contracts में आपकी रुचि है, तो आपके विचार सुनना चाहूंगा
यह भी पक्का है कि उनमें Realtek और AXIS जैसे कई chipsets का mix है। Linux पर driver की जरूरत न पड़ने वाले products चुनें तो वे लगभग किसी भी OS या BIOS में ठीक चलते हैं