2016-08-25 14 views
0

Ma configuration est un périphérique intégré auquel on accède à partir d'une tablette (peut être Android ou iOS).Connexion Bluetooth PAN - ARP ne fonctionne pas

L'appareil est accessible via Bluetooth et il implémente le profil PAN (rôle NAP), de sorte que la tablette le considère comme un périphérique à travers lequel il peut accéder à Internet. J'utilise DBus pour enregistrer un serveur NAP avec Bluez. Cela fonctionne bien, et Bluez crée une interface réseau nommée 'bnep0' lorsque la tablette se connecte. I ont configuré l'interface bnep0 dans/etc/network/interfaces:

iface bnep0 inet static 
    address 10.254.239.1 
    netmask 255.255.255.0 
    post-up service isc-dhcp-server start 
    pre-down service isc-dhcp-server stop 

J'utilise udev pour faire l'interface vers le haut/vers le bas en utilisant la règle définie dans /etc/udev/rules.d/50-bnep .rules:

ACTION=="add", KERNEL=="bnep0" SUBSYSTEM=="net", RUN+="/sbin/ifup bnep0" 
ACTION=="remove", KERNEL=="bnep0", SUBSYSTEM=="net", RUN+="/sbin/ifdown bnep0" 

Comme vous pouvez le voir, j'utiliser l'interface haut/bas événements pour démarrer/arrêter un serveur DHCP qui fournit une adresse IP à la tablette.

Mon serveur DHCP est configuré par les lignes suivantes dans /etc/dhcp/dhcpd.conf:

subnet 10.254.239.0 netmask 255.255.255.0 { 
    range 10.254.239.2 10.254.239.254; 
} 

En remarque, je crée aussi un br0 de pont de réseau dans/etc/network/interfaces. Cela est requis par Bluez afin d'enregistrer une interface NAP:

iface br0 inet manual 
    bridge_ports none 
    bridge_fd 0 
    bridge_stp off 

Tout cela fonctionne très bien. La tablette effectuera la liaison Bluetooth avec mon appareil et se connectera avec succès. Je peux aussi observer que la tablette interroge le serveur DHCP de mon appareil et se voit assigner l'adresse 10.254.239.2

Sur mon appareil, je reçois la sortie de la commande « ip addr show »:

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 5c:e0:c5:af:7b:f6 brd ff:ff:ff:ff:ff:ff 
    inet6 fe80::984d:cdff:fe4b:65be/64 scope link 
     valid_lft forever preferred_lft forever 
9: bnep0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 
    link/ether 5c:e0:c5:af:7b:f6 brd ff:ff:ff:ff:ff:ff 
    inet 10.254.239.1/24 brd 10.254.239.255 scope global bnep0 
     valid_lft forever preferred_lft forever 
    inet6 fe80::5ee0:c5ff:feaf:7bf6/64 scope link 
    valid_lft forever preferred_lft forever 

Je puis lancement une application sur mon périphérique intégré, qui ouvre un socket serveur TCP sur l'adresse 10.254.239.1, port 15137. L'application écoute les connexions entrantes de la tablette.

Maintenant, je tente d'ouvrir un socket client TCP à partir de la tablette à l'adresse IP 10.254.239.1. Je peux observer (en utilisant wireshark) que l'interface bnep0 reçoit des requêtes ARP pour l'adresse IP 10.254.239.1. Mais mon appareil ne génère aucune réponse ARP et l'application de la tablette expirera en essayant de connecter la socket TCP :-(

De même, si j'essaie de faire un ping sur la tablette à partir de mon périphérique embarqué, j'observe que mon périphérique envoie les requêtes ARP pour 10.254.239.2 auxquelles la tablette répond normalement, mais c'est comme si la réponse ARP n'était pas reçue par le périphérique, car elle n'envoie pas de requête ping par la suite

Ainsi, le symptôme est que Les paquets ARP sur l'interface bnep0 ne sont pas traités

Je ne peux vraiment pas comprendre ce que je manque, est-ce que l'un de vous peut m'aider?

Répondre

0

En fin de compte, le problème était mon propre manque de compréhension du fonctionnement d'un pont réseau.

J'ai trouvé le HOWTO très instructif Persistently bridge traffic between two or more Ethernet interfaces (Debian), qui indique clairement qu'une fois qu'une interface réseau a été ajoutée à un pont, elle ne peut pas être utilisée comme point de terminaison pour le trafic IP.

Ainsi, ce que je devais faire était de changer la configuration de mes interfaces réseau dans/etc/network/interfaces telles que le pont devient le point de terminaison IP:

iface br0 inet static 
    address 10.254.239.1 
    netmask 255.255.255.0 
    bridge_ports none 
    bridge_fd 0 
    bridge_stp off 

Notez que la section pour bnep0 peut être complètement omis.

Également grâce à ELinux - Bluetooth Network pour l'inspiration.