⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nf_conntrack_l3proto_ipv6.c

📁 linux2.6.16版本
💻 C
📖 第 1 页 / 共 2 页
字号:
};static struct nf_hook_ops ipv6_conntrack_local_out_ops = {	.hook		= ipv6_conntrack_local,	.owner		= THIS_MODULE,	.pf		= PF_INET6,	.hooknum	= NF_IP6_LOCAL_OUT,	.priority	= NF_IP6_PRI_CONNTRACK,};static struct nf_hook_ops ipv6_conntrack_defrag_local_out_ops = {	.hook		= ipv6_defrag,	.owner		= THIS_MODULE,	.pf		= PF_INET6,	.hooknum	= NF_IP6_LOCAL_OUT,	.priority	= NF_IP6_PRI_CONNTRACK_DEFRAG,};/* Refragmenter; last chance. */static struct nf_hook_ops ipv6_conntrack_out_ops = {	.hook		= ipv6_confirm,	.owner		= THIS_MODULE,	.pf		= PF_INET6,	.hooknum	= NF_IP6_POST_ROUTING,	.priority	= NF_IP6_PRI_LAST,};static struct nf_hook_ops ipv6_conntrack_local_in_ops = {	.hook		= ipv6_confirm,	.owner		= THIS_MODULE,	.pf		= PF_INET6,	.hooknum	= NF_IP6_LOCAL_IN,	.priority	= NF_IP6_PRI_LAST-1,};#ifdef CONFIG_SYSCTL/* From nf_conntrack_proto_icmpv6.c */extern unsigned int nf_ct_icmpv6_timeout;/* From nf_conntrack_frag6.c */extern unsigned int nf_ct_frag6_timeout;extern unsigned int nf_ct_frag6_low_thresh;extern unsigned int nf_ct_frag6_high_thresh;static struct ctl_table_header *nf_ct_ipv6_sysctl_header;static ctl_table nf_ct_sysctl_table[] = {	{		.ctl_name	= NET_NF_CONNTRACK_ICMPV6_TIMEOUT,		.procname	= "nf_conntrack_icmpv6_timeout",		.data		= &nf_ct_icmpv6_timeout,		.maxlen		= sizeof(unsigned int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,	},	{		.ctl_name	= NET_NF_CONNTRACK_FRAG6_TIMEOUT,		.procname	= "nf_conntrack_frag6_timeout",		.data		= &nf_ct_frag6_timeout,		.maxlen		= sizeof(unsigned int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,	},	{		.ctl_name	= NET_NF_CONNTRACK_FRAG6_LOW_THRESH,		.procname	= "nf_conntrack_frag6_low_thresh",		.data		= &nf_ct_frag6_low_thresh,		.maxlen		= sizeof(unsigned int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= NET_NF_CONNTRACK_FRAG6_HIGH_THRESH,		.procname	= "nf_conntrack_frag6_high_thresh",		.data		= &nf_ct_frag6_high_thresh,		.maxlen		= sizeof(unsigned int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},        { .ctl_name = 0 }};static ctl_table nf_ct_netfilter_table[] = {	{		.ctl_name	= NET_NETFILTER,		.procname	= "netfilter",		.mode		= 0555,		.child		= nf_ct_sysctl_table,	},	{ .ctl_name = 0 }};static ctl_table nf_ct_net_table[] = {	{		.ctl_name	= CTL_NET,		.procname	= "net",		.mode		= 0555,		.child		= nf_ct_netfilter_table,	},	{ .ctl_name = 0 }};#endif#if defined(CONFIG_NF_CT_NETLINK) || \    defined(CONFIG_NF_CT_NETLINK_MODULE)#include <linux/netfilter/nfnetlink.h>#include <linux/netfilter/nfnetlink_conntrack.h>static int ipv6_tuple_to_nfattr(struct sk_buff *skb,				const struct nf_conntrack_tuple *tuple){	NFA_PUT(skb, CTA_IP_V6_SRC, sizeof(u_int32_t) * 4,		&tuple->src.u3.ip6);	NFA_PUT(skb, CTA_IP_V6_DST, sizeof(u_int32_t) * 4,		&tuple->dst.u3.ip6);	return 0;nfattr_failure:	return -1;}static const size_t cta_min_ip[CTA_IP_MAX] = {	[CTA_IP_V6_SRC-1]       = sizeof(u_int32_t)*4,	[CTA_IP_V6_DST-1]       = sizeof(u_int32_t)*4,};static int ipv6_nfattr_to_tuple(struct nfattr *tb[],				struct nf_conntrack_tuple *t){	if (!tb[CTA_IP_V6_SRC-1] || !tb[CTA_IP_V6_DST-1])		return -EINVAL;	if (nfattr_bad_size(tb, CTA_IP_MAX, cta_min_ip))		return -EINVAL;	memcpy(&t->src.u3.ip6, NFA_DATA(tb[CTA_IP_V6_SRC-1]), 	       sizeof(u_int32_t) * 4);	memcpy(&t->dst.u3.ip6, NFA_DATA(tb[CTA_IP_V6_DST-1]),	       sizeof(u_int32_t) * 4);	return 0;}#endifstruct nf_conntrack_l3proto nf_conntrack_l3proto_ipv6 = {	.l3proto		= PF_INET6,	.name			= "ipv6",	.pkt_to_tuple		= ipv6_pkt_to_tuple,	.invert_tuple		= ipv6_invert_tuple,	.print_tuple		= ipv6_print_tuple,	.print_conntrack	= ipv6_print_conntrack,	.prepare		= ipv6_prepare,#if defined(CONFIG_NF_CT_NETLINK) || \    defined(CONFIG_NF_CT_NETLINK_MODULE)	.tuple_to_nfattr	= ipv6_tuple_to_nfattr,	.nfattr_to_tuple	= ipv6_nfattr_to_tuple,#endif	.get_features		= ipv6_get_features,	.me			= THIS_MODULE,};extern struct nf_conntrack_protocol nf_conntrack_protocol_tcp6;extern struct nf_conntrack_protocol nf_conntrack_protocol_udp6;extern struct nf_conntrack_protocol nf_conntrack_protocol_icmpv6;extern int nf_ct_frag6_init(void);extern void nf_ct_frag6_cleanup(void);static int init_or_cleanup(int init){	int ret = 0;	if (!init) goto cleanup;	ret = nf_ct_frag6_init();	if (ret < 0) {		printk("nf_conntrack_ipv6: can't initialize frag6.\n");		goto cleanup_nothing;	}	ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_tcp6);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register tcp.\n");		goto cleanup_frag6;	}	ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_udp6);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register udp.\n");		goto cleanup_tcp;	}	ret = nf_conntrack_protocol_register(&nf_conntrack_protocol_icmpv6);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register icmpv6.\n");		goto cleanup_udp;	}	ret = nf_conntrack_l3proto_register(&nf_conntrack_l3proto_ipv6);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register ipv6\n");		goto cleanup_icmpv6;	}	ret = nf_register_hook(&ipv6_conntrack_defrag_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register pre-routing defrag "		       "hook.\n");		goto cleanup_ipv6;	}	ret = nf_register_hook(&ipv6_conntrack_defrag_local_out_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register local_out defrag "		       "hook.\n");		goto cleanup_defragops;	}	ret = nf_register_hook(&ipv6_conntrack_in_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register pre-routing hook.\n");		goto cleanup_defraglocalops;	}	ret = nf_register_hook(&ipv6_conntrack_local_out_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register local out hook.\n");		goto cleanup_inops;	}	ret = nf_register_hook(&ipv6_conntrack_out_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register post-routing hook.\n");		goto cleanup_inandlocalops;	}	ret = nf_register_hook(&ipv6_conntrack_local_in_ops);	if (ret < 0) {		printk("nf_conntrack_ipv6: can't register local in hook.\n");		goto cleanup_inoutandlocalops;	}#ifdef CONFIG_SYSCTL	nf_ct_ipv6_sysctl_header = register_sysctl_table(nf_ct_net_table, 0);	if (nf_ct_ipv6_sysctl_header == NULL) {		printk("nf_conntrack: can't register to sysctl.\n");		ret = -ENOMEM;		goto cleanup_localinops;	}#endif	return ret; cleanup:	synchronize_net();#ifdef CONFIG_SYSCTL 	unregister_sysctl_table(nf_ct_ipv6_sysctl_header); cleanup_localinops:#endif	nf_unregister_hook(&ipv6_conntrack_local_in_ops); cleanup_inoutandlocalops:	nf_unregister_hook(&ipv6_conntrack_out_ops); cleanup_inandlocalops:	nf_unregister_hook(&ipv6_conntrack_local_out_ops); cleanup_inops:	nf_unregister_hook(&ipv6_conntrack_in_ops); cleanup_defraglocalops:	nf_unregister_hook(&ipv6_conntrack_defrag_local_out_ops); cleanup_defragops:	nf_unregister_hook(&ipv6_conntrack_defrag_ops); cleanup_ipv6:	nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv6); cleanup_icmpv6:	nf_conntrack_protocol_unregister(&nf_conntrack_protocol_icmpv6); cleanup_udp:	nf_conntrack_protocol_unregister(&nf_conntrack_protocol_udp6); cleanup_tcp:	nf_conntrack_protocol_unregister(&nf_conntrack_protocol_tcp6); cleanup_frag6:	nf_ct_frag6_cleanup(); cleanup_nothing:	return ret;}MODULE_LICENSE("GPL");MODULE_AUTHOR("Yasuyuki KOZAKAI @USAGI <yasuyuki.kozakai@toshiba.co.jp>");static int __init init(void){	need_conntrack();	return init_or_cleanup(1);}static void __exit fini(void){	init_or_cleanup(0);}module_init(init);module_exit(fini);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -