linux raw connecteur ethernet lier à des protocole
Je suis à l'écriture de code pour envoyer des premières trames Ethernet entre deux machines Linux. Pour tester cela, je veux juste obtenir un client simple d'envoyer et de serveur-recevoir.
J'ai correctement le client faisant des paquets (je peux les voir à l'aide d'un renifleur de paquets).
Sur le côté serveur j'initialise la prise de la sorte:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
où MY_ETH_PROTOCOL
est un 2 octets constante-je utiliser comme un ethertype donc je ne l'entendent pas de superflus trafic réseau.
quand je relier cette prise à mon interface, je dois passer à un nouveau protocole dans le socket_addr struct:
socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Si j'ai compiler et exécuter le code comme ceci puis il échoue. Mon serveur ne voit pas le paquet. Cependant si je change le code comme suit:
socket_address.sll_protocol = htons(ETH_P_ALL);
Le serveur peut alors voir le paquet envoyé par le client (ainsi que de nombreux autres paquets) alors, je dois faire quelques vérifications du paquet pour voir s'il correspond à MY_ETH_PROTOCOL
.
Mais je ne veux pas que mon serveur d'entendre la circulation qui n'est pas envoyé sur le protocole spécifié si ce n'est pas une solution. Comment puis-je faire cela?
socket_address
?OriginalL'auteur dschatz | 2010-07-29
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème.
Selon http://linuxreviews.org/dictionary/Ethernet/ se référant au champ de 2 octets suivant les adresses MAC:
donc je dois m'assurer que mes ethertype est >= 0x0600.
Selon http://standards.ieee.org/regauth/ethertype/eth.txt utilisation de 0x88b5 et 0x88b6 est "à disposition du public pour les prototypes et les fournisseurs spécifiques de l'élaboration du protocole." C'est donc ce que je vais utiliser comme un ethertype. Je ne devrais pas besoin de plus de filtrage, ainsi que le noyau doit assurez-vous de récupérer les trames ethernet avec la bonne adresse MAC de destination et l'utilisation de ce protocole.
OriginalL'auteur dschatz
J'ai travaillé autour de ce problème dans le passé en utilisant un filtre de paquets.
Main en Agitant (non testé pseudocode)
La vérification des erreurs et obtenir le filtre de paquets droit est laissé comme exercice pour le lecteur...
En fonction de votre application, une alternative qui peut être plus facile de se mettre au travail est libpcap.
OriginalL'auteur bstpierre