NetBSD-current ipfの場合

ip_flowに関する調査の続き。

一方、ipfの場合は以下のような所にhookが有る模様:

dist/ipf/netinet/ip_fil_netbsd.c:               error =
pfil_add_hook((void *)fr_check_wrapper, NULL,
dist/ipf/netinet/ip_fil_netbsd.c-
PFIL_IN|PFIL_OUT, ph_inet);
--
dist/ipf/netinet/ip_fil_netbsd.c:       error = pfil_add_hook((void
*)fr_check, PFIL_IN|PFIL_OUT,
dist/ipf/netinet/ip_fil_netbsd.c-
&inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
--
dist/ipf/netinet/ip_fil_netbsd.c:       pfil_add_hook((void *)fr_check,
PFIL_IN|PFIL_OUT);
dist/ipf/netinet/ip_fil_netbsd.c-# endif
--
dist/ipf/netinet/ip_fil_netbsd.c:               error =
pfil_add_hook((void *)fr_check_wrapper6, NULL,
dist/ipf/netinet/ip_fil_netbsd.c-
PFIL_IN|PFIL_OUT, ph_inet6);
--
dist/ipf/netinet/ip_fil_netbsd.c:       error = pfil_add_hook((void
*)fr_check, PFIL_IN|PFIL_OUT,
dist/ipf/netinet/ip_fil_netbsd.c-
&inetsw[ip_protox[IPPROTO_IPV6]].pr_pfh);
--
dist/ipf/netinet/ip_fil_netbsd.c:               (void)
pfil_add_hook((void *)ipf_pfilsync, NULL,
dist/ipf/netinet/ip_fil_netbsd.c-
PFIL_IFNET, ph_ifsync);

ifdefが多くて分かりにくいが、ether_input()から来る可能性のある関数は
fr_check_wrapper, fr_check, fr_check_wrapper6の3つ。

fr_check_wrapper/fr_check_wrapper6のコードはpfil4_wrapperに似ていて、
以下のような流れになっている:
・mbuf関連の処理
チェックサム関連の処理
・fr_check()を呼ぶ
ここにはmbufのフラグからM_CANFASTFWDを外すコードが無いが、結局fr_check()
の中で同じ事をやっているので、やっぱりfast-forwardされることはない:

#  ifdef M_CANFASTFWD
	/*
	 * XXX For now, IP Filter and fast-forwarding of cached flows
	 * XXX are mutually exclusive.  Eventually, IP Filter should
	 * XXX get a "can-fast-forward" filter rule.
	 */
	m->m_flags &= ~M_CANFASTFWD;
#  endif /* M_CANFASTFWD */