日期:2014-05-16 浏览次数:20830 次
enum nf_ct_ext_id { NF_CT_EXT_HELPER, NF_CT_EXT_NAT, NF_CT_EXT_ACCT, NF_CT_EXT_ECACHE, NF_CT_EXT_NUM, };
第二:
Linux为何把extend写的那么死呢?当我突然感到这是合理的时候,我就三缄其口了,后面我会说到,数据结构需要可以自解释,即自己解释自己。虽然人可以看到一个结构体马上说出它的含义,但是程序却很难将一堆数据对应到一个结构体!自解释,如果不知道自解释,那就说明你根本就TM就不懂计算机!虽然你可能很精通编程...
struct nf_conn_counter { u_int64_t packets; u_int64_t bytes; };我希望它成为下面的样子:
struct nf_conn_counter { u_int64_t packets; u_int64_t bytes; unsigned char *info; };但是我又不能改变结构体的定义,所以我采用下面等价的办法:
struct conn_info_extends_nf_conn_counter { struct nf_conn_counter base; char *info; }info是最关键的。我需要做的仅仅就是在为nf_conn_counter分配空间的时候为其多加一个指针的空间即可,至于这个指针指向什么,自有调用者解释。在我的需求中,它可能就是一个字符串,存在info信息。acct_extend原始定义为(之所以选择对acct开刀,是因为它足够简单,在字面上里面,其表示统计信息,加入一个info也无可厚非):
static struct nf_ct_ext_type acct_extend __read_mostly = { .len = sizeof(struct nf_conn_counter[IP_CT_DIR_MAX]), .align = __alignof__(struct nf_conn_counter[IP_CT_DIR_MAX]), .id = NF_CT_EXT_ACCT, };
struct info_compat { struct nf_conn_counter nc[IP_CT_DIR_MAX]; unsigned char * info; }; static struct nf_ct_ext_type acct_extend __read_mostly = { .len = sizeof(struct info_compat), .align = __alignof__(struct info_compat), .id = NF_CT_EXT_ACCT, };
#include <linux/ip.h> #include <linux/module.h> #include <linux/skbuff.h> #include <linux/version.h> #include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack_acct.h> MODULE_AUTHOR("xtt"); MODULE_DESCRIPTION("gll"); MODULE_LICENSE("GPL"); MODULE_ALIAS("XTT and GLL"); st