netfilter 에서 okfn이 정확히 무슨 기능을 하나요?

지나가는새의 이미지

typedef unsigned int nf_hookfn(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *));

여기서 okfn의 기능을 모르겠습니다. 어떻게 사용되어 지는 함수죠?

salbang2의 이미지

해당 훅 지점을 통과 했을때 다음으로 불리워질 function 입니다...

syjeon의 이미지

아래에서처럼 HOOKing이 define되어 있는 상태라면 HOOK루틴을 따라가고
난 후 불려지며 define되어 있지 않은 경우엔 HOOK function이 불려지지 않
고 바로 okfn이 불려지는 흐름으로 알고 있습니다.

이는 ip_input.c등의 파일에서 HOOKing지점마다 NF_HOOK macro로
구현되어 있는 것 같은데 확인해 보시길...(질문의 의도에 맞는지요....)

#ifdef CONFIG_NETFILTER_DEBUG

#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN)
#define NF_HOOK_THRESH nf_hook_slow
#else
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
(list_empty(&nf_hooks[(pf)][(hook)]) \
? (okfn)(skb) \
: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN))
#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh) \
(list_empty(&nf_hooks[(pf)][(hook)]) \
? (okfn)(skb) \
: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), (thresh)))
#endif

------------------Signature
바늘속에서 사막찾기 0.o