1 पॉइंट द्वारा GN⁺ 2025-06-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 टिप्पणियां

 
GN⁺ 2025-06-09
Hacker News टिप्पणियाँ
  • अपनी पिछली नौकरी में Android डिवाइस और CDC Ethernet adapter को जोड़ने में एक हफ्ता जूझने के बाद मैंने यह लेख लिखा था
    बाद में कुछ लोगों ने बताया कि MAC address के किसी खास bit को flip करने पर kernel usbX के बजाय ethX नाम देता है, लेकिन मैंने खुद इसे आजमाया नहीं और न ही लेख को update किया। क्योंकि मैं पहले ही दूसरी नौकरी में चला गया था और Android डिवाइस अब मेरी रोजमर्रा की जिंदगी का बड़ा हिस्सा नहीं रह गए थे
    बेशक, यह तरीका तभी मददगार है जब आप CDC device के MAC address को सीधे control कर सकते हों। मसलन, जब कोई दूसरा Linux device CDC adapter होने का दिखावा कर रहा हो
  • दिलचस्प deep-dive लेख है
    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_history
  • LineageOS commit history देखने पर लगता है कि यह समस्या fix हुई थी[0], फिर compatibility issue की वजह से revert हुई[1], और फिर revert को वापस हटाया गया[2], लेकिन लगता है कि यह सिर्फ नए Android version पर लागू हुआ
    अगर मैंने 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...
    • Lineage के हिसाब से, मैंने यह कुछ समय पहले ढूंढकर https://review.lineageos.org/c/LineageOS/android_packages_mo... बनाया था
      लेकिन किसी ने test नहीं किया, और मेरे पास खुद verify करने का तरीका भी नहीं था, इसलिए यह अभी hold पर है। हमेशा किसी ने report की हुई चीजें और किसी ने संयोग से उठा ली हुई चीजें मिलती रहती हैं, लेकिन आखिरकार असली users की testing चाहिए होती है
  • अगर यह सच है कि Android की EthernetTracker service सिर्फ 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 के SIOCSIFNAME ioctl को call करता है। नए kernels में नाम को "wlan*"—असल में "wlan%d"—में बदलने पर "wifi" के बाद नया number अपने-आप assign करने की सुविधा भी है
    • सोचता हूं कि क्या Android में NetworkManager इस्तेमाल करना, और Android wireless settings UI को NetworkManager GUI जैसा behave कराना सही रहेगा
    • वजह यह थी कि कुछ usbX devices दूसरे modules को इस्तेमाल करने होते हैं, और वे उस list को manage नहीं करना चाहते थे। इसलिए वे सीधे ethX पर चले गए
  • Android smartphone में USB serial device connect करने की कोशिश करने पर भी ऐसा ही बेवकूफाना मामला होता है
    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 के लिए होगा

  • फोन को root करके config_ethernet_iface_regex value बदलने के अलावा इस समस्या को bypass करने का कोई तरीका नहीं है
    मेरे own किए हुए device पर root access अहम होने की यह एक और वजह है
    • हालांकि “rooting” Android की कई security features हटा देती है। apps के पास सिर्फ जरूरी permissions होने के बजाय, root के तौर पर सभी permissions हो सकती हैं, जिससे यह एक बड़ा security vulnerability बन जाता है
      https://www.reddit.com/r/GrapheneOS/comments/13264di/is_root...
    • network traffic को मनमाने ढंग से bypass/redirect कर पाना शायद user space में superuser privileges न रखने की सबसे बड़ी वजह हो सकती है
      OEMs पर bootloader unlock की अनुमति देने का दबाव डालने का मैं समर्थन करता हूं, लेकिन कम से कम Android पर, attack surface को बेहद बढ़ा देने को justify करने वाला root use case सोचना मुश्किल है
  • Android चिढ़ाने वाली तरह से कई networks से एक साथ connect नहीं हो पाता
    उदाहरण के लिए ऐसी स्थिति जहां 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 बनाने का कोई तरीका नहीं है
    • iOS भी ऐसा ही है। dashcam से connect होकर video download करते समय थोड़ी देर बाद “Internet नहीं मिला, cellular पर switch करें?” जैसा popup आता है
      continue connected दबाने पर भी इसे बंद करने का तरीका नहीं है, और iOS आखिर में खुद को ज्यादा समझदार मानकर CarPlay network से फिर connect कर देता है
    • Western Android phone लेकर mainland China जाएं तो यह और भी परेशान करता है। क्योंकि internet connectivity का पता Google services से connect करने की कोशिश से लगाया जाता है
      local Wi‑Fi से connect करने पर जाहिर है Great Firewall पार नहीं हो पाता, और हर बार internet-less connection बनाए रखने के बारे में prompt आता है
    • internet कट जाए तो फोन से diagnostics नहीं कर पाना बेहद चिढ़ाने वाला है। क्योंकि वह internet-less Wi‑Fi से जुड़ा नहीं रहता
      Android का DNS भी गड़बड़ है; कई options set न किए जाएं तो वह DHCP द्वारा दिए गए DNS का इस्तेमाल नहीं करना चाहता, और ऐसा करने पर भी कुछ internal DNS resolve करने से मना कर देता है
    • मुझे लगता है Windows में भी शायद नहीं होता। Windows में दो wireless adapters होने पर भी GUI से दो अलग-अलग Wi‑Fi networks से connect नहीं कर पाया था। terminal से कोशिश नहीं की
  • firmware requirements भी check करनी चाहिए। कुछ devices enumerate तो हो जाते हैं, लेकिन जरूरी firmware न हो तो 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 की जरूरत न हो
  • शानदार debugging journey है। नजरअंदाज की गई एक regex कैसे पूरे device class को गिरा देती है, यह flow अच्छा लगा
    अजीब बात है कि हाल ही में एक बिल्कुल अलग 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 में आपकी रुचि है, तो आपके विचार सुनना चाहूंगा
  • सच में अजीब है। मेरे पास करीब 15 USB Ethernet adapters हैं और सभी ठीक चलते हैं
    यह भी पक्का है कि उनमें Realtek और AXIS जैसे कई chipsets का mix है। Linux पर driver की जरूरत न पड़ने वाले products चुनें तो वे लगभग किसी भी OS या BIOS में ठीक चलते हैं
    • 2023 में fix हुआ: https://news.ycombinator.com/item?id=44219502
    • मैं यह कहने आया था कि मेरे Thunderbolt/USB dock का Ethernet adapter भी Pixel 5 और Pixel 9 पर बिना समस्या ठीक चलता है