作者:gfree.wind@gmail.com
博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
======================================================================================================
在前一篇文章中,学习了一个hook例子,ipv4_conntrack_defrag。并且看到前面遗留的一个netfilter规则的判断结果NF_STOLEN。
今天就看一下这个NF_STOLEN是什么意思。在前面的博文中,
- /* Gather fragments. */
-
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
-
enum ip_defrag_users user = nf_ct_defrag_user(hooknum, skb);
-
if (nf_ct_ipv4_gather_frags(skb, user))
-
return NF_STOLEN;
-
}
当nf_ct_ipv4_gather_frags返回不为0时,该规则的返回结果为NF_STOLEN。
跟踪nf_ct_ipv4_gather_frags->ip_defrag->ip_frag_queue->ip_frag_reasm。
得到结果,只有当IP分片重组成功时,nf_ct_ipv4_gather_frags才会返回为0。也就是说,当IP分片重组不成功,即IP分片被kernel分片模块缓存时,该函数返回为NF_STOLEN。
而当hook函数返回NF_STOLEN时,根据前面的博文,nf_iterate就会直接返回这个NF_STOLEN。
这样就明确了NF_STOLEN的含义:如字面意思所示,它意味着netfilter“偷”走了这个skb,原调用不应继续处理该skb,而由netfilter负责这个skb的维护。
到此,对netfilter的基本架构应该比较清楚了——我指的是我自己。这几篇文章也主要是学习了,我自己比较感兴趣的地方。如果还有朋友能提出其它有意思的地方,我会继续学习的。
谢谢。
阅读(4765) | 评论(5) | 转发(5) |