2007年8月8日水曜日

TCP の checksum

なさけないはなしー
 /* This routine computes an IPv4 TCP checksum. */
を見付けるまでに 1時間以上。イカンですな。未だ netcat の -g 使った lsrr を動作できたりできなかったり。tcpdump の出力信じるならば checksum がおかしい。ということで追ってみたところ net/ipv4/tcp_ipv4.c::tcp_v4_send_check() にて上記コメント発見。SYN_SENT で ack を受け取った場合を追ってみると
tcp_v4_do_rcv()
>> tcp_rcv_state_process()
>>>> tcp_rcv_synsent_state_process()
>>>>>> tcp_send_ack()
>>>>>>>> tcp_transmit_skb() この中で
inet_connection_sock_af_ops ipv4_specific->send_check() が...
tcp_v4_send_check() では CHECKSUM_PARTIAL で処理分け。lwn を見ると
That value has been replaced with CHECKSUM_PARTIAL (intended for outgoing packets where the job must be completed by the hardware) and CHECKSUM_COMPLETE (for incoming packets which have been completely checksummed by the hardware).
仰しゃる通り関数名からも、送信側の話。送受信双方共にethtook -K で変更できるらしい。TCP もドライバも何でも...深いから、まだまだ時間かかるだろうなぁ。

0 件のコメント: