- 论坛徽章:
- 0
|
本帖最后由 pywj777 于 2012-05-30 13:06 编辑
之前总是拜读“独孤九贱”兄的大作,受益匪浅。现也将自己的一些总结分享给大家,由于语言组织能力较差,所以多上图,少上字。
Xtables提供的资源
struct xt_af xt[]结构数组
该数组用于挂载各个协议的match和target资源。由于写者(添加、删除)和读者(查找)都是在内核空间进程上下文执行,所以它们只需要用xt[n].mutex信号量进行互斥。读者(查找)在将规则关联上一个match或target时会增加它们所在模块的引用计数,在它释放这个引用计数之前该模块是不会被卸载的,所以另外一个读者(规则匹配)在软中断中可以放心的使用,不需加任何锁。
- xt_register_match(struct xt_match *match)与xt_unregister_match(struct xt_match *match)
用于在xt[]数组上挂载对应协议的match,由于它们都是在内核空间的进程上下文被使用,所以它们使用mutex_lock(&xt[af].mutex)信号量进行加锁和解锁。(写者) - xt_register_target(struct xt_target *target)与xt_unregister_target(struct xt_target *target)
用于在xt[]数组上挂载对应协议的target,由于它们都是在内核空间的进程上下文被使用,所以它们使用mutex_lock(&xt[af].mutex)信号量进行加锁和解锁。(写者) - struct xt_match *xt_find_match(u8 af, const char *name, u8 revision)与struct xt_target *xt_find_target(u8 af, const char *name, u8 revision)
用于在xt[]数组中查找对应协议的match或target与对应规则相关联,并增加match和target所在模块的引用计数。由于它们都是在内核空间的进程上下文被使用,所以它们使用mutex_lock(&xt[af].mutex)信号量进行加锁和解锁。同时内核在软中断中进行规则匹时配,它引用规则关联的match和target是安全的,因为match和target所在模块由于引用计数是不会被释放的。(读者) - 由于有一个读者是在软中断的中,并且有多个CPU同时使用,是否需要其它保护。答:不需要。因为如果软中断中引用的规则使用了某个match或target,则拥有该match和target模块的引用计数会被加1,该模块将不会被卸载(这也就要求在调用xt_unregister_match()或xt_unregister_target()时必须先判断它们所在模块的引用计数,通常它们被放在模块注销函数中)。如果引用计数为0,则说明没有规则引用该match或target,则在软中断中也不会使用它。
net.xt.tables[]网络命名空间协议链表
该命名空间协议链表用于将不同协议的table表挂到对应协议链表中。
写者(添加、删除)table表都在内核空间进程上下文执行,又由于它需要检查该表与注册的target、match名字不冲突,所以他们只需要用xt[n].mutex信号。
读者在软中断中通过HOOK引用这些表,所以在写者(添加、删除)之前一定要保证没有读者在操作。添加表操作一定要先通过xt_register_table()添加一个表,然后再通过xt_hook_link()使HOOK能够引用这些表;删除表操作一定要先通过xt_hook_unlink()去掉HOOK对表的引用,然后再通过xt_unregister_table()删除一个表。
- struct xt_table *xt_register_table(struct net *net, const struct xt_table *input_table, struct xt_table_info *bootstrap, struct xt_table_info *newinfo)
主要是复制input_table到table表,并将newinfo(由调用该函数模块提供的私有数据xt_table_info)与该表的table->private指针相关联,然后根据该表指定的协议挂入对应的net.xt.table[table->af]链表中。它使用xt[n].mutex信号进行加锁(如上所述)。 - void *xt_unregister_table(struct xt_table *table)
主要是将table从net.xt.table[table->af]链表中取下来,并返回table->private指针指向的xt_table_info数据。它使用xt[n].mutex信号进行加锁(如上所述)。 - struct nf_hook_ops *xt_hook_link(const struct xt_table *table, nf_hookfn *fn)与void xt_hook_unlink(const struct xt_table *table, struct nf_hook_ops *ops)
主要是利用xt_table结构和钩子函数构造出nf_hook_ops钩子项,然后调用nf_register_hooks()或nf_unregisgter_hooks()函数来注册或注销ipv4协议对应点的钩子函数,这两个函数主要用在内核空间的进程上下文。由于nf_regisgter_hooks()已提供了保护,所以它们不需要任何形式的锁保护。
|
评分
-
查看全部评分
|