Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
dev_queue_xmit関数は、struct device の(*hard_start_xmit)()メンバに登録されたドライバの送信関数(baa_start_ximit関数)を呼び出す。ここから先がドライバの処理である。
ドライバ送信関数(baa_start_xmit関数)は、パケット(sk_buff)のデータをドライバの送信バッファに転送し、パケット(sk_buff)を解放する(dev_kfree_skb関数)。
ドライバが送信処理を行えない場合、ドライバ送信関数(baa_start_ximit関数)では何も行わない。ドライバ送信関数が何も処理を行わなかった場合、パケット(sk_buff)を送信待ち状態にする(struct deviceのqdiscメンバに繋いでおく)。
データ送信が終了すると送信完了割り込みが発生し、割り込みハンドラ(baa_interrupt関数)が呼び出される。割り込みハンドラは、割り込み要因が送信完了割り込みである場合、ネットワーク用BHハンドラ(net_bh関数)の起動を要求する。
遅延して起動されたnet_bh関数は、送信処理(qdisc_run_queues関数)を行う。送信処理(qdisc_run_queues関数)では送信待ちになっているパケット(sk_buff)をドライバに送り込む(baa_start_xmit関数)。送信待ちになっているパケット(sk_buff)を全て処理しきれない場合は、次回の送信完了割り込み時に残りのパケットの再送信の起動を行う。
(イーサコントローラの種類により一度に多くの送信パケットを登録できる ものから、パケット一つだけしか登録できないものまで様々である。)
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:04, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members