создаю 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)!]..
ваши соображения из-за чего сумма может неправильно считаться(а то я уж и не знаю на что грешить)? Если надо то могу и другие функции сюда выложить..
И еще вопрос если сумма не правильная то удаленная система игнорирует пакет?