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 */