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;