Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
dev_queue_xmit関数は、まず送信対象のパケットを送信するネットワークインターフェイス(net_device構造体)のqdiscメンバに繋ぎ、出力の起動をかける(qdisc_run関数)。qdisc_run関数は、ドライバのバッファがフル(netif_queue_stopped関数)になるまで、ドライバの送信関数(baa_start_ximit関数)を呼び出す。(net_device構造体の(*hard_start_xmit)()メンバに登録されている)ここから先がドライバの処理である。
ドライバ送信関数(baa_start_xmit関数)は、パケット(sk_buff)のデータをドライバの送信バッファに転送し、パケット(sk_buff)を解放する(dev_kfree_skb関数)。(もしくは、パケットそのものを送信バッファとして登録する。)
ドライバの送信能力以上に送信要求があった場合、パケット(sk_buff)は、qdiscメンバにリンクされ送信待ち状態で保留されることになる。
データ送信が終了すると送信完了割り込みが発生し、割り込みハンドラ(baa_interrupt関数)が呼び出される。割り込みハンドラは、割り込み要因が送信完了割り込みである場合、送信処理の再開を要求(netif_wake_queue()関数)する。(送信パケットをまだ解放していない場合、処理済の送信パケットを softnet_data[]のcompetion_queueにリンク(dev_kfree_skb_irq関数)する)
これによりネットワーク用ソフト割り込みハンドラ(net_tx_action関数)が遅延して起動される。net_tx_action関数は、まず、softnet_data[]のcompetion_queueにリンクされているパケットの解放(dev_kfree_skb関数)を行う。次にnet_tx_action関数は、送信処理(qdisc_run関数)を行う。送信処理(qdisc_run関数)では送信待ちになっているパケット(sk_buff)をドライバに送り込む(baa_start_xmit関数)。送信待ちになっているパケット(sk_buff)を全て処理しきれない場合は、更に次回の送信完了割り込み時のパケット再送信処理に委ねる。
(イーサコントローラの種類により一度に多くの送信パケットを登録できる ものから、パケット一つだけしか登録できないものまで様々である。)
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:17:51, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members