1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | struct ipt_match { struct list_head list; /* 通常初始化成{NULL,NULL},由核心使用 */ const char name[IPT_FUNCTION_MAXNAMELEN]; /* Match的名字,同时也要求包含该Match的模块文件名为ipt_'name'.o */ int (*match)(const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, const void *matchinfo, int offset, const void *hdr, u_int16_t datalen, int *hotdrop); /* 返回非0表示匹配成功,如果返回0且hotdrop设为1, 则表示该报文应当立刻丢弃 */ int (*checkentry)(const char *tablename, const struct ipt_ip *ip, void *matchinfo, unsigned int matchinfosize, unsigned int hook_mask); /* 在使用本Match的规则注入表中之前调用,进行有效性检查, /* 如果返回0,规则就不会加入iptables中 */ void (*destroy)(void *matchinfo, unsigned int matchinfosize); /* 在包含本Match的规则从表中删除时调用, 与checkentry配合可用于动态内存分配和释放 */ struct module *me; /* 表示当前Match是否为模块(NULL为否) */ }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | struct iptables_match { struct iptables_match *next; /* Match链,初始为NULL */ ipt_chainlabel name; /* Match名,和核心模块加载类似,作为动态链接库存在的 Iptables Extension的命名规则为libipt_'name'.so(对于ipv6为libip6t_'name'.so), 以便于iptables主程序根据Match名加载相应的动态链接库 */ const char *version; /* 版本信息,一般设为NETFILTER_VERSION */ size_t size; /* Match数据的大小,必须用IPT_ALIGN()宏指定对界 */ size_t userspacesize; /*由于内核可能修改某些域,因此size可能与确切的用户数据不同, 这时就应该把不会被改变的数据放在数据区的前面部分, 而这里就应该填写被改变的数据区大小;一般来说,这个值和size相同 */ void (*help)(void); /* 当iptables要求显示当前match的信息时(比如iptables -m ip_ext -h), 就会调用这个函数,输出在iptables程序的通用信息之后 */ void (*init)(struct ipt_entry_match *m, unsigned int *nfcache); /* 初始化,在parse之前调用 */ int (*parse)(int c, char **argv, int invert, unsigned int *flags, const struct ipt_entry *entry, unsigned int *nfcache, struct ipt_entry_match **match); /* 扫描并接收本match的命令行参数,正确接收时返回非0,flags用于保存状态信息 */ void (*final_check)(unsigned int flags); /* 当命令行参数全部处理完毕以后调用,如果不正确,应该退出(exit_error()) */ void (*print)(const struct ipt_ip *ip, const struct ipt_entry_match *match, int numeric); /* 当查询当前表中的规则时,显示使用了当前match的规则的额外的信息 */ void (*save)(const struct ipt_ip *ip, const struct ipt_entry_match *match); /* 按照parse允许的格式将本match的命令行参数输出到标准输出, 用于iptables-save命令 */ const struct option *extra_opts; /* NULL结尾的参数列表,struct option与getopt(3)使用的结构相同 */ /* 以下参数由iptables内部使用,用户不用关心 */ unsigned int option_offset; struct ipt_entry_match *m; unsigned int mflags; unsigned int used; } struct option { const char *name; /* 参数名称,用于匹配命令行输入 */ int has_arg; /* 本参数项是否允许带参数,0表示没有,1表示有,2表示可有可无 */ int *flag; /* 指定返回的参数值内容,如果为NULL,则直接返回下面的val值, 否则返回0,val存于flag所指向的位置 */ int val; /* 缺省的参数值 */ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct ipt_target { …… unsigned int (*target)(struct sk_buff **pskb, unsigned int hooknum, const struct net_device *in, const struct net_device *out, const void *targinfo, void *userdata); /* 如果需要继续处理则返回IPT_CONTINUE(-1), 否则返回NF_ACCEPT、NF_DROP等值, 它的调用者根据它的返回值来判断如何处理它处理过的报文*/ …… } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |