Linux Kernel(2.6)の実装に関するメモ書き

IPv4 受信処理


Rev.3を表示中。最新版はこちら

1. 概要

IPv4の受信処理と中継処理のメモ。

2. 処理の流れ

IPパケットを受信した時の処理の流れを図1に示す。


図1 受信時の流れ

3. 受信処理

3.1 受信開始

受信したIPv4パケットはip_rcv()に渡される。ip_rcv()ではIPヘッダの内容をチェックした後、NF_IP_PRE_ROUTINGフック処理を行った後、ip_rcv_finish()を呼び出す。

ip_rcv_finish()では、IPパケットのDstIPでルーティングテーブルを検索を行なう。ルーティングテーブルにエントリがあった場合は、最後にdst_input()を呼ぶ。 dst_input()はヒットしたルーティングエントリに登録されている受信ハンドラを呼び出して、自システム宛の受信か中継処理を行なう。自システム 宛の経路にはip_local_deliver()、その他の経路にはip_forward()が設定されている。

ip_rcv_finish()の処理概要

if (likely(skb->dst == NULL)) {
/* ルーティングテーブルを検索 */
    int err = ip_route_input()
    if (unlikely(err)) {
/* 経路がないなどの理由でエラーが返った場合は廃棄 */
        goto drop;
    }
}

/* IPヘッダにオプションがあれば処理をする
 * ここではSourceRoutingオプションを処理する
 */
if (iph->ihl > 5 && ip_rcv_options(skb))
    goto drop;

/* ヒットしたルーティングエントリに対応するハンドラへ 
 * 自システム宛ならip_local_deliver()
 * 中継ならip_forward()
 */
return dst_input(skb);

drop:
    kfree_skb(skb);
    return NET_RX_DROP;



最終更新 2007/04/20 15:30:49 - kztomita
(2007/04/20 14:28:57 作成)
添付ファイル
ip_rcv.png - kztomita


リンク
最近更新したページ
検索