- Android की EthernetTracker सेवा केवल उन्हीं network interfaces को पहचानती है जिनका नाम
ethX होता है
- Linux का CDC Ethernet driver interface नाम
usbX के रूप में बनाता है
- इसी वजह से standard CDC Ethernet devices Android पर अपने-आप सक्रिय नहीं होते
- इसे ठीक करने के लिए उपयोगकर्ता को खुद फोन root करना होगा और
config_ethernet_iface_regex मान बदलना होगा
- standard USB Ethernet adapter की जगह, vendor-specific driver वाले कुछ खास chipset products का उपयोग करना ही व्यावहारिक तरीका है
परिचय और समस्या का सार
- Android device पर CDC Ethernet के काम न करने का मुख्य कारण interface naming rule है
- सिस्टम स्तर पर USB Ethernet adapter का support है, लेकिन Ethernet menu के सक्रिय होने की शर्तों में सीमाएँ हैं
- compatible chipset की जानकारी पाना कठिन है, और व्यवहार में यह काफी हद तक उपयोगकर्ताओं के बीच की "सुनी-सुनाई बातों" पर निर्भर करता है
- Android भी Linux kernel पर आधारित है, लेकिन केवल kernel settings से सब कुछ तय नहीं होता
USB debugging और ADB सेटअप
- Android device पर USB debugging सक्षम करने के बाद ADB install करना आवश्यक है
- network adapter को test करने के लिए ADB को Wi-Fi के जरिए network mode में बदलना होगा
- commands के माध्यम से वर्तमान kernel version और architecture की जाँच की जा सकती है
kernel version और settings जाँचने का तरीका
- नए फोन (Android 11 और उसके बाद) में GKI(Generic Kernel Image) kernel संरचना होती है
- Google base kernel build करता है, और manufacturer केवल modules जोड़ता है
- उस kernel settings file (
gki_defconfig) से supported features का पता लगाया जा सकता है
- पुराने फोन में manufacturer द्वारा अलग से दिए गए kernel source में defconfig file ढूँढकर जाँच करनी होती है
- किस्मत अच्छी हो तो
/proc/config.gz path से current kernel settings सीधे देखी जा सकती हैं
supported USB Ethernet adapters की पहचान कैसे करें
- अधिकतर संबंधित kernel setting values
CONFIG_USB_NET_XXX के रूप में होती हैं
y हो तो built-in, m हो तो module के रूप में build (संभवतः उपयोग योग्य), is not set हो तो support नहीं है
drivers/net/usb/Kconfig file में हर setting value का विवरण देखा जा सकता है
- adapter chipset की जानकारी अब भी स्पष्ट रूप से मिलना दुर्लभ है
CDC Ethernet (Communications Device Class) और Android में उसका व्यवहार
- CDC USB networking standard है, जो EEM/ECM/NCM जैसे कई protocols प्रदान करता है
- Linux, Windows, macOS में standard CDC Ethernet devices बिना अलग driver के अपने-आप पहचाने जाते हैं
- Android में भी kernel level पर संबंधित drivers build किए गए होते हैं
- उदाहरण: Samsung devices में
CONFIG_USB_NET_CDCETHER, EEM, NCM सभी y पर सेट हैं
- फिर भी Ethernet menu सक्रिय नहीं होता
Android का network interface tracking logic
- Android network interface detection के लिए
EthernetTracker.java class का उपयोग करता है
EthernetTracker नया interface आने पर उसके नाम के pattern (regular expression) से match करता है
- यह matching rule resource (
config_ethernet_iface_regex) से लिया जाता है
- default value
eth\\d है (eth से शुरू होकर उसके बाद संख्या आने वाले network interfaces ही मान्य हैं)
- kernel द्वारा बनाया गया नाम (
usb0) इस pattern से मेल नहीं खाता, इसलिए उसे track और activate करने में अनदेखा कर दिया जाता है
समाधान की सीमाएँ और निष्कर्ष
- इस naming regular expression को उपयोगकर्ता सीधे बदल नहीं सकता (rooting के बिना असंभव)
- परिणामस्वरूप standard CDC Ethernet products जुड़े होने पर भी network menu में उपयोग नहीं किए जा सकते
- इसके विपरीत, vendor या chipset driver के जरिए सीधे registered कुछ adapters ही काम कर पाते हैं
- भले ही Google EEM module जैसे standard support code को kernel में शामिल करे, वास्तविक उपयोग फिर भी संभव नहीं होता
- कम-से-कम regular expression को
(eth|usb)\\d में बदल देने से समस्या हल हो सकती है, लेकिन फिलहाल यह वैसा ही बना हुआ है
सारांश
- मुख्य कारण: Android CDC Ethernet standard को नज़रअंदाज़ नहीं करता, बल्कि network interface का नाम regular expression (
eth\\d) से मेल न खाने के कारण उसे सक्रिय नहीं करता
- बचाव का तरीका: फोन को root करके
config_ethernet_iface_regex मान (eth|usb)\\d आदि में बदलना होगा
- व्यावहारिक विकल्प: standard USB CDC-supported adapter की तुलना में ऐसे products चुनना अधिक यथार्थवादी है जिनमें chipset-specific driver integration स्पष्ट हो
- संरचनात्मक समस्या: user visibility और standard compatibility के लिहाज़ से software upper stack की naming policy की कमी सिस्टम स्तर की सीमा के रूप में सामने आती है
1 टिप्पणियां
Hacker News टिप्पणियाँ
ethXनाम असाइन कर देता है। लेखक ने इसे खुद टेस्ट नहीं किया और न ही पोस्ट में जोड़ा, और अब वे Android डिवाइस लगभग इस्तेमाल भी नहीं करते। साथ ही यह शर्त भी जोड़ी कि यह तरीका तभी काम करेगा जब आप MAC address को नियंत्रित कर सकें.eth\\dसे*में बदला गया था, और अनुमान है कि इससे समस्या हल हो गई। संबंधित code change लिंक दिया गया, साथ ही यह भी कि Android U+ (शायद version 14) से डिफ़ॉल्ट रूप सेusb\\d+औरeth%dदोनों शामिल हो गए.usbXinterface पर tethering करती हैं"; उसके तुरंत बाद इसे फिर से लागू किया गया, लेकिन केवल Android V+ version (नया version) के लिए। rollback लिंक और अंतिम लागू लिंक भी जोड़े गए.ethXनाम वाले interface को मान्यता देती है—इस बात की कड़ी आलोचना की गई। समझाया गया कि Linux distributions ने यह समस्या 2000 के दशक में ही हल कर ली थी। याद किया गया कि पहले हर driver अपना अलग name prefix इस्तेमाल करता था, इसलिए पूरे system की जाँच करनी पड़ती थी। आज Linux distributionsudevजैसे tools से network interface names अपने-आप बदल देती हैं, और यह प्रक्रिया kernel केSIOCSIFNAME ioctlcall से चलती है। यह भी जोड़ा गया कि नए kernels में"wlan*"या"wlan%d"जैसे नामों पर अपने-आप नंबर जुड़ जाने की सुविधा भी मिलती है.config_ethernet_iface_regexvalue बदलने के लिए phone को root करना ही एकमात्र तरीका है</i>"—से सहमति जताते हुए कहा गया कि यह एक और कारण है कि उनके अपने डिवाइस पर root access महत्वपूर्ण है.ifupमें fail हो जाते हैं, और Android UI यह स्थिति बिल्कुल नहीं दिखाता; समस्या सिर्फdmesglogs में नज़र आती है। यह निश्चित नहीं कि CDC devices पर भी ऐसा लागू होता है, लेकिन अनुभव साझा किया गया कि कई USB Ethernet dongles मुख्यतः Realtek और Kawasaki chipsets पर आधारित थे, और कुछ मामलों में firmware की ज़रूरत पड़ती थी। कहा गया कि Android में यह बदलाव शायद हाल का है, लेकिन vanilla AOSP debugging devices पर USB network dongles अच्छी तरह काम करते थे, इसलिए अंदेशा है कि मामला kernel या CDC driver की naming convention का हो सकता है। अंत में फिर सलाह दी गई कि dongle के chipset और firmware आवश्यकता पर ध्यान देना चाहिए.