因为手的感觉分担了一部分本该属于头的感觉,找个东西代替手就会好些。
__u32 secure_tcp_syn_cookie(__u32 saddr, __u32 daddr, __u16 sport,
        __u16 dport, __u32 sseq, __u32 count, __u32 data)
{
    __u32     tmp[16 + HASH_BUFFER_SIZE + HASH_EXTRA_SIZE];
    __u32    seq;
...//懒惰初始化
    memcpy(tmp+3, syncookie_secret[0], sizeof(syncookie_secret[0]));
    tmp[0]=saddr;
    tmp[1]=daddr;
    tmp[2]=(sport << 16) + dport;
    HASH_TRANSFORM(tmp+16, tmp);
    seq = tmp[17] + sseq + (count << COOKIEBITS);  //根据4元素计算出的摘要值加上syn序列号再在高8位加上当前jiffies,seq设为S,sseq设为SS
    memcpy(tmp+3, syncookie_secret[1], sizeof(syncookie_secret[1]));
    tmp[0]=saddr;
    tmp[1]=daddr;
    tmp[2]=(sport << 16) + dport;
    tmp[3] = count;   
    HASH_TRANSFORM(tmp+16, tmp);  //又算出一个tmp[17]
    return seq + ((tmp[17] + data) & COOKIEMASK); //不影响高八位的情况下计算出最终的syn-cookie,设为K
}
__u32 check_tcp_syn_cookie(__u32 cookie, __u32 saddr, __u32 daddr, __u16 sport,
        __u16 dport, __u32 sseq, __u32 count, __u32 maxdiff)
{
    __u32     tmp[16 + HASH_BUFFER_SIZE + HASH_EXTRA_SIZE];
    __u32    diff;
...//和懒惰初始化相左
    memcpy(tmp+3, syncookie_secret[0], sizeof(syncookie_secret[0]));
    tmp[0]=saddr;
    tmp[1]=daddr;
    tmp[2]=(sport << 16) + dport;
    HASH_TRANSFORM(tmp+16, tmp);
    cookie -= tmp[17] + sseq;  //cookie即是K,减掉了SS和4元素计算出的摘要
    diff = (count - (cookie >> COOKIEBITS)) & ((__u32)-1 >> COOKIEBITS);
    if (diff >= maxdiff)  //从高8位得到syn包到达的时间,如果时间太久了ack才到,那么就视为非正常现象,丢弃
        return (__u32)-1;
    memcpy(tmp+3, syncookie_secret[1], sizeof(syncookie_secret[1]));
    tmp[0] = saddr;
    tmp[1] = daddr;
    tmp[2] = (sport << 16) + dport;
    tmp[3] = count - diff;    得到原始syn包的jiffies
    HASH_TRANSFORM(tmp+16, tmp);
    return (cookie - tmp[17]) & COOKIEMASK;    //最终得到data
}