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()などの事