3 votos

Controlador de Gadgets USB para Android

Estoy intentando que funcione Ethernet por USB para mi Nexus S. Estoy ejecutando Ice Cream Sandwich v4.0.3 y he reconstruido el kernel con el soporte de USB Gadget activado. Cuando conecto el teléfono a mi caja de Linux y ejecuto ifconfig -a, aparece usb0 tanto en el teléfono como en la caja de Linux. Ejecuto ifconfig para configurar ambos lados y todo se ve correcto pero no puedo hacer ping de ningún lado:

PING 192.168.22.2 (192.168.22.2) 56(84) bytes of data.
From 192.168.22.1 icmp_seq=1 Destination Host Unreachable
From 192.168.22.1 icmp_seq=2 Destination Host Unreachable

También tengo un N900 corriendo Maemo Linux que permite Ethernet sobre USB. Comparé la salida de ethtool, ifconfig, route y arp entre el N900 y el Nexus S y todas son muy similares excepto la salida arp. Se muestra (incompleta) para la dirección HW para la conexión Android:

Address                  HWtype  HWaddress           Flags Mask            Iface
10.1.3.1                 ether   00:1B:17:05:30:13   C                     eth0
192.168.22.2                     (incomplete)                              usb0

La única otra pista que tengo es que ifconfig aparece en el lado de Linux:

usb0      Link encap:Ethernet  HWaddr 66:E4:64:10:D1:A9  
      inet addr:192.168.22.1  Bcast:192.168.22.255  Mask:255.255.255.0
      inet6 addr: fe80::64e4:64ff:fe10:d1a9/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 b)  TX bytes:9039 (8.8 KiB)

y en el lado de los Androids:

usb0      Link encap:Ethernet  HWaddr 7A:78:28:52:9C:A0
      inet addr:192.168.22.2 Bcast:192.168.22.255 Mask:255.255.255.0
      inet6 addr: fe80::7878:28ff:fe52:9ca0/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:202 errors:0 dropped:202 overruns:0 frame:0
      TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
      RX bytes:47294 (46.1 KiB)  TX bytes:1728 (1.6 KiB)

Fíjese en los paquetes lanzados en el lado de los Androids.

Parece que ya casi estoy allí ¿Alguna sugerencia?

EDITAR:

Reconstruí el kernel con un módulo de kernel gadget (he probado tanto g_cdc como g_ether) en lugar de tener soporte integrado. No estoy seguro de si lo siguiente se debe a eso o simplemente a estar fuera de sincronía en mi anterior post. Si ejecuto ping en cualquiera de los dos lados, los números TX y RX coinciden en realidad en ambos lados, pero el lado Android los está dejando caer por alguna razón.

Lado del anfitrión ifconfig:

usb0      Link encap:Ethernet  HWaddr 12:23:34:45:56:67  
      inet addr:192.168.22.1  Bcast:192.168.22.255  Mask:255.255.255.0
      inet6 addr: fe80::1023:34ff:fe45:5667/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:33 errors:0 dropped:0 overruns:0 frame:0
      TX packets:734 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:1140 (1.1 KiB)  TX bytes:37684 (36.8 KiB)

Lado Android ifconfig:

usb0      Link encap:Ethernet  HWaddr 5E:89:C6:D8:BC:08  
      inet addr:192.168.22.2  Bcast:192.168.22.255  Mask:255.255.255.0
      inet6 addr: fe80::5c89:c6ff:fed8:bc08/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:734 errors:0 dropped:734 overruns:0 frame:0
      TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:27408 (26.7 KiB)  TX bytes:1602 (1.5 KiB)

¡OTRA EDICIÓN!

Después de usar arp en el lado del host e ip en el lado de Android para añadir entradas manualmente, los errores de "Host de destino inalcanzable" desaparecieron pero aún no hay respuesta de ping. Corrí Wireshark en el host y los mensajes del dispositivo no son correctos. Las direcciones mac no se ven bien y el protocolo es desconocido, así que sólo se muestra como 0x7aab. Después de mirar los datos reales en el mensaje parece que hay dos cero bytes preparados para el mensaje. Si esos fueran eliminados parece que todo se alinearía y funcionaría. ¿Alguien ha visto esto o sabe en qué parte del código se puede arreglar?

¡¡¡OTRA EDICIÓN MÁS!!!

Después de arrancar todo esta mañana, no creé las entradas falsas del ARP y volví a ejecutar los pings. Según Wireshark había un mensaje ARP que venía del anfitrión y un mensaje desconocido que venía del droide, pero eran de idéntica longitud. Después de examinar el contenido de los mensajes, el droide estaba enviando lo que parecía ser un mensaje ARP válido también, pero fue desplazado por 2 bytes - dos bytes extra al principio y los dos últimos cortados.

0voto

bobbark Puntos 43

Parece que hay un problema con la alineación de los bytes. Encontré este poste:

_COPY9@vger.kernel.org/msg20797.html

y en base a eso hizo los siguientes cambios en drivers/usb/gadget/u_ether.c:

257,258c257
< 
<   //skb_reserve(skb, NET_IP_ALIGN);
---
>   skb_reserve(skb, NET_IP_ALIGN);
513d511
<         int                     i=0;
599,606d596
< 
< if ((int)skb->data & 0x2) {
<   skb_push(skb, 2);
<   for (i=0; i<length; i++) {
<     skb->data[i] = skb->data[i+2];
<   }
< }
< 

Ahora puedo hacer ping en ambas direcciones a través del USB. Si alguien sabe de una mejor manera de abordar esto, por favor hágamelo saber, de lo contrario me iré con esto.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X