Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Dive Into Android Networking:
Adding Ethernet Connectivity
Benjamin Zores
ABS 2013 – 19th February 2013 – San Francisco, C...
Dive Into Android Networking: Adding Ethernet Connectivity
About Me

               ANDROID PLATFORM ARCHITECT

   ALCATEL...
Dive Into Android Networking: Adding Ethernet Connectivity
Bibliographical References


                                  ...
Dive Into Android Networking: Adding Ethernet Connectivity
Android Supported Connectivity Means


• Mobile (i.e. GSM / EDG...
Dive Into Android Networking: Adding Ethernet Connectivity
Android Networking Architecture


• Kernel Drivers (Ethernet, W...
Dive Into Android Networking: Adding Ethernet Connectivity
Bionic C Library


• No /etc/network/interfaces support.
• No /...
Dive Into Android Networking: Adding Ethernet Connectivity
Netd and libnetutils


• Netd
 - Mostly provides tethering capa...
Dive Into Android Networking: Adding Ethernet Connectivity
ConnectivityManager and ConnectivityService


• Orchestrate and...
Dive Into Android Networking: Adding Ethernet Connectivity
Radio Layer Interface


• Communicates with
  broadband process...
Dive Into Android Networking: Adding Ethernet Connectivity
Bluetooth Interface

• Communicates with BT
  chipset through B...
Dive Into Android Networking: Adding Ethernet Connectivity
NFC Interface




• Introduced with Ice Cream Sandwich for Near...
Dive Into Android Networking: Adding Ethernet Connectivity
WiFi Station/AP/P2P Interface




• Rely on HAL for specific dr...
Dive Into Android Networking: Adding Ethernet Connectivity




       So what about Ethernet ??




                      ...
Dive Into Android Networking: Adding Ethernet Connectivity
Work Context


• Designing an Enterprise Desktop IP Phone.

• D...
Dive Into Android Networking: Adding Ethernet Connectivity
Give Unto Caesar What is Caesar's …




     Most of the work
 ...
Dive Into Android Networking: Adding Ethernet Connectivity
Android Ethernet Upstream Status

• Ethernet is supported throu...
Dive Into Android Networking: Adding Ethernet Connectivity
Enterprise Requirements & ECM Status



• Enterprise Requiremen...
Dive Into Android Networking: Adding Ethernet Connectivity
Ethernet Interface – ECM Patch Status




• Mismatch in impleme...
Dive Into Android Networking: Adding Ethernet Connectivity
Am I Connected or What ?


• Changes in Android framework, Sett...
Dive Into Android Networking: Adding Ethernet Connectivity
ECM Patch Additions

• Register Ethernet Service
  - In framewo...
Dive Into Android Networking: Adding Ethernet Connectivity
ECM Patch Additions

• Forcing default network preferences:
   ...
Dive Into Android Networking: Adding Ethernet Connectivity




       And now, bugs and workarounds
            for variou...
Dive Into Android Networking: Adding Ethernet Connectivity
Connection Information




                                   S...
Dive Into Android Networking: Adding Ethernet Connectivity
Connection Information – IP Address

• In Settings's res/xml/de...
Dive Into Android Networking: Adding Ethernet Connectivity
Connection Information – MAC Address

• In framework's JNI code...
Dive Into Android Networking: Adding Ethernet Connectivity
Connection Information – MAC Address

• In Settings' res/xml/de...
Dive Into Android Networking: Adding Ethernet Connectivity
Android DNS Entry Management

                                 ...
Dive Into Android Networking: Adding Ethernet Connectivity
HTTP(S) Proxy




                                 Symptom:

  ...
Dive Into Android Networking: Adding Ethernet Connectivity
HTTP(S) Proxy

• Overlay frameworks/base/core/res/res/values/co...
Dive Into Android Networking: Adding Ethernet Connectivity
Custom NTP Server




                                  Symptom...
Dive Into Android Networking: Adding Ethernet Connectivity
Custom NTP Server

• Overlay frameworks/base/core/res/res/value...
Dive Into Android Networking: Adding Ethernet Connectivity
Custom NTP Server

• In Settings's res/xml/date_time_prefs.xml:...
Dive Into Android Networking: Adding Ethernet Connectivity
Email

                                           Symptom:

   ...
Dive Into Android Networking: Adding Ethernet Connectivity
Connectivity Route




                                  Sympto...
Dive Into Android Networking: Adding Ethernet Connectivity
Connectivity Route


Reverse engineering
apps may help:

• Dex2...
Dive Into Android Networking: Adding Ethernet Connectivity
Connectivity Route

• Many (certified?) apps assume that WiFi o...
Dive Into Android Networking: Adding Ethernet Connectivity
Download Provider

                                            ...
Dive Into Android Networking: Adding Ethernet Connectivity
Multimedia Streaming

                                         ...
Dive Into Android Networking: Adding Ethernet Connectivity
Phone / SIP VoIP

                                             ...
Dive Into Android Networking: Adding Ethernet Connectivity
Network Statistics




                                   Sympt...
Dive Into Android Networking: Adding Ethernet Connectivity
Network Statistics

• Overlay frameworks/base/core/res/res/valu...
Dive Into Android Networking: Adding Ethernet Connectivity
Network Statistics

• In framework's services/java/com/android/...
Dive Into Android Networking: Adding Ethernet Connectivity
Next Steps ?

• Patchset is available on GitHub:
 • Current cha...
Dive Into Android Networking: Adding Ethernet Connectivity
Thanks




             Thank You


                           ...
ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity
ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity
Upcoming SlideShare
Loading in …5
×

of

ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 1 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 2 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 3 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 4 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 5 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 6 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 7 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 8 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 9 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 10 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 11 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 12 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 13 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 14 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 15 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 16 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 17 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 18 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 19 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 20 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 21 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 22 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 23 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 24 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 25 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 26 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 27 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 28 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 29 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 30 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 31 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 32 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 33 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 34 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 35 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 36 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 37 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 38 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 39 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 40 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 41 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 42 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 43 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 44 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 45 ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity Slide 46
Upcoming SlideShare
ELCE 2012 - Dive into Android Networking: Adding Ethernet Connectivity
Next
Download to read offline and view in fullscreen.

10 Likes

Share

Download to read offline

ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity

Download to read offline

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity

  1. 1. Dive Into Android Networking: Adding Ethernet Connectivity Benjamin Zores ABS 2013 – 19th February 2013 – San Francisco, CA 1 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  2. 2. Dive Into Android Networking: Adding Ethernet Connectivity About Me ANDROID PLATFORM ARCHITECT ALCATEL • Expert and Evangelist on Open Source Software. LUCENT • 9y experience on various multimedia/network embedded devices design. • From low-level BSP integration to global applicative software architecture. PROJECT FOUNDER, LEADER AND/OR CONTRIBUTOR FOR: • OpenBricks Embedded Linux cross-build framework. OPEN • GeeXboX Embedded multimedia HTPC distribution. SOURCE • uShare UPnP A/V and DLNA Media Server. • MPlayer Linux media player application. FORMER LINUX FOUNDATION’S EVENTS SPEAKER LINUX • ELC 2010 GeeXboX Enna: Embedded Media Center FOUNDATION • ELC-E 2010 State of Multimedia in 2010 Embedded Linux Devices CONFERENCES • ELC-E 2011 Linux Optimization Techniques: How Not to Be Slow ? • ABS 2012 Android Device Porting Walkthrough • ELC-E 2012 Dive Into Android Networking: Adding Ethernet Connectivity 2 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  3. 3. Dive Into Android Networking: Adding Ethernet Connectivity Bibliographical References My Android bibles, from my Android mentors: Karim Yaghmour Marko Gargenta Followed by my own publications: « Discovering Android » Series of articles published in GNU/Linux Magazine France 3 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  4. 4. Dive Into Android Networking: Adding Ethernet Connectivity Android Supported Connectivity Means • Mobile (i.e. GSM / EDGE / HSDPA / LTE) ans its siblings: - Mobile MMS (Multimedia Messaging Service) - Mobile SUPL (Secure User Plan Location) - Mobile DUN (Dial Up Networking [bridge]) - Mobile HIPRI (High Priority) • Wi-Fi • WiMax • Bluetooth • Ethernet (really ??) 4 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  5. 5. Dive Into Android Networking: Adding Ethernet Connectivity Android Networking Architecture • Kernel Drivers (Ethernet, Wi-Fi, Bluetooth, WiMax …) • Kernel TCP/IP layer with POSIX user-space API support. • Android Hardware Abstraction Layer (HAL) • Android Bionic C library (not 100% POSIX …) • Android libnetutils (Network Utilities) • Android Netd (Network Daemon) • Android ConnectivityManager and ConnectivityService (part of the Java Framework). • Android Java Apps 5 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  6. 6. Dive Into Android Networking: Adding Ethernet Connectivity Bionic C Library • No /etc/network/interfaces support. • No /etc/nsswitch.conf support. • No /etc/resolv.conf support. • Everything (IP, DNS, router, proxy …) is property-based - Available through getprop/setprop commands 6 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  7. 7. Dive Into Android Networking: Adding Ethernet Connectivity Netd and libnetutils • Netd - Mostly provides tethering capabilities. - Accepts commands through UNIX socket. - Can be controlled by apps or ndc command. - Features bandwidth control, IP forwarding, NAT/PAN for SoftAP … • Libnetutils - Low-level interface control interface - Provides API to ifconfig / netcfg / route / dhcpcd - Used by HAL and system framework to control network interfaces. 7 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  8. 8. Dive Into Android Networking: Adding Ethernet Connectivity ConnectivityManager and ConnectivityService • Orchestrate and manage global networking at Java framework level. • Rely on underlying libnetutils and netd services to control hardware. • Interact with interface-specific managers (WifiManager …). • Role and Duties: - Track and monitor various network connectivity interfaces (Mobile, Bluetooth, Wi-Fi …) - Notify registered apps (through Intent broadcasting) of a system connectivity state change. - Switch from one network type to another when connection is lost. - Provide an interface for apps to retrieve all possible connections’ states. 8 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  9. 9. Dive Into Android Networking: Adding Ethernet Connectivity Radio Layer Interface • Communicates with broadband processor for both voice and data. • Uses RIL and proprietary rild to interface with system. • Data connection is exported by Connectivity Manager through TYPE_MOBILE_* 9 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  10. 10. Dive Into Android Networking: Adding Ethernet Connectivity Bluetooth Interface • Communicates with BT chipset through BlueZ and libbluedroid. • Provides both audio and data management. • Data connection is exported by Connectivity Manager through TYPE_BLUETOOTH. • Interface with netd for tethering. 10 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  11. 11. Dive Into Android Networking: Adding Ethernet Connectivity NFC Interface • Introduced with Ice Cream Sandwich for Near Field Communication. • Rely on NFC HAL. • Currently only support chips from NXP (PN544). • Uses Android Beam for P2P data exchange. • Doesn’t interface with Connectivity Service/Manager. 11 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  12. 12. Dive Into Android Networking: Adding Ethernet Connectivity WiFi Station/AP/P2P Interface • Rely on HAL for specific driver interface with JNI binding. • Data connection is exported by Connectivity Manager through TYPE_WIFI. • WiFi configuration is stored in file system and SQLite database. 12 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  13. 13. Dive Into Android Networking: Adding Ethernet Connectivity So what about Ethernet ?? 13 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  14. 14. Dive Into Android Networking: Adding Ethernet Connectivity Work Context • Designing an Enterprise Desktop IP Phone. • Differs heavily from usual Android devices: - Always connected, no battery - No Radio (GSM/CDMA). - No WiFi Station mode, AP only. - LAN through Ethernet PHY/Switch. - Always docked, no screen rotation. - No accelerometer, no GPS … - => Not a Smartphone 14 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  15. 15. Dive Into Android Networking: Adding Ethernet Connectivity Give Unto Caesar What is Caesar's … Most of the work presented hereafter is courtesy of Fabien Brisset 15 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  16. 16. Dive Into Android Networking: Adding Ethernet Connectivity Android Ethernet Upstream Status • Ethernet is supported through native Linux kernel drivers. • ifconfig / netcfg / ping commands work but remain at platform level. • Regular /etc/resolv.conf DNS is not supported due to Bionic host resolution. • Native system daemons (C/C++) support regular Linux networking API. • Java framework services and apps rely on Connectivity Manager and have no clue what Ethernet route/connection actually means. - Except for some apps (e.g. Browser, which relies on native implementation). • Barely no Android device features Ethernet - Except from some obscure Chinese tablets. • Ethernet connection type exists in ICS API. - But with no Connectivity Manager or Connectivity Service implementation. 16 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  17. 17. Dive Into Android Networking: Adding Ethernet Connectivity Enterprise Requirements & ECM Status • Enterprise Requirements: - Reliability: Ensuring data connection works in 100% cases for all possible applications. - HTTP(S) seamless proxy support for all applications. - Corporate firewalls prevents some services behavior (e.g. NTP). - Need to ensure everything stays behind the walls. - Ethernet 802.1x authentication. • Ethernet Connectivity Manager (ECM) Status - ECM patch has been done by Android-x86 team for netbooks. - Not 100% accurate or sufficient. 17 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  18. 18. Dive Into Android Networking: Adding Ethernet Connectivity Ethernet Interface – ECM Patch Status • Mismatch in implementation towards WiFi. • Rely on DHCPCd dhcp implementation instead of libnetutils. • Not completely bind on Connectivity Manager and Service. 18 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  19. 19. Dive Into Android Networking: Adding Ethernet Connectivity Am I Connected or What ? • Changes in Android framework, Settings app and System UI. • Supports DHCP (ECM patch default) and Static IP (added) addressing. • Connection status is available in notification bar. 19 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  20. 20. Dive Into Android Networking: Adding Ethernet Connectivity ECM Patch Additions • Register Ethernet Service - In framework's core/java/android/app/ContextImpl.java: registerService(ETHERNET_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(ETHERNET_SERVICE); IEthernetManager srv = IEthernetManager.Stub.asInterface(b); return new EthernetManager(srv, ctx.mMainThread.getHandler()); }}); • Letting Connectivity Service know about Ethernet: - In framework's services/java/com/android/server/ConnectivityService.java: [...] else if (networkType == ConnectivityManager.TYPE_ETHERNET) usedNetworkType = ConnectivityManager.TYPE_ETHERNET; 20 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  21. 21. Dive Into Android Networking: Adding Ethernet Connectivity ECM Patch Additions • Forcing default network preferences: - In framework's core/java/android/net/ConnectivityManager.java: - public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; + public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_ETHERNET; Issue: Android public API is being modified and make update-api is required. - In framework's packages/SettingsProvider/res/values/defaults.xml: - <integer name="def_network_preference">1</integer> + <integer name="def_network_preference">9</integer> - In framework's services/java/com/android/server/EthernetService.java: - Settings.Secure.putString(cr, Settings.Secure.ETHERNET_IFNAME, DevName[0]); + Settings.Secure.putString(cr, Settings.Secure.ETHERNET_IFNAME, "eth0"); 21 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  22. 22. Dive Into Android Networking: Adding Ethernet Connectivity And now, bugs and workarounds for various use cases: Making Ethernet 100% functional. 22 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  23. 23. Dive Into Android Networking: Adding Ethernet Connectivity Connection Information Symptom: What is my Ethernet IP configuration or MAC address info ? 23 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  24. 24. Dive Into Android Networking: Adding Ethernet Connectivity Connection Information – IP Address • In Settings's res/xml/device_info_status.xml: <Preference android:key="ethernet_ip_address" style="?android:attr/preferenceInformationStyle" android:title="@string/ethernet_advanced_ip_address_title" android:summary="@string/device_info_not_available" android:persistent="false" /> • In src/com/android/settings/deviceinfo/Status.java: private void setEthernetIpAddressStatus() { EthernetManager mgr = getSystemService(ETHERNET_SERVICE); EthernetDevInfo info = mgr.getSavedConfig(); Preference ip = findPreference("ethernet_ip_address"); String addr = null; if (info != null) { if (info.getIpAddress() != null) addr = info.getIpAddress(); else addr = SystemProperties.get("dhcp.eth0.ipaddress"); } ip.setSummary(!TextUtils.isEmpty(addr) ? Addr : getString(R.string.status_unavailable)); } 24 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  25. 25. Dive Into Android Networking: Adding Ethernet Connectivity Connection Information – MAC Address • In framework's JNI code core/jni/android_net_ethernet.cpp: {"getInterfaceMacAddress", "()Ljava/lang/String;", (void *)android_net_ethernet_getInterfaceMacAddress}, [...] static jstring android_net_ethernet_getInterfaceMacAddress(JNIEnv *env, jobject clazz) { struct ifreq ifr; strcpy (ifr.ifr_name, "eth0"); strcpy (ifr.ifr_hwaddr.sa_data, ""); sock = socket (AF_INET, SOCK_STREAM, 0); ioctl (sock, SIOCGIFHWADDR, &ifr); ptr = (unsigned char *) ifr.ifr_hwaddr.sa_data; snprintf (buf, 64, "%02x:%02x:%02x:%02x:%02x:%02x", (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)); return env->NewStringUTF(buf); } 25 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  26. 26. Dive Into Android Networking: Adding Ethernet Connectivity Connection Information – MAC Address • In Settings' res/xml/device_info_status.xml: <Preference android:key="ethernet_mac_address" style="?android:attr/preferenceInformationStyle" android:title="@string/status_ethernet_mac_address" android:summary="@string/device_info_not_available" android:persistent="false" /> • In Settings’ src/com/android/settings/deviceinfo/Status.java: private void setEthernetMacAddress() { EthernetManager mgr = getSystemService(ETHERNET_SERVICE); EthernetDevInfo info = mgr.getSavedConfig(); Preference mac = findPreference("ethernet_mac_address"); String addr = info == null ? null : info.getMacAddress(); mac.setSummary(!TextUtils.isEmpty(addr) ? addr : getString(R.string.status_unavailable)); } 26 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  27. 27. Dive Into Android Networking: Adding Ethernet Connectivity Android DNS Entry Management Symptom: DHCP can't seem to provide me with valid DNS entries. • Match Android process (AID) authorizations to update system properties in init's init/property_service.c: { "rw.", AID_SYSTEM, 0 }, { "net.", AID_DHCP, 0 }, • In DHCPCD's dhcpcd-hooks/20-dns.conf: for dnsaddr in ${new_domain_name_servers}; do setprop dhcp.${interface}.dns${count} ${dnsaddr} + setprop net.dns${count} ${dnsaddr} + setprop net.${interface}.dns${count} ${dnsaddr} count=$(($count + 1)) done • In framework's ethernet/java/android/net/ethernet/EthernetStateTracker.java: SystemProperties.set("net.dns1", mDhcpInfo.dns1); SystemProperties.set("net." + mInterfaceName + ".dns1", mDhcpInfo.dns1); 27 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  28. 28. Dive Into Android Networking: Adding Ethernet Connectivity HTTP(S) Proxy Symptom: I'm behind HTTP(S) proxy. I need my apps to seamlessly know about that ! 28 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  29. 29. Dive Into Android Networking: Adding Ethernet Connectivity HTTP(S) Proxy • Overlay frameworks/base/core/res/res/values/config.xml: <string name="config_default_proxy_host" translatable="false">a.b.c.d</string> <integer name="config_default_proxy_port" translatable="false">8080</integer> • In framework’s services/java/com/android/server/ConnectivityService.java: String proxyHost = context.getResources().getString( com.android.internal.R.string.config_default_proxy_host); int proxyPort = context.getResources().getInteger( com.android.internal.R.integer.config_default_proxy_port); mGlobalProxy = new ProxyProperties(proxyHost, proxyPort, null); SystemProperties.set("net.http.proxy", proxyHost + ":" + proxyPort); 29 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  30. 30. Dive Into Android Networking: Adding Ethernet Connectivity Custom NTP Server Symptom: I'm behind corporate firewall and can't do NTP request. My company provides its internal NTP server. 30 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  31. 31. Dive Into Android Networking: Adding Ethernet Connectivity Custom NTP Server • Overlay frameworks/base/core/res/res/values/config.xml: <!-- Remote server that can provide NTP responses. --> <string translatable="false" name="config_ntpServer">a.b.c.d</string> <!-- Timeout to wait for NTP server response. --> <integer name="config_ntpTimeout">20000</integer> • In framework's core/java/android/util/NtpTrustedTime.java: - final String defaultServer = res.getString(com.android.internal.R.string.config_ntpServer); + String defaultServer = Settings.System.getString(resolver, Settings.System.NTP_SERVER); • In framework's services/java/com/android/server/NetworkTimeUpdateService.java: - Force NTP update on Ethernet state change: if (netInfo.getState() == NetworkInfo.State.CONNECTED && netInfo.getType() == ConnectivityManager.TYPE_ETHERNET) mHandler.obtainMessage(EVENT_ETHERNET_CONNECTED).sendToTarget(); [...] case EVENT_WIFI_CONNECTED: case EVENT_ETHERNET_CONNECTED: onPollNetworkTime(msg.what); 31 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  32. 32. Dive Into Android Networking: Adding Ethernet Connectivity Custom NTP Server • In Settings's res/xml/date_time_prefs.xml: <EditTextPreference android:title="@string/ntp_server_time" android:key="ntp_server" android:singleLine="true" android:summary="192.168.1.1" android:inputType="textUri"/> • In Settings' src/com/android/settings/DateTimeSettings.java: EditTextPreference pref = findPreference("ntp_server"); String server = Settings.System.getString(getContentResolver(), Settings.System.NTP_SERVER); pref.setText(server); pref.setSummary(server); 32 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  33. 33. Dive Into Android Networking: Adding Ethernet Connectivity Email Symptom: I can't download email attachments. • In src/com/android/email/AttachmentInfo.java: - if (networkType != ConnectivityManager.TYPE_WIFI) { + if ((networkType != ConnectivityManager.TYPE_WIFI) && (networkType != ConnectivityManager.TYPE_ETHERNET)) { • In src/com/android/email/service/AttachmentDownloadService.java: - if (ecm.getActiveNetworkType() != ConnectivityManager.TYPE_WIFI) { + if ((ecm.getActiveNetworkType() != ConnectivityManager.TYPE_WIFI) && (ecm.getActiveNetworkType() != ConnectivityManager.TYPE_ETHERNET)) { 33 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  34. 34. Dive Into Android Networking: Adding Ethernet Connectivity Connectivity Route Symptom: I can't access to Google Play Store. The application just crash ! 34 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  35. 35. Dive Into Android Networking: Adding Ethernet Connectivity Connectivity Route Reverse engineering apps may help: • Dex2jar - Extracts usable classes.jar from APK archives. - See http://code.google.com/p/dex2jar/ • Java Decompiler (jd-gui) - See http://java.decompiler.free.fr/?q=jdgui 35 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  36. 36. Dive Into Android Networking: Adding Ethernet Connectivity Connectivity Route • Many (certified?) apps assume that WiFi or mobile connection is always present. - We need to trick the system for Ethernet. - But this is truly an ugly hack. • In framework's services/java/com/android/server/ConnectivityService.java: public NetworkInfo getNetworkInfo(int networkType, int uid) { - return getNetworkInfo(networkType, uid); + switch (networkType) { + case ConnectivityManager.TYPE_MOBILE: + case ConnectivityManager.TYPE_WIFI: + case ConnectivityManager.TYPE_WIMAX: + networkType = ConnectivityManager.TYPE_ETHERNET; + break; + default: + break; + } + return getNetworkInfo(networkType, uid); } • Android shouldn't expose WiFi Manager API ! - Apps should always go through Connectivity Manager for all network information. • Limitations: - Connectivity Manager API can't configure default connection type (currently hardcoded). - Too few information on existing devices' connectivity states. 36 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  37. 37. Dive Into Android Networking: Adding Ethernet Connectivity Download Provider Symptom: My browser works fine but I just can't download files. • In DownloadProvider's src/com/android/providers/downloads/DownloadInfo.java: - Add Ethernet connectivity support case ConnectivityManager.TYPE_ETHERNET: return DownloadManager.Request.NETWORK_ETHERNET; [...] if (networkType == ConnectivityManager.TYPE_ETHERNET) { return NETWORK_OK; // anything goes over ethernet } 37 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  38. 38. Dive Into Android Networking: Adding Ethernet Connectivity Multimedia Streaming Symptom: My browser works fine but I can't play multimedia contents. • Force Chrome HTTP stack instead of Android HTTP stack. - By default, Stagefright can't bypass proxy (see frameworks/base/media/libstagefright/Android.mk) - Overlay in your device's device.mk file: HTTP := chrome • In framework's media/libstagefright/chromium_http/support.cpp: char value[PROPERTY_VALUE_MAX]; property_get("net.http.proxy", value, "Unknown"); net::ProxyConfigServiceAndroid cfg = new net::ProxyConfigServiceAndroid(); if (strcmp(value_proxy,"Unknown") != 0) { std::string proxy = value; cfg->UpdateProxySettings(proxy, ""); } set_proxy_service(net::ProxyService::CreateWithoutProxyResolver(cfg, net_log())); • In framework's services/java/com/android/server/ConnectivityService.java: - Optionally force proxy detection in proprietary OMX Codecs: SystemProperties.set("net.proxy", host + ":" + port); SystemProperties.set("rw.HTTP_PROXY", "http://" + host + ":" + port); 38 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  39. 39. Dive Into Android Networking: Adding Ethernet Connectivity Phone / SIP VoIP Symptom: I can do VoIP SIP calls over WiFi but not over Ethernet. • Overlay frameworks/base/core/res/res/values/config.xml: <bool name="config_sip_ethernet">true</bool> • In framework's voip/java/android/net/sip/SipManager.java: public static boolean isSipEthernet(Context context) { return context.getResources().getBoolean(com.android.internal.R.bool.config_sip_ethernet); } • In framework's voip/java/com/android/server/sip/SipService.java: boolean mSipOnWifiOnly = SipManager.isSipWifiOnly(context); boolean mSipEthernet = SipManager.isSipEthernet(context); boolean connected = (info != null && info.isConnected() && ((!mSipOnWifiOnly || info.getType() == ConnectivityManager.TYPE_WIFI) || ( mSipEthernet && info.getType() == ConnectivityManager.TYPE_ETHERNET)); • In Phone's src/com/android/phone/SipCallOptionHandler.java: return ((ni.getType() == ConnectivityManager.TYPE_WIFI) || !SipManager.isSipWifiOnly(this)) || ((ni.getType() == ConnectivityManager.TYPE_ETHERNET) && SipManager.isSipEthernet(this)); 39 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  40. 40. Dive Into Android Networking: Adding Ethernet Connectivity Network Statistics Symptom: How much data did I use ? Where are my network statistics ? 40 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  41. 41. Dive Into Android Networking: Adding Ethernet Connectivity Network Statistics • Overlay frameworks/base/core/res/res/values/config.xml: <!-- Set of NetworkInfo.getType() that reflect data usage. --> <integer-array translatable="false" name="config_data_usage_network_types"> <item>9</item> <!-- TYPE_MOBILE_ETHERNET --> </integer-array> <!-- The default iface on which to monitor data use --> <string name="config_datause_iface">eth0</string> • Update Logtags samples in framework's services/java/com/android/server/EventLogTags.logtags: 51102 netstats_ethernet_sample (dev_rx_bytes|2|2),(dev_tx_bytes|2|2),(dev_rx_pkts|2|1),(dev_tx_pkts|2|1),(xt_rx_bytes|2|2), (xt_tx_bytes|2|2),(xt_rx_pkts|2|1),(xt_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(u id_rx_pkts|2|1),(uid_tx_pkts|2|1),(trusted_time|2|3),(dev_history_start|2|3) • In framework's ethernet/java/android/net/ethernet/EthernetStateTracker.java: - One need to add support for LinkProperties LinkProperties mLinkProperties = mDhcpInfo.makeLinkProperties(); mLinkProperties.setInterfaceName("eth0"); 41 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  42. 42. Dive Into Android Networking: Adding Ethernet Connectivity Network Statistics • In framework's services/java/com/android/server/net/NetworkStatsService.java: - Need to collect Ethernet samples. import static android.net.NetworkTemplate.buildTemplateEthernet; NetworkTemplate template = buildTemplateEthernet(); devTotal = getSummaryForNetworkDev(template, start, end).getTotal(devTotal); devHistoryStart = getHistoryStartLocked(template, mNetworkDevStats); xtTotal = getSummaryForNetworkXt(template, start, end).getTotal(xtTotal); uidTotal = getSummaryForAllUid(template, start, end, false).getTotal(uidTotal); EventLogTags.writeNetstatsEthernetSample( devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets, xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets, uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets, trustedTime, devHistoryStart); • Adding ConnectivityManager.TYPE_ETHERNET support to Monkey's NetworkMonitor - Used to display time spent proceeding data from Ethernet interface. 42 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  43. 43. Dive Into Android Networking: Adding Ethernet Connectivity Next Steps ? • Patchset is available on GitHub: • Current changeset with extra features is 504 kB big. • https://github.com/gxben/aosp-ethernet • Properly redesign the ECM patch to match Wi-Fi architecture. • Port from Ice Cream Sandwich to Jelly Bean (ongoing work) • Design Ethernet HAL for 802.1x / WPA support. • Contribute / upstream to Linaro ? • And then to Google ? 43 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  44. 44. Dive Into Android Networking: Adding Ethernet Connectivity Thanks Thank You 44 COPYRIGHT © 2013 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • Dipal123

    Jun. 2, 2017
  • wiliwe

    Feb. 19, 2017
  • lambdaWoo

    Oct. 28, 2015
  • RabendraPatel

    Mar. 20, 2015
  • YunboTsai

    Jul. 2, 2014
  • apaulyang

    Jul. 2, 2014
  • MarcoSinigaglia

    May. 17, 2014
  • KCFeng

    Mar. 19, 2014
  • reddypdl

    Nov. 6, 2013
  • xfalcons

    Jul. 31, 2013

Views

Total views

10,381

On Slideshare

0

From embeds

0

Number of embeds

48

Actions

Downloads

246

Shares

0

Comments

0

Likes

10

×