📄 ip_conntrack_standalone.c
字号:
static struct nf_hook_ops ip_conntrack_local_out_ops = { .hook = ip_conntrack_local, .owner = THIS_MODULE, .pf = PF_INET, .hooknum = NF_IP_LOCAL_OUT, .priority = NF_IP_PRI_CONNTRACK,};/* helpers */static struct nf_hook_ops ip_conntrack_helper_out_ops = { .hook = ip_conntrack_help, .owner = THIS_MODULE, .pf = PF_INET, .hooknum = NF_IP_POST_ROUTING, .priority = NF_IP_PRI_CONNTRACK_HELPER,};static struct nf_hook_ops ip_conntrack_helper_in_ops = { .hook = ip_conntrack_help, .owner = THIS_MODULE, .pf = PF_INET, .hooknum = NF_IP_LOCAL_IN, .priority = NF_IP_PRI_CONNTRACK_HELPER,};/* Refragmenter; last chance. */static struct nf_hook_ops ip_conntrack_out_ops = { .hook = ip_refrag, .owner = THIS_MODULE, .pf = PF_INET, .hooknum = NF_IP_POST_ROUTING, .priority = NF_IP_PRI_CONNTRACK_CONFIRM,};static struct nf_hook_ops ip_conntrack_local_in_ops = { .hook = ip_confirm, .owner = THIS_MODULE, .pf = PF_INET, .hooknum = NF_IP_LOCAL_IN, .priority = NF_IP_PRI_CONNTRACK_CONFIRM,};/* Sysctl support */#ifdef CONFIG_SYSCTL/* From ip_conntrack_core.c */extern int ip_conntrack_max;extern unsigned int ip_conntrack_htable_size;/* From ip_conntrack_proto_tcp.c */extern unsigned long ip_ct_tcp_timeout_syn_sent;extern unsigned long ip_ct_tcp_timeout_syn_recv;extern unsigned long ip_ct_tcp_timeout_established;extern unsigned long ip_ct_tcp_timeout_fin_wait;extern unsigned long ip_ct_tcp_timeout_close_wait;extern unsigned long ip_ct_tcp_timeout_last_ack;extern unsigned long ip_ct_tcp_timeout_time_wait;extern unsigned long ip_ct_tcp_timeout_close;extern unsigned long ip_ct_tcp_timeout_max_retrans;extern int ip_ct_tcp_loose;extern int ip_ct_tcp_be_liberal;extern int ip_ct_tcp_max_retrans;/* From ip_conntrack_proto_udp.c */extern unsigned long ip_ct_udp_timeout;extern unsigned long ip_ct_udp_timeout_stream;/* From ip_conntrack_proto_icmp.c */extern unsigned long ip_ct_icmp_timeout;/* From ip_conntrack_proto_icmp.c */extern unsigned long ip_ct_generic_timeout;/* Log invalid packets of a given protocol */static int log_invalid_proto_min = 0;static int log_invalid_proto_max = 255;static struct ctl_table_header *ip_ct_sysctl_header;static ctl_table ip_ct_sysctl_table[] = { { .ctl_name = NET_IPV4_NF_CONNTRACK_MAX, .procname = "ip_conntrack_max", .data = &ip_conntrack_max, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_COUNT, .procname = "ip_conntrack_count", .data = &ip_conntrack_count, .maxlen = sizeof(int), .mode = 0444, .proc_handler = &proc_dointvec, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_BUCKETS, .procname = "ip_conntrack_buckets", .data = &ip_conntrack_htable_size, .maxlen = sizeof(unsigned int), .mode = 0444, .proc_handler = &proc_dointvec, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT, .procname = "ip_conntrack_tcp_timeout_syn_sent", .data = &ip_ct_tcp_timeout_syn_sent, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV, .procname = "ip_conntrack_tcp_timeout_syn_recv", .data = &ip_ct_tcp_timeout_syn_recv, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED, .procname = "ip_conntrack_tcp_timeout_established", .data = &ip_ct_tcp_timeout_established, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT, .procname = "ip_conntrack_tcp_timeout_fin_wait", .data = &ip_ct_tcp_timeout_fin_wait, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT, .procname = "ip_conntrack_tcp_timeout_close_wait", .data = &ip_ct_tcp_timeout_close_wait, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK, .procname = "ip_conntrack_tcp_timeout_last_ack", .data = &ip_ct_tcp_timeout_last_ack, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT, .procname = "ip_conntrack_tcp_timeout_time_wait", .data = &ip_ct_tcp_timeout_time_wait, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE, .procname = "ip_conntrack_tcp_timeout_close", .data = &ip_ct_tcp_timeout_close, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT, .procname = "ip_conntrack_udp_timeout", .data = &ip_ct_udp_timeout, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM, .procname = "ip_conntrack_udp_timeout_stream", .data = &ip_ct_udp_timeout_stream, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT, .procname = "ip_conntrack_icmp_timeout", .data = &ip_ct_icmp_timeout, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT, .procname = "ip_conntrack_generic_timeout", .data = &ip_ct_generic_timeout, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_LOG_INVALID, .procname = "ip_conntrack_log_invalid", .data = &ip_ct_log_invalid, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS, .procname = "ip_conntrack_tcp_timeout_max_retrans", .data = &ip_ct_tcp_timeout_max_retrans, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_LOOSE, .procname = "ip_conntrack_tcp_loose", .data = &ip_ct_tcp_loose, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_BE_LIBERAL, .procname = "ip_conntrack_tcp_be_liberal", .data = &ip_ct_tcp_be_liberal, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_MAX_RETRANS, .procname = "ip_conntrack_tcp_max_retrans", .data = &ip_ct_tcp_max_retrans, .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = 0 }};#define NET_IP_CONNTRACK_MAX 2089static ctl_table ip_ct_netfilter_table[] = { { .ctl_name = NET_IPV4_NETFILTER, .procname = "netfilter", .mode = 0555, .child = ip_ct_sysctl_table, }, { .ctl_name = NET_IP_CONNTRACK_MAX, .procname = "ip_conntrack_max", .data = &ip_conntrack_max, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec }, { .ctl_name = 0 }};static ctl_table ip_ct_ipv4_table[] = { { .ctl_name = NET_IPV4, .procname = "ipv4", .mode = 0555, .child = ip_ct_netfilter_table, }, { .ctl_name = 0 }};static ctl_table ip_ct_net_table[] = { { .ctl_name = CTL_NET, .procname = "net", .mode = 0555, .child = ip_ct_ipv4_table, }, { .ctl_name = 0 }};EXPORT_SYMBOL(ip_ct_log_invalid);#endif /* CONFIG_SYSCTL */static int init_or_cleanup(int init){#ifdef CONFIG_PROC_FS struct proc_dir_entry *proc, *proc_exp, *proc_stat;#endif int ret = 0; if (!init) goto cleanup; ret = ip_conntrack_init(); if (ret < 0) goto cleanup_nothing;#ifdef CONFIG_PROC_FS ret = -ENOMEM; proc = proc_net_fops_create("ip_conntrack", 0440, &ct_file_ops); if (!proc) goto cleanup_init; proc_exp = proc_net_fops_create("ip_conntrack_expect", 0440, &exp_file_ops); if (!proc_exp) goto cleanup_proc; proc_stat = create_proc_entry("ip_conntrack", S_IRUGO, proc_net_stat); if (!proc_stat) goto cleanup_proc_exp; proc_stat->proc_fops = &ct_cpu_seq_fops; proc_stat->owner = THIS_MODULE;#endif ret = nf_register_hook(&ip_conntrack_defrag_ops); if (ret < 0) { printk("ip_conntrack: can't register pre-routing defrag hook.\n"); goto cleanup_proc_stat; } ret = nf_register_hook(&ip_conntrack_defrag_local_out_ops); if (ret < 0) { printk("ip_conntrack: can't register local_out defrag hook.\n"); goto cleanup_defragops; } ret = nf_register_hook(&ip_conntrack_in_ops); if (ret < 0) { printk("ip_conntrack: can't register pre-routing hook.\n"); goto cleanup_defraglocalops; } ret = nf_register_hook(&ip_conntrack_local_out_ops); if (ret < 0) { printk("ip_conntrack: can't register local out hook.\n"); goto cleanup_inops; } ret = nf_register_hook(&ip_conntrack_helper_in_ops); if (ret < 0) { printk("ip_conntrack: can't register local in helper hook.\n"); goto cleanup_inandlocalops; } ret = nf_register_hook(&ip_conntrack_helper_out_ops); if (ret < 0) { printk("ip_conntrack: can't register postrouting helper hook.\n"); goto cleanup_helperinops; } ret = nf_register_hook(&ip_conntrack_out_ops); if (ret < 0) { printk("ip_conntrack: can't register post-routing hook.\n"); goto cleanup_helperoutops; } ret = nf_register_hook(&ip_conntrack_local_in_ops); if (ret < 0) { printk("ip_conntrack: can't register local in hook.\n"); goto cleanup_inoutandlocalops; }#ifdef CONFIG_SYSCTL ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table, 0); if (ip_ct_sysctl_header == NULL) { printk("ip_conntrack: can't register to sysctl.\n"); ret = -ENOMEM; goto cleanup_localinops; }#endif return ret; cleanup: synchronize_net();#ifdef CONFIG_SYSCTL unregister_sysctl_table(ip_ct_sysctl_header); cleanup_localinops:#endif nf_unregister_hook(&ip_conntrack_local_in_ops); cleanup_inoutandlocalops: nf_unregister_hook(&ip_conntrack_out_ops); cleanup_helperoutops: nf_unregister_hook(&ip_conntrack_helper_out_ops); cleanup_helperinops: nf_unregister_hook(&ip_conntrack_helper_in_ops); cleanup_inandlocalops: nf_unregister_hook(&ip_conntrack_local_out_ops); cleanup_inops: nf_unregister_hook(&ip_conntrack_in_ops); cleanup_defraglocalops: nf_unregister_hook(&ip_conntrack_defrag_local_out_ops); cleanup_defragops: nf_unregister_hook(&ip_conntrack_defrag_ops); cleanup_proc_stat:#ifdef CONFIG_PROC_FS remove_proc_entry("ip_conntrack", proc_net_stat); cleanup_proc_exp: proc_net_remove("ip_conntrack_expect"); cleanup_proc: proc_net_remove("ip_conntrack"); cleanup_init:#endif /* CONFIG_PROC_FS */ ip_conntrack_cleanup(); cleanup_nothing: return ret;}/* FIXME: Allow NULL functions and sub in pointers to generic for them. --RR */int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto){ int ret = 0; write_lock_bh(&ip_conntrack_lock); if (ip_ct_protos[proto->proto] != &ip_conntrack_generic_protocol) { ret = -EBUSY; goto out; } ip_ct_protos[proto->proto] = proto; out: write_unlock_bh(&ip_conntrack_lock); return ret;}void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto){ write_lock_bh(&ip_conntrack_lock); ip_ct_protos[proto->proto] = &ip_conntrack_generic_protocol; write_unlock_bh(&ip_conntrack_lock); /* Somebody could be still looking at the proto in bh. */ synchronize_net(); /* Remove all contrack entries for this protocol */ ip_ct_iterate_cleanup(kill_proto, &proto->proto);}static int __init init(void){ return init_or_cleanup(1);}static void __exit fini(void){ init_or_cleanup(0);}module_init(init);module_exit(fini);/* Some modules need us, but don't depend directly on any symbol. They should call this. */void need_ip_conntrack(void){}#ifdef CONFIG_IP_NF_CONNTRACK_EVENTSEXPORT_SYMBOL_GPL(ip_conntrack_chain);EXPORT_SYMBOL_GPL(ip_conntrack_expect_chain);EXPORT_SYMBOL_GPL(ip_conntrack_register_notifier);EXPORT_SYMBOL_GPL(ip_conntrack_unregister_notifier);EXPORT_SYMBOL_GPL(__ip_ct_event_cache_init);EXPORT_PER_CPU_SYMBOL_GPL(ip_conntrack_ecache);#endifEXPORT_SYMBOL(ip_conntrack_protocol_register);EXPORT_SYMBOL(ip_conntrack_protocol_unregister);EXPORT_SYMBOL(ip_ct_get_tuple);EXPORT_SYMBOL(invert_tuplepr);EXPORT_SYMBOL(ip_conntrack_alter_reply);EXPORT_SYMBOL(ip_conntrack_destroyed);EXPORT_SYMBOL(need_ip_conntrack);EXPORT_SYMBOL(ip_conntrack_helper_register);EXPORT_SYMBOL(ip_conntrack_helper_unregister);EXPORT_SYMBOL(ip_ct_iterate_cleanup);EXPORT_SYMBOL(__ip_ct_refresh_acct);EXPORT_SYMBOL(ip_conntrack_expect_alloc);EXPORT_SYMBOL(ip_conntrack_expect_put);EXPORT_SYMBOL_GPL(__ip_conntrack_expect_find);EXPORT_SYMBOL_GPL(ip_conntrack_expect_find);EXPORT_SYMBOL(ip_conntrack_expect_related);EXPORT_SYMBOL(ip_conntrack_unexpect_related);EXPORT_SYMBOL_GPL(ip_conntrack_expect_list);EXPORT_SYMBOL_GPL(ip_ct_unlink_expect);EXPORT_SYMBOL(ip_conntrack_tuple_taken);EXPORT_SYMBOL(ip_ct_gather_frags);EXPORT_SYMBOL(ip_conntrack_htable_size);EXPORT_SYMBOL(ip_conntrack_lock);EXPORT_SYMBOL(ip_conntrack_hash);EXPORT_SYMBOL(ip_conntrack_untracked);EXPORT_SYMBOL_GPL(ip_conntrack_find_get);#ifdef CONFIG_IP_NF_NAT_NEEDEDEXPORT_SYMBOL(ip_conntrack_tcp_update);#endifEXPORT_SYMBOL_GPL(ip_conntrack_flush);EXPORT_SYMBOL_GPL(__ip_conntrack_find);EXPORT_SYMBOL_GPL(ip_conntrack_alloc);EXPORT_SYMBOL_GPL(ip_conntrack_free);EXPORT_SYMBOL_GPL(ip_conntrack_hash_insert);EXPORT_SYMBOL_GPL(ip_ct_remove_expectations);EXPORT_SYMBOL_GPL(ip_conntrack_helper_find_get);EXPORT_SYMBOL_GPL(ip_conntrack_helper_put);EXPORT_SYMBOL_GPL(__ip_conntrack_helper_find_byname);EXPORT_SYMBOL_GPL(ip_conntrack_proto_find_get);EXPORT_SYMBOL_GPL(ip_conntrack_proto_put);EXPORT_SYMBOL_GPL(__ip_conntrack_proto_find);#if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \ defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE)EXPORT_SYMBOL_GPL(ip_ct_port_tuple_to_nfattr);EXPORT_SYMBOL_GPL(ip_ct_port_nfattr_to_tuple);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -