3 votes

Pilote de gadget USB Android

J'essaie de faire fonctionner Ethernet sur USB pour mon Nexus S. J'utilise Ice Cream Sandwich v4.0.3 et j'ai reconstruit le noyau avec le support des gadgets USB activé. Lorsque je connecte le téléphone à ma machine Linux et que j'exécute ifconfig -a, usb0 apparaît à la fois sur le téléphone et sur la machine Linux. J'exécute ifconfig pour configurer les deux côtés et tout semble correct mais je ne peux pas faire de ping d'un côté ou de l'autre :

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

J'ai aussi un N900 qui fonctionne avec Maemo Linux et qui autorise l'Ethernet sur USB. J'ai comparé les sorties de ethtool, ifconfig, route, et arp entre le N900 et le Nexus S et toutes sont très similaires sauf la sortie de arp. Il montre (incomplètement) l'adresse HWaddress pour la connexion 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

Le seul autre indice que j'ai est que ifconfig s'affiche du côté 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)

et du côté d'Android :

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)

Remarquez les paquets abandonnés du côté d'Android.

J'ai l'impression d'y être presque Des suggestions ?

EDIT :

J'ai reconstruit le noyau avec un module de noyau gadget (j'ai essayé à la fois g_cdc et g_ether) au lieu du support intégré. Je ne suis pas sûr que ce qui suit soit dû à cela ou simplement au fait que je n'étais pas synchrone dans mon message précédent. Si j'exécute un ping d'un côté ou de l'autre, les numéros TX et RX correspondent des deux côtés, mais le côté Android les laisse tomber pour une raison quelconque.

ifconfig côté hôte :

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)

ifconfig côté Android :

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)

UNE AUTRE EDIT ! !

Après avoir utilisé arp du côté hôte et ip du côté Android pour ajouter manuellement des entrées, les erreurs Destination Host Unreachable ont disparu, mais toujours pas de réponse ping. J'ai lancé Wireshark sur l'hôte et les messages provenant de l'appareil ne sont pas corrects. Les adresses mac affichées ne semblent pas correctes et le protocole est inconnu, il est donc affiché comme 0x7aab. Après avoir regardé les données réelles dans le message, il apparaît qu'il y a deux octets zéro ajoutés au message. Si ces octets étaient supprimés, tout semblerait s'aligner et fonctionner. Quelqu'un a-t-il déjà vu cela ou sait-il où dans le code cela peut être corrigé ?

ENCORE UN AUTRE MONTAGE !!!

Après avoir tout redémarré ce matin, je n'ai pas créé les fausses entrées ARP et j'ai relancé les pings. Selon Wireshark, il y avait un message ARP provenant de l'hôte et un message inconnu provenant du Droid, mais ils étaient de longueurs identiques. Après avoir examiné le contenu des messages, le Droid envoyait ce qui semblait être un message ARP valide également, mais il était décalé de 2 octets - deux octets supplémentaires au début et les deux derniers coupés.

0voto

bobbark Points 83

Il semble qu'il y ait un problème avec l'alignement des octets. J'ai trouvé ce message :

http://www.mail-archive.com/linux-omap@vger.kernel.org/msg20797.html

et sur cette base, j'ai apporté les modifications suivantes à 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];
<   }
< }
< 

Je peux maintenant faire un ping dans les deux sens sur l'USB. Si quelqu'un connaît une meilleure façon de résoudre ce problème, faites-le moi savoir, sinon je vais continuer comme ça.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X