Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
最初にプロセス側の受信動作から説明する。
アプリケーションからのデータ受信処理要求は、socketレイヤを経由しinet_recvmsg関数を呼び出す(struct proto_ops inet_dgram_opsインターフェイステーブル経由)ことにより実現される。inet_recvmsg関数は、即udp_recvmsg関数を呼び出す。(struct proto ucp_protインターフェイステーブル経由)。
udp_recvmsg関数は、まずソケットのreceive_queueから一つパケット(sk_buff)を取り出す(skb_recv_datagram関数)。もしパケットが無い場合はskb_recv_datagram関数中で待ちに入る。
パケットを取り出せたらパケット中のデータを、チェックサムの確認をとりつつユーザ空間にコピーする。(csum_partial関数、csum_and_copy_to_user関数、csum_fold関数など)
処理が完了するとUDPパケットを破棄する(skb_free_datagram関数)。ユーザのI/O要求サイズがパケット内のデータ長より、小さいときはパケット内にデータが残っているが、そのパケットも捨ててしまう。
次に、割り込み受信処理側のパケット受信動作の説明を行う。
受信パケット(sk_buff)はudp_rcv関数経由でTCPプロトコルスタックに送られる。udp_rcv関数は、まずヘッダ部分のチェックサムを計算する(udp_check関数、csum_tcpudp_nofold関数)。
次に受信パケットの送信ポート番号(UDPヘッダのdestフィールド)を元に、UDP port番号キャッシュを検索し、そのポートにbindされているソケットをわりだす。(ucp_v4_lookup関数)。
送信対象のソケットが見つかったら、そのソケットへパケットを背信する(udp_deliver関数)。udp_deliver関数は受信パケットをソケットのreceive_queueにリンクし、このソケットでrecv待ちに入っているプロセスの起床を行う(ソケットのdata_readyメソッド呼び出し)。
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:30, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members