各種操作関数群

関数説明に先立ち、まずネットワークインターフェイスドライバの状態に関して説明しておく。各ドライバはnet_device構造体中に以下の状態を保持している。各状態は直行しており同時に複数状態を持つことも可能である。

状態 説明
LINK_STATE_XOFF 出力停止中
LINK_STATE_START 起動(up)されている
LINK_STATE_PRESENT デバイスが存在している。PCMCIA等の ホットプラグ可能なデバイスで利用
LINK_STATE_SCHED 出力処理中
  • netif_schedule()関数
    • 出力先となるnet_deviceの状態に出力中(LINK_STATE_SCHED) にする。
    • 上記net_deviceをsoftnet_data[]のoutput_queueにリンクする。 SMP環境ではsoftnet_data[]はCPUの個数分用意される。
    • 自CPU上でパケット受信処理(net_tx_action関数)が動作するように ソフト割り込み要求(cpu_raise_softirq(NET_TX_SOFTIRQ)関数) を行う。
  • netif_stop_queue()関数
    • 出力を停止する(net_deviceの状態にLINK_STATE_XOFFビットを 立てる)にする)。 ネットワークインターフェイスがdownしたときだけでなく、 ドライバの送信バッファがフルになったときのフロー制御にも利用される。
  • netif_start_queue()関数
    • 出力可能とする(net_deviceの状態のLINK_STATE_XOFFビットを落す)。 ネットワークインターフェイスがupしたときに呼び出される。
  • netif_wake_queue()関数
    • 出力を再開する。net_deviceの状態からLINK_STATE_XOFF ビットを落し、netif_schedule()関数を呼び出す。
  • netif_queue_stopped()関数
    • 出力停止中であるか(net_deviceの状態にLINK_STATE_XOFFビットが 立っているか?)確認する。
  • netif_running()関数
    • ネットワークインターフェイスがupしているか否か (net_deviceの状態にLINK_STATE_STARTビットが立っているか?) 確認する。
  • dev_kfree_skb_irq()関数
    • パケット(sk_buff)をsoftnet_data[]のcopletion_queueにリンクする。 この時点ではパケットを解放せず、本当の解放処理は 送信処理ハンドラ(net_tx_action関数)に任せる。
  • dev_kfree_skb_any()関数
    • 割り込みハンドラから呼び出された時は、dev_kfree_skb_irq関数を 呼び出し、プロセスのコンテキストから呼び出されたときは即解放 (dev_kfree_skb関数)する。

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