[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:受信処理
}}}
= 受信処理 = #SECTION07730000000000000000
最初にプロセス側の受信動作から説明する。
アプリケーションからのデータ受信処理要求は、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要求サイズがパケット内のデータ長より、小さいときはパケット内にデータが残っているが、そのパケットも捨ててしまう。
[[Embed(internal22-images:img94.gif)]]
次に、割り込み受信処理側のパケット受信動作の説明を行う。
受信パケット(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 [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]