je fabrique mes propres paquets TCP et j'ai du mal a calculer le checksum
je cree le pseudo header comme ca :
struct pseudo_header
{
unsigned long saddr, daddr; /*! src/dst IP addresses */
char mbz;
unsigned char ptcl; /*! protocol (tcp = 6, udp = 17) */
unsigned short tcpl; /*! length (tcp header + payload)*/
};
ma fonction checksum est la suivante
int checksum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
et le tout est appele de la facon suivante
/*! *******************
* compute TCP checksum
* ********************
*/
int PSEUDO_SIZE = /*! 12 = size of the pseudoheader */
PAYLOAD_SIZE + (replay_tcp->doff*4) + 12;
char pseudo_tcp[ PSEUDO_SIZE ];
/*! fill up the pseudo header
*/
struct pseudo_header *ph;
ph->saddr = iph->saddr;
ph->daddr = iph->daddr;
ph->mbz = 0;
ph->ptcl = 6;
ph->tcpl = htons(PSEUDO_SIZE - 12);
replay_tcp->check = 0;
memcpy(pseudo_tcp, (char *) ph, 12);
memcpy(pseudo_tcp + 12, (char *) replay_tcp, PSEUDO_SIZE - 12);
/*! compute the checksum and store it in the TCP structure
*/
replay_tcp->check = checksum((unsigned short*) pseudo_tcp, PSEUDO_SIZE );
replay_tcp->check = checksum((unsigned short*) pseudo_tcp, PSEUDO_SIZE );
g_print("%x\n", ntohs(checksum((unsigned short*) pseudo_tcp, PSEUDO_SIZE )));
PAYLOAD_SIZE a la bonne valeur (je bosse sur des caracteres ascii pour le moment)
replay_tcp est bien parse, je le vois dans ethereal
Par contre ethereal me dit toujours que mes checksums sont faux, et effectivement la machine de destination n'accepte pas la connection lorsquelle recoit un SYN
J'ai relu plusieurs fois la RFC et le pseudo header correspond a ce qui est requis. Du coup, je pense que j'ai un probleme avec ma fonction checksum mais comme elle ne viens pas de moi et que je suis pas super a l'aise avec les complements a 1, j'y ai pas retouche......
si quelqu'un a une idee.... :)
# 2 idées et 1 remarque
Posté par jcs (site web personnel) . Évalué à 1.
2 - Tu risques des problèmes d'endianness en castant ta struct en unsigned short (surtout si tu es sur une little endian comme les x86) : problème des retenues dans la somme.
Remarque : Le unsigned short ne fait pas forcément 16 bits. Mieux vaut utiliser les types définis dans inttypes.h (Single Unix) intXX_t et uintXX_t.
[^] # Re: 2 idées et 1 remarque
Posté par jve (site web personnel) . Évalué à 1.
de fait, le code de creation devient
mais ca marche toujours pas :'(
# malloc ?
Posté par rouliann . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.