SlideShare a Scribd company logo
Dive Into Android Networking:
Adding Ethernet Connectivity
Benjamin Zores
ELCE 2012 – 6th November 2012 – Barcelona, Spain

                                                              1

                                     COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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


                                                          2

                                COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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 © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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



                                                        4

                              COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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




                                                 5

                       COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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_*


                                                       6

                             COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.


                                                    7

                          COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.

                                                      8

                            COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.

                                                         9

                               COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.


                                                            10

                                   COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.


                                                          11

                                 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Ethernet Interface – ECM Patch Status




• Mismatch in implementation towards WiFi.
• Rely on libnetutils dhcp implementation instead of DHCPCd.
• Not completely binded on Connectivity Manager and Service.
                                                          12

                                 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.




                                                       13

                              COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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;




                                                            14

                                   COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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");


                                                               15

                                      COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity




       And now, bugs and workarounds
            for various use cases:

      Making Ethernet 100% functional.




                                                16

                       COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Connection Information




                                   Symptom:

   What is my Ethernet IP configuration or MAC address info ?
                                                  17

                         COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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));
    }

                                                           18

                                  COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);
   }




                                                           19

                                  COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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));
   }




                                                          20

                                 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);




                                                                      21

                                             COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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 !

                                                22

                       COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);




                                                          23

                                 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.

                                                 24

                        COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);

                                                                            25

                                                   COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);




                                                           26

                                  COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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)) {




                                                          27

                                 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Connectivity Route




                                  Symptom:

               I can't access to Google Play Store.
                   The application just crash !
                                                 28

                        COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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




                                                               29

                                      COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.


                                                                               30

                                                      COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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
  }




                                                                 31

                                        COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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);



                                                                                       32

                                                              COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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));



                                                                     33

                                            COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Network Statistics




                                   Symptom:
                   How much data did I use ?
                 Where are my network statistics ?
                                                 34

                        COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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");


                                                                      35

                                             COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
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.




                                                                     36

                                            COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Next Steps ?



• Properly redesign the ECM patch to match WiFi architecture.

• Port from Ice Cream Sandwich to Jelly Bean
  - Check if original ECM patch has been updated since early 2012.
  - Current changeset with extra features is 504 kB big.


• Design Ethernet HAL for 802.1x / WPA support.

• Contribute / upstream to Linaro ?

• And then to Google ?

                                                        37

                               COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
Dive Into Android Networking: Adding Ethernet Connectivity
Thanks




             Thank You


                                                38

                       COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
ELCE 2012 - Dive into Android Networking: Adding Ethernet Connectivity
ELCE 2012 - Dive into Android Networking: Adding Ethernet Connectivity

More Related Content

PDF
Explore Android Internals
PPTX
Binder: Android IPC
PDF
ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity
PDF
Android Things : Building Embedded Devices
PDF
Low Level View of Android System Architecture
PDF
Understanding the Android System Server
PDF
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
PPTX
Android Booting Sequence
Explore Android Internals
Binder: Android IPC
ABS 2013: Dive into Android Networking - Adding Ethernet Connectivity
Android Things : Building Embedded Devices
Low Level View of Android System Architecture
Understanding the Android System Server
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Android Booting Sequence

What's hot (20)

PPTX
Overview of Android binder IPC implementation
PDF
Embedded Android : System Development - Part IV (Android System Services)
PDF
Android IPC Mechanism
PPTX
Android Binder: Deep Dive
PDF
Android's HIDL: Treble in the HAL
PDF
Embedded Android : System Development - Part II (HAL)
PPT
Android Audio System
PDF
Android Boot Time Optimization
PDF
Design and Concepts of Android Graphics
PPT
Android booting sequece and setup and debugging
PDF
CI/CD with Openshift and Jenkins
PPT
Learning AOSP - Android Linux Device Driver
PDF
Android Internals
PDF
Embedded Android : System Development - Part IV
ODP
Q4.11: Porting Android to new Platforms
PDF
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
PDF
Embedded Android : System Development - Part II (Linux device drivers)
PDF
Embedded Android Workshop
ODP
Inter-process communication of Android
ODP
Embedded Android : System Development - Part III
Overview of Android binder IPC implementation
Embedded Android : System Development - Part IV (Android System Services)
Android IPC Mechanism
Android Binder: Deep Dive
Android's HIDL: Treble in the HAL
Embedded Android : System Development - Part II (HAL)
Android Audio System
Android Boot Time Optimization
Design and Concepts of Android Graphics
Android booting sequece and setup and debugging
CI/CD with Openshift and Jenkins
Learning AOSP - Android Linux Device Driver
Android Internals
Embedded Android : System Development - Part IV
Q4.11: Porting Android to new Platforms
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android Workshop
Inter-process communication of Android
Embedded Android : System Development - Part III
Ad

Similar to ELCE 2012 - Dive into Android Networking: Adding Ethernet Connectivity (20)

PPTX
my seminar ppt
PDF
OSIS19_IoT :Transparent remote connectivity to short-range IoT devices, by Na...
PDF
Gregory Touretsky - Intel IT- Open Cloud Journey
PDF
Pivotal Digital Transformation Forum: Cloud and Devops - The Reality
PDF
Developers’ mDay u Banjoj Luci - Janko Isidorović, Mainflux – Unified IoT Pl...
PDF
Software Defined Networking/Openflow: A path to Programmable Networks
PDF
Mobile trends and impressions
PDF
Open Source & The Internet of Things
PDF
ch5-Fog Networks and Cloud Computing
PDF
Droidcon 2013 france - The Growth of Android in Embedded Systems
PPTX
A SOFTWARE DEFINED RADIO BASED
PPTX
Dynamic Software Defined Network Infrastructure Test Bed at Marist College
PDF
Cloud Expo New York: OpenFlow Is SDN Yet SDN Is Not Only OpenFlow
PDF
08 sdn system intelligence short public beijing sdn conference - 130828
PPTX
Designing For Interoperability in Mobile
PDF
PLNOG14: The benefits of "OPEN" in networking for operators - Joerg Ammon, Br...
PDF
Next Steps in the SDN/OpenFlow Network Innovation
PDF
Sviluppo IoT - Un approccio standard da Nerd ad Impresa, prove pratiche di Me...
PDF
Are you ready to be edgy? Bringing applications to the edge of the network
PDF
How to bootstrap your IoT project
my seminar ppt
OSIS19_IoT :Transparent remote connectivity to short-range IoT devices, by Na...
Gregory Touretsky - Intel IT- Open Cloud Journey
Pivotal Digital Transformation Forum: Cloud and Devops - The Reality
Developers’ mDay u Banjoj Luci - Janko Isidorović, Mainflux – Unified IoT Pl...
Software Defined Networking/Openflow: A path to Programmable Networks
Mobile trends and impressions
Open Source & The Internet of Things
ch5-Fog Networks and Cloud Computing
Droidcon 2013 france - The Growth of Android in Embedded Systems
A SOFTWARE DEFINED RADIO BASED
Dynamic Software Defined Network Infrastructure Test Bed at Marist College
Cloud Expo New York: OpenFlow Is SDN Yet SDN Is Not Only OpenFlow
08 sdn system intelligence short public beijing sdn conference - 130828
Designing For Interoperability in Mobile
PLNOG14: The benefits of "OPEN" in networking for operators - Joerg Ammon, Br...
Next Steps in the SDN/OpenFlow Network Innovation
Sviluppo IoT - Un approccio standard da Nerd ad Impresa, prove pratiche di Me...
Are you ready to be edgy? Bringing applications to the edge of the network
How to bootstrap your IoT project
Ad

More from Benjamin Zores (11)

PDF
CloudOpen 2014 - Extending Cloud Automation, When OpenStack Meets Ansible
PDF
ABS 2014 - The Growth of Android in Embedded Systems
PDF
ABS 2014 - Android Kit Kat Internals
PDF
Droidcon 2013 France - Android Platform Anatomy
PDF
ABS 2013: Android Jelly Bean Device Porting Walkthrough
PDF
ABS 2012 - Android Device Porting Walkthrough
PDF
ELCE 2011 - BZ - Embedded Linux Optimization Techniques - How Not To Be Slow
PDF
Introduction to OpenBricks: an Embedded Linux Framework
PDF
ELCE 2010 - State Of Multimedia In 2010 Embedded Linux Devices
PDF
ELC 2010 - GeeXboX Enna: Embedded Media Center
PDF
Fosdem 2010 - An Introduction to Enna Media Center
CloudOpen 2014 - Extending Cloud Automation, When OpenStack Meets Ansible
ABS 2014 - The Growth of Android in Embedded Systems
ABS 2014 - Android Kit Kat Internals
Droidcon 2013 France - Android Platform Anatomy
ABS 2013: Android Jelly Bean Device Porting Walkthrough
ABS 2012 - Android Device Porting Walkthrough
ELCE 2011 - BZ - Embedded Linux Optimization Techniques - How Not To Be Slow
Introduction to OpenBricks: an Embedded Linux Framework
ELCE 2010 - State Of Multimedia In 2010 Embedded Linux Devices
ELC 2010 - GeeXboX Enna: Embedded Media Center
Fosdem 2010 - An Introduction to Enna Media Center

Recently uploaded (20)

PDF
Empathic Computing: Creating Shared Understanding
PDF
KodekX | Application Modernization Development
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
A Presentation on Artificial Intelligence
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Modernizing your data center with Dell and AMD
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Big Data Technologies - Introduction.pptx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
Empathic Computing: Creating Shared Understanding
KodekX | Application Modernization Development
20250228 LYD VKU AI Blended-Learning.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Diabetes mellitus diagnosis method based random forest with bat algorithm
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
A Presentation on Artificial Intelligence
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
The Rise and Fall of 3GPP – Time for a Sabbatical?
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Modernizing your data center with Dell and AMD
Network Security Unit 5.pdf for BCA BBA.
Digital-Transformation-Roadmap-for-Companies.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Big Data Technologies - Introduction.pptx
Understanding_Digital_Forensics_Presentation.pptx

ELCE 2012 - Dive into Android Networking: Adding Ethernet Connectivity

  • 1. Dive Into Android Networking: Adding Ethernet Connectivity Benjamin Zores ELCE 2012 – 6th November 2012 – Barcelona, Spain 1 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 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 2 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 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 © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 4. 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 4 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 5. 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 5 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 6. 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_* 6 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 7. 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. 7 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 8. 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. 8 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 9. 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. 9 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 10. 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. 10 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 11. 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. 11 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 12. Dive Into Android Networking: Adding Ethernet Connectivity Ethernet Interface – ECM Patch Status • Mismatch in implementation towards WiFi. • Rely on libnetutils dhcp implementation instead of DHCPCd. • Not completely binded on Connectivity Manager and Service. 12 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 13. 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. 13 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 14. 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; 14 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 15. 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"); 15 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 16. Dive Into Android Networking: Adding Ethernet Connectivity And now, bugs and workarounds for various use cases: Making Ethernet 100% functional. 16 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 17. Dive Into Android Networking: Adding Ethernet Connectivity Connection Information Symptom: What is my Ethernet IP configuration or MAC address info ? 17 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 18. 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)); } 18 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 19. 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); } 19 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 20. 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)); } 20 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 21. 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); 21 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 22. 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 ! 22 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 23. 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); 23 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 24. 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. 24 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 25. 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); 25 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 26. 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); 26 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 27. 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)) { 27 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 28. Dive Into Android Networking: Adding Ethernet Connectivity Connectivity Route Symptom: I can't access to Google Play Store. The application just crash ! 28 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 29. 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 29 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 30. 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. 30 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 31. 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 } 31 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 32. 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); 32 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 33. 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)); 33 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 34. Dive Into Android Networking: Adding Ethernet Connectivity Network Statistics Symptom: How much data did I use ? Where are my network statistics ? 34 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 35. 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"); 35 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 36. 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. 36 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 37. Dive Into Android Networking: Adding Ethernet Connectivity Next Steps ? • Properly redesign the ECM patch to match WiFi architecture. • Port from Ice Cream Sandwich to Jelly Bean - Check if original ECM patch has been updated since early 2012. - Current changeset with extra features is 504 kB big. • Design Ethernet HAL for 802.1x / WPA support. • Contribute / upstream to Linaro ? • And then to Google ? 37 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.
  • 38. Dive Into Android Networking: Adding Ethernet Connectivity Thanks Thank You 38 COPYRIGHT © 2012 ALCATEL-LUCENT. ALL RIGHTS RESERVED.