NetBSD-current ip_flowの仕組み

1度目のパケット

ether_input()からipflow_fastforward()が実行されるが、一度も学習されていないフローはどこに送れば良いのか分からない為、

	if ((ipf = ipflow_lookup(ip)) == NULL)
		return 0;

でreturn 0でether_input()に戻り、schednetisr(NETISR_IP)が呼ばれる。

softint経由でipintr()が呼ばれ、キューに積まれたmbufが順にip_input()に渡されていく。
ip_input()でヘッダの解析を行いpfil_run_hooks()を呼び出した後、フォワード対象のパケットはip_forward()へ渡される。
ip_forward()では送り先のルートを調べてip_output()へmbufを渡し、最後にipflow_create()へ送り先ルートとmbufを渡す。
ipflow_create()では宛先IPアドレスをハッシュキーとしてハッシュテーブルに送り先ルートを記録する。

これでフローが学習出来た。

2度目以降のパケット

ether_input()からipflow_fastforward()が実行され、

	if ((ipf = ipflow_lookup(ip)) == NULL)
		return 0;

で先ほど学習した送り先ルートを取り出しrt->rt_ifp->if_output()※へルートとmbufを渡す。
※恐らくether_output()などの事