|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre expérimenté
![]() Ingénieur sécurité Inscription : février 2007 Messages : 456 ![]() |
Bonjour a tous,
J'ai besoin d'ecouter et de parser des trames IPv6 pour un besoin particulier. J'utilise la libpcap pour sniffer les paquets et pas de soucis de ce cote la. Mon probleme, c'est lorsque j'essaie de mapper le packet renvoye par pcap_next vers ma structure ipv6. Je n'arrive pas a mettre les bons entetes dans les bons champs de ma structure. C'est sans doute une erreur relativement simple ou une incomprehension de ma part. Voici les extraits de codes: ip6.h: Code :
Code :
Code :
Code :
Je pense que c'est du a l'alignement des donnees par le compilateur, mais je vois pas comment gerer ca. Mes questions:
Merci a ceux qui ont lu jusque la.
__________________
http://datanycast.blogspot.com/ |
||||||||
|
00
|
|
|
#2 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Ta structure ip6_header n'est pas bonne. Là tu définit "version" sur 4 bits, ce qui est bon, mais ensuite tu as les 4 autres bits du char qui ne sont pas utilisés. Donc tu lis ton "cl" 4 bits trop loin, et tout est décalé. Pareil pour "label", où tu laisses 12 bits non occupés.
|
|
|
10
|
|
|
#3 | ||
|
Membre expérimenté
![]() Ingénieur sécurité Inscription : février 2007 Messages : 456 ![]() |
Merci, effectivement ca marche beaucoup mieux.
Pour ceux qui connaissent pas les bits fields, l'ensemble des bits doit etre contenu dans un champ type. La version correcte est: Code :
EDIT: Je crois que j'ai compris. J'ai lu ici que l'ordre des bits dans un bitfield n'est pas standard et depend de l'implementation. Je vois pas trop comment m'en sortir, a moins de considerer version, class et label sur un int et de parser a coup de decalage/masquage. Ca m'embete de parser de cette maniere, parce que je peux pas calquer ma structure directement sur la memoire et je dois ecrire un petit parseur. Y'a-t-il une solution plus elegante/interessante/utile a ce probleme?
__________________
http://datanycast.blogspot.com/ |
||
|
00
|
|
|
#4 | |
|
Membre confirmé
![]() Ingénieur développement matériel électronique Inscription : juillet 2010 Messages : 142 ![]() |
Salut!
Citation:
Je suis également preneur si quelqu'un connait une meilleur méthode!! |
|
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Je n'ai pas de solution non plus...
De toute façon, mapper des données sur une structure c'est fondamentalement non portable, même sans parler de bit fields. Rien ne dit que le compilo ne va pas ajouter du padding entre les champs. |
|
|
00
|
|
|
#6 | |
|
Membre expérimenté
![]() Ingénieur sécurité Inscription : février 2007 Messages : 456 ![]() |
Citation:
Je ne fait que mettre ces donnees en forme. D'ailleurs un parseur n'apporte rien de plus, car je dois avancer en offset fixes pour mapper mes champs. S'il y a padding (mais ce n'est pas possible), la structure sera incorrect de toute facon.
__________________
http://datanycast.blogspot.com/ |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Je sais que tes données sont adjacentes en mémoire. Mais par contre quand tu définit une structure le standard ne garantit pas que les champs sont adjacents en mémoire. Donc quand tu mappes ta structure sur tes données, le standard ne peut pas te garantir que ça va correspondre.
Par exemple si tu fais : Code :
Donc au final on fait généralement des trucs non standards qui dépendent du compilo et de la plate-forme, sinon on ne s'en sort pas. |
||
|
|
00
|
|
|
#8 |
|
Membre expérimenté
![]() Ingénieur sécurité Inscription : février 2007 Messages : 456 ![]() |
Ok, je comprends mieux ton explication. Je pensais (a tort) que le compilateur serait assez malin pour comprendre que lors du cast il doit mapper les donnees en tenant compte de l'alignement (vu qu'il le connait). Mais j'imagine que c'est trop complexe car il faut memoriser le padding pour chaque structure.
Dans mon cas, ca doit marcher par chance, car l'en-tete ipv6 est aligne sur 32 bits. Je comprends mieux du coup l'existance et l'interet des __attribute__((__packed__)), pragma et consort. Pour info, j'ai finallement parse les donnees. Derniere question. Est-ce que je devrait creer mes propres types pour m'assurer que le champ length fait bien 2 octets par exemple? Dans mon cas, je me repose sur le fait que short fait 2 octets et int 4. J'imagine que c'est pour ca que la libpcap definit les types u_char et compagnie?
__________________
http://datanycast.blogspot.com/ |
|
00
|
|
|
#9 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Le C définit des types de taille fixe intX_t et uintX_t, par exemple int8_t ou uint32_t.
Sinon les histoire de padding c'est surtout pour des raisons de performance, car il est plus rapide d'accéder à une donnée alignée qu'à une donnée non alignée. |
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
Voir même pour certains processeurs, il n'est pas possible d'accéder à des données non alignées.
Ce qui me rappelle que j'ai un article en cours de rédaction là-dessus et qu'il faudrait que je termine
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 220 ![]() |
Dans mes souvenirs, ces types sont "des entiers sur au moins X bits", mais ma mémoire peut me jouer des tours.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Non ce sont bien des longueur exactes. Pour les tailles minimales il y a les [u]int_leastX_t et [u]int_fastX_t.
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com