- Dịch vụ EthernetTracker của Android chỉ nhận diện các giao diện mạng có tên là ethX
- Trình điều khiển CDC Ethernet của Linux tạo tên giao diện là usbX
- Vì vậy, các thiết bị CDC Ethernet tiêu chuẩn không tự động được kích hoạt trên Android
- Để khắc phục, người dùng phải tự root điện thoại và thay đổi giá trị config_ethernet_iface_regex
- Cách thực tế là chỉ dùng các sản phẩm chipset nhất định có trình điều khiển đặc thù của nhà cung cấp, thay vì bộ chuyển đổi USB Ethernet tuân theo chuẩn
Giới thiệu và tổng quan vấn đề
- Nguyên nhân cốt lõi khiến CDC Ethernet không hoạt động trên thiết bị Android là do quy tắc đặt tên giao diện
- Về mặt hệ thống, Android có hỗ trợ bộ chuyển đổi USB Ethernet, nhưng điều kiện để menu Ethernet được kích hoạt lại bị ràng buộc
- Rất khó để có được thông tin về các chipset tương thích, và trên thực tế cấu trúc này khiến người dùng phải dựa vào những "lời đồn" truyền miệng
- Android cũng dựa trên nhân Linux, nhưng không phải mọi thứ đều được quyết định chỉ bằng cấu hình nhân
Gỡ lỗi USB và thiết lập ADB
- Cần bật gỡ lỗi USB và cài ADB trên thiết bị Android
- Để kiểm thử bộ chuyển đổi mạng, cần chuyển ADB sang chế độ mạng qua Wi‑Fi
- Có thể dùng lệnh để kiểm tra phiên bản nhân và kiến trúc hiện tại
Cách kiểm tra phiên bản và cấu hình nhân
- Điện thoại mới (Android 11 trở lên) dùng cấu trúc nhân GKI (Generic Kernel Image)
- Google xây dựng nhân cơ bản, còn nhà sản xuất chỉ bổ sung các mô-đun
- Có thể xác định các tính năng được hỗ trợ từ tệp cấu hình nhân tương ứng (
gki_defconfig)
- Với điện thoại cũ, cần tìm tệp defconfig trong mã nguồn nhân do từng nhà sản xuất cung cấp để kiểm tra
- Nếu may mắn, bạn cũng có thể kiểm tra trực tiếp cấu hình nhân hiện tại tại đường dẫn
/proc/config.gz
Cách xác định bộ chuyển đổi USB Ethernet được hỗ trợ
- Phần lớn các giá trị cấu hình nhân liên quan có dạng CONFIG_USB_NET_XXX
y nghĩa là tích hợp sẵn, m nghĩa là biên dịch dưới dạng mô-đun (có thể dùng được), is not set nghĩa là không được hỗ trợ
- Có thể tham khảo mô tả của từng giá trị cấu hình trong tệp drivers/net/usb/Kconfig
- Tuy vậy, thông tin về chipset của bộ chuyển đổi vẫn hiếm khi được hiển thị rõ ràng
CDC Ethernet (Communications Device Class) và trường hợp áp dụng trên Android
- CDC là chuẩn mạng USB, cung cấp nhiều giao thức như EEM/ECM/NCM
- Trên Linux, Windows và macOS, thiết bị CDC Ethernet tiêu chuẩn được tự động nhận diện mà không cần trình điều khiển riêng
- Ở cấp độ nhân, Android cũng đã biên dịch sẵn các trình điều khiển liên quan
- Ví dụ: thiết bị Samsung có
CONFIG_USB_NET_CDCETHER, EEM, NCM đều được đặt là y
- Tuy nhiên, menu Ethernet vẫn không được kích hoạt
Logic theo dõi giao diện mạng của Android
- Android dùng lớp EthernetTracker.java để phát hiện giao diện mạng
- Khi có giao diện mới xuất hiện, EthernetTracker sẽ so khớp theo mẫu tên (biểu thức chính quy)
- Tiêu chí khớp được lấy từ tài nguyên config_ethernet_iface_regex
- Giá trị mặc định là
eth\\d (chỉ các giao diện mạng bắt đầu bằng eth và theo sau là chữ số mới hợp lệ)
- Tên do nhân tạo ra (
usb0) không khớp với mẫu này nên bị bỏ qua trong quá trình theo dõi và kích hoạt
Giới hạn của cách khắc phục và kết luận
- Biểu thức chính quy đặt tên này người dùng không thể tự thay đổi (nếu không root)
- Kết quả là sản phẩm CDC Ethernet tiêu chuẩn dù có kết nối cũng không thể dùng trong menu mạng
- Ngược lại, chỉ một số bộ chuyển đổi được đăng ký trực tiếp bằng trình điều khiển của nhà cung cấp hoặc chipset mới có thể dùng được
- Dù Google có đưa mã hỗ trợ chuẩn như mô-đun EEM vào nhân, trên thực tế nó vẫn không hoạt động
- Đây là một vấn đề rất đơn giản, chỉ cần đổi biểu thức chính quy thành tối thiểu
(eth|usb)\\d là có thể giải quyết, nhưng hiện vẫn chưa được sửa
Tóm tắt
- Nguyên nhân cốt lõi: Android không phải là cố tình bỏ qua chuẩn CDC Ethernet, mà là giao diện mạng không được kích hoạt vì tên của nó không khớp với biểu thức chính quy (
eth\\d)
- Cách lách qua: Phải root điện thoại rồi thay đổi giá trị
config_ethernet_iface_regex thành dạng như (eth|usb)\\d
- Lựa chọn thực tế: Thay vì bộ chuyển đổi hỗ trợ USB CDC tiêu chuẩn, giải pháp thực tế hơn là chọn sản phẩm có tích hợp trình điều khiển rõ ràng theo từng chipset
- Vấn đề mang tính cấu trúc: Đây là ví dụ cho thấy chính sách đặt tên ở tầng phần mềm phía trên còn thiếu sót đã trở thành giới hạn mang tính hệ thống về khả năng hiển thị với người dùng và tương thích tiêu chuẩn
1 bình luận
Ý kiến Hacker News
ethX; tác giả chưa tự kiểm thử hay cập nhật nội dung đó vào bài, hiện nay cũng hầu như không còn dùng thiết bị Android nữa; đồng thời bổ sung rằng cách này chỉ dùng được khi bạn có thể kiểm soát địa chỉ MACeth\dthành*, nên nhiều khả năng lỗi đã được khắc phục; đưa ra liên kết thay đổi mã liên quan; giải thích rằng từ Android U+ (có lẽ là phiên bản 14) mặc định đã bao gồm cảusb\d+vàeth%dusbX", rồi sau đó lại được áp dụng trở lại nhưng chỉ hỗ trợ từ Android V+ (phiên bản mới) trở lên; kèm liên kết rollback và liên kết áp dụng cuối cùngEthernetTrackercủa Android chỉ chấp nhận các interface được đặt tên theoethX; giải thích rằng trên các bản phân phối Linux, vấn đề này đã được giải quyết từ những năm 2000; hồi tưởng việc mỗi driver thường dùng tiền tố tên riêng khiến phải rà soát toàn bộ hệ thống rất bất tiện; ngày nay các bản phân phối Linux tự động đổi tên interface mạng bằng các công cụ nhưudev, và quá trình này hoạt động qua lời gọi ioctlSIOCSIFNAMEcủa kernel; đồng thời bổ sung rằng kernel hiện đại còn hỗ trợ tiện lợi là tự gán số cho các tên kiểuwlan*hoặcwlan%dconfig_ethernet_iface_regexngoài việc root điện thoại</i>", và cho rằng đây là thêm một lý do nữa khiến quyền root quan trọng trên thiết bị tôi sở hữuifupsẽ thất bại, giao diện Android hoàn toàn không cho thấy tình trạng này mà chỉ xemdmesgmới biết vấn đề; không chắc CDC có bị như vậy không, nhưng kinh nghiệm là nhiều USB Ethernet dongle dùng chipset Realtek, Kawasaki và có trường hợp cần firmware; thay đổi phía Android này có vẻ là chuyện gần đây, nhưng trên thiết bị debug AOSP thuần thì vẫn dùng USB network dongle tốt nên đoán rằng có thể là do quy ước đặt tên ở phía kernel hoặc driver CDC; nói chung vẫn nên để ý chipset của dongle và việc nó có cần firmware hay không