📄 nf_conntrack_l3proto_ipv6.c
字号:
};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 + -