Project

General

Profile

Feature #1889

Add USB Ethernet support

Added by Kurtis Hanna 12 months ago. Updated 3 months ago.

Status:
In Progress
Priority:
Low
Assignee:
-
Category:
Wi-Fi
Target version:
Start date:
09/01/2018
Due date:
% Done:

0%

Estimated time:
Resolution:
Device:

Description

Currently Replicant devices can connect to the Internet via a USB connection to a computer that's connected to the Internet: https://redmine.replicant.us/projects/replicant/wiki/ReplicantUSBNetworking

However, Replicant devices can't connect to the Internet via a a USB Ethernet Adapter: https://redmine.replicant.us/boards/9/topics/8001

It seems as though the reason why Replicant doesn't currently work with USB Ethernet Adapters is due to the fact that upstream LineageOS disables kernel module support for security reasons. https://www.reddit.com/r/LineageOS/comments/5xrapo/ethernet_on_lineage/ https://redmine.replicant.us/boards/9/topics/8001?r=8031#message-8031

It seems like Android 6 does support this type of feature: https://www.youtube.com/watch?v=uisnj8Xufp0

I'm not sure if this is helpful, but I figured I'd add this link to LineageOS' source code as well: https://git.replicant.us/LineageOS-mirror/android_frameworks_opt_net_ethernet/log/?h=cm-13.0

Would it be a security issue to add this functionality to all Replicant devices by enabling kernel module support to get ethernet working, as the LineageOS dev suggested on the reddit post?

Replicant 6 currently supports 3 "Wi-Fi only" tablets. Without mobile data or the ability to use the internal Wi-Fi card with software freedom, users must choose between reverse tethering their Replicant device to a computer that is on the internet or buying an external USB Wi-Fi dongle and using RepWifi. It'd be great to offer another option.

Lastly, I couldn't find a Category for this issue that made sense. Please feel free to create an "Other" category in redmine or move this issue to a Category that makes more sense.

History

#1

Updated by Denis 'GNUtoo' Carikli 12 months ago

Hi,

As I understand the best way to solve this bug would be to simply compile in the kernel image, all USB Ethernet adapters drivers. This should be trivial to do.

It would be better to have them as modules (as it would use less RAM and would carry less risk of making the kernel image too big for the boot partition) but as far as I know we have no good enough module loading mechanism in Android 6.x to do that.

#2

Updated by Kurtis Hanna 7 months ago

I'd love to research this issue more. Does anyone have any links to articles or documentation or code about this? I would really like to be able to connect my phone to my ethernet cable if it is a somewhat trival thing to make happen in software.

#3

Updated by Denis 'GNUtoo' Carikli 6 months ago

The following might work:
  • Start to work on it for a device that you can easily test on
  • try to build an image and test it
  • go in your kernel source code and run:
    export ARCH=arm
    make xconfig # select the drivers you want to add, like the asix driver
    make savedefconfig
    

    Then copy the generated defconfig in the place of your kenrel default configuration

For the Galaxy S3 4G, in device/samsung/i9305/BoardConfig.mk we have:

# Kernel
TARGET_KERNEL_SOURCE := kernel/samsung/smdk4412
TARGET_KERNEL_CONFIG := lineageos_i9305_defconfig

You can then go in kernel/samsung/smdk4412 and you have arch/arm/configs/lineageos_i9305_defconfig
You can then run the following to change the kernel configuration:

export ARCH=arm
make lineageos_i9305_defconfig
make xconfig # select the drivers you want to add, like the asix driver
make savedefconfig
cp defconfig arch/arm/configs/lineageos_i9305_defconfig

However if you do that, the Android build system might complain that your kernel source tree is dirty, so you can remove the binaries changes with the following:

make clean
make mrproper
make distclean

This is because running "make xconfig" will compile the graphical utility that enables you to change the kernel configuration.

Alternatively you can just clone the kernel again outside of the Replicant tree and do that there, and copy the resulting defconfig in Replicant source tree.

Once it's cleaned you can re-launch a build as usual, sign the build and install it as usual.

While this takes more time and it not very convenient it's way safer than flashing the boot.img.

If you do still attempt to flash the boot.img make sure to double check that you are not flashing the kernel in the bootloader partition, otherwise your may break your device if you do that.

This mistake is not that far fetched: On some devices like the Galaxy SII, the PIT partition named BOOT is the bootloader, while on many other devices it's the boot.img

#4

Updated by Denis 'GNUtoo' Carikli 5 months ago

  • Target version changed from Replicant 6.0 0005 to Replicant 6.0 0004
#5

Updated by Denis 'GNUtoo' Carikli 4 months ago

I've tested an adapter compatible with the asix driver with the Galaxy Nexus.

On my desktop, lsusb shows the following:

$ sudo lsusb -d 0b95:1720  -vvvv

Bus 001 Device 016: ID 0b95:1720 ASIX Electronics Corp. 10/100 Ethernet
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            2 Communications
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0b95 ASIX Electronics Corp.
  idProduct          0x1720 10/100 Ethernet
  bcdDevice            0.01
  iManufacturer           1 USB
  iProduct                2 USB2.0 10/100 Ethernet Adapter
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0027
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              300mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass         0 
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              11
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            2 Communications
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  bNumConfigurations      1
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0000
  (Bus Powered)

This shows that it should consume 300mA maximum.

The Galaxy Nexus should be able to provide 500mA on the USB port according to the kernel source code

However when I tried it, in dmesg we can see the following error:

asix 1-1:1.0: (unregistered net_device): Failed to enable software MII access

The interface also was not there in /sys/class/net

#6

Updated by Denis 'GNUtoo' Carikli 4 months ago

On the Galaxy Nexus, after retrying after a power off and power on I got a "<->" icon in the top bar. This is the icon for ethernet. I can then update repositories with f-droid.

#7

Updated by Denis 'GNUtoo' Carikli 4 months ago

I've sent patches to the mailing list for the Galaxy Nexus, that I could then reliability test. It didn't work the first time but it worked all the subsequent times reliabily.

I've patches for the Galaxy SII too, but I need to go buy a new battery as on the second hand ones I have just doing 'dmesg' in the terminal application makes the touchkey leds flicker. This is probably because it refresh the display and consume more power and that such old battery can't stand the current draw.

I've pushed the patches in the following repositories:

The ethernet/replicant-6.0-dev branch in my manifest can also be used to test the patches.

#8

Updated by Denis 'GNUtoo' Carikli 3 months ago

  • Status changed from New to In Progress

Also available in: Atom PDF