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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
cksum += (unsigned char *)buffer;
invalid conversion from `unsigned char*' to `long unsigned int'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
return (unsigned short *)(~cksum);
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.