|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mars 2007 Messages : 2 ![]() |
Bonjour à tous,
dans un programme utilisant des rawsockets, une erreur apparaissait "aleatoirement" sur certaines machines linux. Je me suis rendu comptes qu'en fait cette erreur apparaissait lorsque les machines en question possédaient le noyau 2.6.19. Celles où le programme fonctionnait correctement avaient le noyau 2.6.9. J'ai donc réalisé un petit programme pour mettre en avant ce problème. Ce programme ouvre juste une rawsocket sur une interface en mode promiscuiss acceptant toutes trames et regarde la taille de la structure sockaddr_ll remonté. Le problème vient au moment de l'appel de recvfrom(), qui renvoi une taille de struct sockaddr_ll différent de sizeof(struct sockaddr_ll) sur les noyaux 2.6.19 et non sur les noyaux 2.6.9., on devrait avoir taille recue : 20 (= à la taille de la structure) et pour les noyaux 2.6.19 on obtient taille recue : 18 ... est ce que quelqu'un a déjà eu un problème similaire ? J'ai cherché dans les change logs des versions noyau mais entre le 2.6.9 et le 2.6.19 il y a eu un paquet de modif et je ne trouve rien Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() Inscription : mars 2004 Messages : 1 298 ![]() |
je n ai pas d'explication,mais sur un 2.6.20 même choses :
Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mars 2007 Messages : 2 ![]() |
J'ai la réponse à mon problème !
![]() En fait, la fonction recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, socklen_t *fromlen) à légèrement changé dans une évolution du noyau entre la 2.6.10 et 2.6.19 (me demandez pas laquelle exactement!). Le calcul de fromlen a changé : dans les noyaux antérieurs au 2.6.10, fromlen correspondait simplement à un sizeof de struct sockaddr_ll soit 20 mais il remonte sur les noyaux 2.6.19 et + la taille réelle remplie dans la structure ... struct sockaddr_ll { unsigned short sll_family; /* Toujours AF_PACKET 2o */ unsigned short sll_protocol; /* Protocole niveau physique 2o */ int sll_ifindex; /* Numéro d'interface 4o */ unsigned short sll_hatype; /* Type d'en-tête 2o */ unsigned char sll_pkttype; /* Type de paquet 1o */ unsigned char sll_halen; /* Longueur de l'adresse 1o */ unsigned char sll_addr[8]; /* Adresse niveau physique 8o */ }; le dernier champ est un buffer de 8 octets censé recueilir l'adresse de la couche physique mais dans le cas d'ethernet, l'adresse mac ne fait que 6 octets ! Puisque c'est la taille remplie qui est remontée à l'utilisateur désoramais, on se retrouve avec un 18 au lieu d'un 20 que l'on avait sur les noyaux plus anciens. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com