The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Проблема с расчетом контрольной суммы IP, TCP."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Проблема с расчетом контрольной суммы IP, TCP."  +/
Сообщение от Andery email(ok) on 09-Дек-11, 20:35 
Здравствуйте, помогите пожалуйста с рассчетом контрольной суммы IP, TCP.
Предисловие:
Сейчас изучаю netgraph.
Хочу написать модуль, который в проходящих через него пакеты меняет IP адреса источника и назначения местами.
На машине стоит Ubuntu, на ней виртуалка с FreeBSD.
В сеть посылаю пакеты tcpreplay'ем, которые сохранил на Ubuntu с помощью tcpdump(пакеты посылал с виртуалки ping'ом).
На виртуалке сетевые интерфейсы стоят в promisc режиме.
Перед попаданием на интерфейс пакет проходит через мой модуль.

Собственно, сами вопросы:

1) Могу ли я рассчитывать этой функцией контрольную сумму для IP и для TCP?
Функция для подсчета контрольной суммы:
static unsigned short сsum  (unsigned short *ptr, int len)
{
register int sum = 0;
while (len > 1)
{
sum += *ptr++;
len -= 2;
}
if (len == 1)
sum += *((unsigned char *) ptr);
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return (~sum);
}

2) Правильно ли я рассчитываю контрольную сумму IP?
Для замены IP определена функция:
#define xchg(a,b,type) do { type t; t=a; a=b; b=t;} while (0)

В пакете меняю ip местами следующим образом:
struct mbuf *m;
struct ip *ip;
ip = mtod(m, struct ip *);
    xchg(ip->ip_dst.s_addr, ip->ip_src.s_addr, u_int32_t);

Далее посдсчитываю контрольную сумму ip:
        ip-ip_sum=0;
        ip->ip_sum=сsum((unsigned short *)ip, sizeof(struct ip));

3)С подсчетом контрольной суммы TCP я не очень разобрался. Правильно ли я понял, что для подсчета контрольной суммы TCP используется псевдозаголовок и TCP заголовок + данные?
Для начала я заполняю псевдозаголовок:
struct ippseudo ippseudo;
        ippseudo->ippseudo_src = ip->ip_src;
    ippseudo->ippseudo_dst = ip->ip_dst;
    ippseudo->ippseudo_pad = 0;
    ippseudo->ippseudo_p = IPPROTO_TCP;
    ippseudo->ippseudo_len = htons(sizeof(struct tcphdr));

4)Правильно ли я определяю указатель на заголовок TCP?
struct tcphdr *th;
th=(struct tcphdr *)((caddr_t)ip+(ip->ip_hl <<2));

5) Что нужно подать на функцию csum, что бы правильно рассчитать контрольную сумму TCP?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Проблема с расчетом контрольной суммы IP, TCP."  +/
Сообщение от Andery email(ok) on 11-Дек-11, 21:58 
Тема не актуальна, можно удалять.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру