[réseau] erreur création paquet ip
Grâce à un article internet, je me suis lancé dans l'envoi d'un paquet IP/ICMP.
Voilà que j'ai construit (fortement inspiré du fameux article) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| struct iphdr *Create_IP4(unsigned char life_time, string ip_source, string ip_dest, link_proto proto){
struct iphdr *ip;
ip = (struct iphdr *)malloc(sizeof(struct iphdr)); //allocation de l'espace mémoire pour la structure ip
memset(ip, 0x0, sizeof(struct iphdr)); //on initialise à zéro
unsigned short ip_version = 4;
unsigned short ip_len = sizeof(struct iphdr) / sizeof(unsigned long);
ip->verlen = (ip_version << 4)| ip_len;
ip->tos = 0;
ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr));
ip->id = 1;
ip->offset = 0;
ip->ttl = life_time;
ip->saddr = inet_addr(ip_source.c_str());
ip->daddr = inet_addr(ip_dest.c_str());
ip->checksum = 0;
if(proto == icmp){
ip->protocol = IPPROTO_ICMP;
}
ip->checksum = checksum((unsigned short *)ip, sizeof(struct iphdr));
return ip;
}
unsigned short checksum(unsigned short *buffer, int taille){
unsigned long cksum = 0;
while(taille < 1){
cksum += *buffer++;
taille -= sizeof(unsigned short);
}
if(taille) cksum += (unsigned char *)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (unsigned short *)(~cksum);
} |
J'ai deux problèmes de conversion : dans la fonction checksum
Code:
cksum += (unsigned char *)buffer;
Citation:
invalid conversion from `unsigned char*' to `long unsigned int'
Code:
return (unsigned short *)(~cksum);
Citation:
invalid conversion from `short unsigned int*' to `short unsigned int'
Je comprends bien le problème du compilateur mais si je converti comme il veut est-ce que mon code restera valable (pas de problème de dimension lorsqu'il faudra envoyer le paquet)
J'avoue que je ne comprends pas vraiment le code du calcul de la checksum. Si quelqu'un peux me l'expliquer en détail. (surtout le "cksum += *buffer++;" et le "(cksum >> 16) + (cksum & 0xffff);")
Je sais que c'est pas très professionnel de demander ce que fait mon propre code mais je débute avec les raw socket.