Расчет контрольной суммы IP в C - PullRequest
0 голосов
/ 14 мая 2018

Я посмотрел на RFC 1071 для получения некоторой информации о расчете контрольной суммы IP.Для приложения, которое я делаю, мне нужно вычислить контрольную сумму IP-адреса 20-байтового IP-заголовка (без параметров).Мой код выглядит следующим образом:

uint16_t calculate_ip_chksum(IP *ip)
{
    uint16_t *buf = (uint16_t *) ip;
    uint32_t sum = 0;
    uint16_t checksum = 0;

    int counter = (ip->version & 0xF) * 4;
    while (counter > 1)
     {
            sum += *buf++;
            counter -= 2;
     }

    if (counter == 1)
            sum += * (uint8_t *) buf;

    while (sum >> 16)
            sum = (sum & 0xFFFF) + (sum >> 16);
    checksum = ~sum;
    return checksum;
}

Я определил заголовок IP следующим образом:

typedef struct ip_h
{
    uint8_t version;
    uint8_t tos;
    uint16_t tot_len;
    uint16_t id;
    uint16_t frag_off;
    uint8_t ttl;
    uint8_t proto;
    uint16_t chksum;
    uint32_t src;
    uint32_t dst;

} IP;

Я понимаю математику, как вычислить контрольную сумму, но я не понимаю, почему мойкод (который практически совпадает с RFC) не работает.

1 Ответ

0 голосов
/ 14 мая 2018

Вы получаете счетчик из ip-> version вместо tot_len.

 int counter = (ip->version & 0xF) * 4;

Я предполагаю, что вы хотите общее количество байтов в буфере для контрольной суммы.

...