Sending icmp raw sockets

813 views Asked by At

So I got an assignment about programming a whole TCP/IP stack (including ARP and ICMP). So far I'm stuck at ICMP. It seems that every packet I send, according to Wireshark, is malformed (the IP header isn't, only ICMP).

I can't use the existing structures so I had to create some myself.

Here is my icmp_header_t structure:

typedef struct {
   uint8_t type;
   uint8_t code;
   uint16_t checksum;
   } icmp_header_t;

I think this may have to do with my checksum calculation. Here is the checksum calculation:

uint16_t csum (uint16_t *buffer, int length){
    unsigned long sum;

        // initialize sum to zero and loop until length (in words) is 0
        for (sum=0; length>1; length-=2) // sizeof() returns number of bytes, we're interested in number of words
            sum += *buffer++;   // add 1 word of buffer to sum and proceed to the next

        // we may have an extra byte
        if (length==1)
            sum += (unsigned char)*buffer;

        sum = (sum >> 16) + (sum & 0xFFFF);  // add high 16 to low 16
        sum += (sum >> 16);          // add carry
        return (uint16_t) ~sum;
}

And this is how I build my header: construct_icmp_header(icmp_head, ICMP_ECHO, 0, 0);

And how I calculate the checksum: icmp_head->checksum = csum((uint16_t *) icmp_head, sizeof(icmp_header_t));

This is the hexdump of one of my icmp packets:

And one that is correct:

Would anyone have an idea about this?

Edit: So I solved it. It was a field missing, quench (now replaced by id and seq).

0

There are 0 answers