LINUX.ORG.RU

bad tcp cksum


0

0

создаю tcp-ip пакет стандартным образом, заполняю его: bzero(&(pack->ip), sizeof(struct iphdr)); struct tcp_pseudohdr { struct in_addr saddr; struct in_addr daddr; u_char zero; u_char protocol; u_short lenght; struct tcphdr tcpheader; } pseudoheader;

pack->ip.ip_v = 4; pack->ip.ip_hl = sizeof(struct iphdr)/4; pack->ip.ip_tos = 0; pack->ip.ip_len = htons(TCPIP_SIZE + pack->datalen); pack->ip.ip_id = htons(getpid()&255); pack->ip.ip_off |= htons(fragments); /* TO_DO */ pack->ip.ip_off |= htons(fragoff >> 3); /* TO_DO */ pack->ip.ip_ttl = PACK_TTL; pack->ip.ip_p = 6; pack->ip.ip_sum = cksum((unsigned short *)&(pack->ip), sizeof(struct iphdr)); /* by the kernel? 20? */ pack->ip.ip_dst = look_up(dhost); pack->ip.ip_src = look_up(shost); /* checksum */ bzero(&pseudoheader, sizeof(struct tcp_pseudohdr)); pseudoheader.saddr.s_addr = look_up(shost); pseudoheader.daddr.s_addr = look_up(dhost); pseudoheader.protocol = 6; /* tcp */ pseudoheader.lenght = htons(sizeof(struct tcphdr)); bcopy((char*)&(pack->tcp), (char*)&(pseudoheader.tcpheader), sizeof(struct tcphdr)); pack->tcp.th_sum = cksum((u_short*)&(pseudoheader), sizeof(struct tcp_pseudohdr) + pack->datalen);//cksum по мануалам - стандартная.

отслеживаю отправку в tcpdump: ..[bad tcp cksum 0 (->35e5)!]..

ваши соображения из-за чего сумма может неправильно считаться(а то я уж и не знаю на что грешить)? Если надо то могу и другие функции сюда выложить..

И еще вопрос если сумма не правильная то удаленная система игнорирует пакет?

anonymous

Re: bad tcp cksum

Извиняюсь.. так читабельней :)

создаю tcp-ip пакет стандартным образом, заполняю его:

bzero(&(pack->ip), sizeof(struct iphdr)); struct tcp_pseudohdr { struct in_addr saddr; struct in_addr daddr; u_char zero; u_char protocol; u_short lenght; struct tcphdr tcpheader; } pseudoheader;

pack->ip.ip_v = 4; pack->ip.ip_hl = sizeof(struct iphdr)/4; pack->ip.ip_tos = 0; pack->ip.ip_len = htons(TCPIP_SIZE + pack->datalen); pack->ip.ip_id = htons(getpid()&255); pack->ip.ip_off |= htons(fragments); /* TO_DO */ pack->ip.ip_off |= htons(fragoff >> 3); /* TO_DO */ pack->ip.ip_ttl = PACK_TTL; pack->ip.ip_p = 6; pack->ip.ip_sum = cksum((unsigned short *)&(pack->ip), sizeof(struct iphdr)); /* by the kernel? 20? */ pack->ip.ip_dst = look_up(dhost); pack->ip.ip_src = look_up(shost); /* checksum */ bzero(&pseudoheader, sizeof(struct tcp_pseudohdr)); pseudoheader.saddr.s_addr = look_up(shost); pseudoheader.daddr.s_addr = look_up(dhost); pseudoheader.protocol = 6; /* tcp */ pseudoheader.lenght = htons(sizeof(struct tcphdr)); bcopy((char*)&(pack->tcp), (char*)&(pseudoheader.tcpheader), sizeof(struct tcphdr)); pack->tcp.th_sum = cksum((u_short*)&(pseudoheader), sizeof(struct tcp_pseudohdr) + pack->datalen);//cksum по мануалам - стандартная.

отслеживаю отправку в tcpdump: ..[bad tcp cksum 0 (->35e5)!]..

ваши соображения из-за чего сумма может неправильно считаться(а то я уж и не знаю на что грешить)? Если надо то могу и другие функции сюда выложить..

anonymous ()
Ответ на: Re: bad tcp cksum от anonymous

Re: bad tcp cksum

Извиняюсь.. так читабельней :) Руки кривые

создаю tcp-ip пакет стандартным образом, заполняю его:

bzero(&(pack->ip), sizeof(struct iphdr));

struct tcp_pseudohdr {

struct in_addr saddr;

struct in_addr daddr;

u_char zero;

u_char protocol;

u_short lenght;

struct tcphdr tcpheader;

} pseudoheader;

pack->ip.ip_v = 4;

pack->ip.ip_hl = sizeof(struct iphdr)/4;

pack->ip.ip_tos = 0; pack->ip.ip_len = htons(TCPIP_SIZE + pack->datalen);

pack->ip.ip_id = htons(getpid()&255);

pack->ip.ip_off |= htons(fragments); /* TO_DO */

pack->ip.ip_off |= htons(fragoff >> 3); /* TO_DO */

pack->ip.ip_ttl = PACK_TTL;

pack->ip.ip_p = 6;

pack->ip.ip_sum = cksum((unsigned short *)&(pack->ip), sizeof(struct iphdr)); /* by the kernel? 20? */

pack->ip.ip_dst = look_up(dhost);

pack->ip.ip_src = look_up(shost); /* checksum */

bzero(&pseudoheader, sizeof(struct tcp_pseudohdr));

pseudoheader.saddr.s_addr = look_up(shost);

pseudoheader.daddr.s_addr = look_up(dhost);

pseudoheader.protocol = 6; /* tcp */

pseudoheader.lenght = htons(sizeof(struct tcphdr));

bcopy((char*)&(pack->tcp), (char*)&(pseudoheader.tcpheader), sizeof(struct tcphdr));

pack->tcp.th_sum = cksum((u_short*)&(pseudoheader), sizeof(struct tcp_pseudohdr) + pack->datalen);//cksum по мануалам - стандартная.

отслеживаю отправку в tcpdump: ..[bad tcp cksum 0 (->35e5)!]..

ваши соображения из-за чего сумма может неправильно считаться(а то я уж и не знаю на что грешить)? Если надо то могу и другие функции сюда выложить..

anonymous (*) (08.02.2006 1:33:38)

anonymous ()
Ответ на: Re: bad tcp cksum от anonymous

Re: bad tcp cksum

В RFC 793 сказано про поле TCP Length в псевдозаголовке
следующее:

The TCP Length is the TCP header length plus
the data length in octets (this is not an
explicitly transmitted quantity, but is computed),
and it does not count the 12 octets of the pseudo
header.

В коде

pseudoheader.lenght = htons(sizeof(struct tcphdr));

Где длина данных ?

P.S. нет такого слова lenght

hyde ()
Ответ на: Re: bad tcp cksum от hyde

Re: bad tcp cksum

правильно Вы поправили, я это читал. Но пока пытаюсь отправить пакет хотя-бы без данных.. поэтому это не изменит ничего. :(

anonymous ()
Ответ на: Re: bad tcp cksum от anonymous

Re: bad tcp cksum

ok. Тогда еще вопрос.
Вот эта сточка:
bad tcp cksum 0 (->35e5)!
tcpdump говорит что извлек из tcp заголовка
контр. сумму = 0x0 в то время как она равна 0x35e5
вероятно дело в cksum ? btw, чему равно pack->datalen ?

hyde ()
Ответ на: Re: bad tcp cksum от hyde

Re: bad tcp cksum

Переписал cksum вот так:

u_short cksum(u_short *buf, int nwords){

unsigned long sum;

u_short *w = buf;

for (sum = 0; nwords > 0; nwords-=2)

sum += *w++;

if(nwords == 1) sum += *(unsigned char*) w;

sum = (sum >> 16) + (sum & 0xffff);

sum += (sum >> 16);

return ~sum;

}

что является копией из руководства. До этого была аналогичная, но моя, видимо где-то ошибся.. Сейчас tcpdump говорит: "[bad tcp cksum 364a (->35e7)!]".

В описании(Шон Ултон "руководство разработчика") к структуре tcphdr последнии строчки:

...

ui8 options[];

ui8 __padding[];

...

Которых у меня нет, но их нет и в файле <neinet/tcp.h> тоесть структура из этого файла этих полей не содержит. Неправильная сумма может быть из-за них?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.