受信処理

最初にプロセス側の受信動作から説明する。

アプリケーションからのデータ受信処理要求は、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関数中で待ちに入る(wait_for_packet関数)。

パケットを取り出せたらパケット中のデータを、チェックサムの確認をとりつつユーザ空間にコピーする。(udp_checksum_complete関数、skb_copy_datagram_iovec関数、copy_and_csum_toiovec関数など)

処理が完了するとUDPパケットを破棄する(skb_free_datagram関数)。ユーザのI/O要求サイズがパケット内のデータ長より、小さいときはパケット内にデータが残っているが、そのパケットも捨ててしまう。

img98.gif

次に、割り込み受信処理側のパケット受信動作の説明を行う。

受信パケット(sk_buff)はudp_rcv関数経由でUDPプロトコルスタックに送られる。udp_rcv関数は、まずヘッダ部分のチェックサムを計算する(udp_checksum_init関数)。

次に受信パケットの送信ポート番号(UDPヘッダのdestフィールド)を元に、UDP port番号キャッシュを検索し、そのポートにbindされているソケットをわりだす。(ucp_v4_lookup関数)。

送信対象のソケットが見つかったら、そのソケットへパケットを背信する(udp_queue_rcv_skb関数)。udp_queue_rcv_skb関数は受信パケットをソケットのreceive_queueにリンクし、このソケットでrecv待ちに入っているプロセスの起床を行う(ソケットのdata_readyメソッド呼び出し)。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1