このサイトから: http://www.enderunix.org/docs/en/rawipspoof/
次の関数をプルしました
unsigned short in_cksum(unsigned short *addr, int len)
{
    int nleft = len;
    int sum = 0;
    unsigned short *w = addr;
    unsigned short answer = 0;
    while (nleft > 1) {
        sum += *w++;
        nleft -= 2;
    }
    if (nleft == 1) {
        *(unsigned char *) (&answer) = *(unsigned char *) w;
        sum += answer;
    }
    sum = (sum >> 16) + (sum & 0xFFFF);
    sum += (sum >> 16);
    answer = ~sum;
    return (answer);
}
unsigned short in_cksum_tcp(int src, int dst, unsigned short *addr, int len)
{
    struct psd_tcp buf;
    u_short ans;
    memset(&buf, 0, sizeof(buf));
    buf.src.s_addr = src;
    buf.dst.s_addr = dst;
    buf.pad = 0;
    buf.proto = IPPROTO_TCP;
    buf.tcp_len = htons(len);
    memcpy(&(buf.tcp), addr, len);
    ans = in_cksum((unsigned short *)&buf, 12 + len);
    return (ans);
}
ただし、受信 TCP パケットに対してこれを実行すると、現在と同じチェックサム結果が得られません (チェックサム関数を実行する前に、受信 TCP チェックサムを保存し、パケットのチェックサムをゼロに設定します)。 )
ここで、IP ヘッダーに対して「in_cksum」を実行すると、正しい答えが得られます。
そのサイトの TCP 疑似ヘッダーは次のとおりです。
struct psd_tcp {
    struct in_addr src;
    struct in_addr dst;
    unsigned char pad;
    unsigned char proto;
    unsigned short tcp_len;
    struct tcphdr tcp;
};
これを機能させるために何かが欠けていますか?