1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2320ff567SPablo Neira Ayuso /* (C) 2001-2002 Magnus Boden <mb@ozaba.mine.nu> 3320ff567SPablo Neira Ayuso */ 4320ff567SPablo Neira Ayuso 5320ff567SPablo Neira Ayuso #include <linux/module.h> 6320ff567SPablo Neira Ayuso #include <linux/udp.h> 7320ff567SPablo Neira Ayuso 8320ff567SPablo Neira Ayuso #include <net/netfilter/nf_conntrack_helper.h> 9320ff567SPablo Neira Ayuso #include <net/netfilter/nf_conntrack_expect.h> 10320ff567SPablo Neira Ayuso #include <net/netfilter/nf_nat_helper.h> 11320ff567SPablo Neira Ayuso #include <linux/netfilter/nf_conntrack_tftp.h> 12320ff567SPablo Neira Ayuso 1353b11308SFlavio Leitner #define NAT_HELPER_NAME "tftp" 1453b11308SFlavio Leitner 15320ff567SPablo Neira Ayuso MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>"); 16320ff567SPablo Neira Ayuso MODULE_DESCRIPTION("TFTP NAT helper"); 17320ff567SPablo Neira Ayuso MODULE_LICENSE("GPL"); 1853b11308SFlavio Leitner MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME); 1953b11308SFlavio Leitner 2053b11308SFlavio Leitner static struct nf_conntrack_nat_helper nat_helper_tftp = 2153b11308SFlavio Leitner NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME); 22320ff567SPablo Neira Ayuso help(struct sk_buff * skb,enum ip_conntrack_info ctinfo,struct nf_conntrack_expect * exp)23320ff567SPablo Neira Ayusostatic unsigned int help(struct sk_buff *skb, 24320ff567SPablo Neira Ayuso enum ip_conntrack_info ctinfo, 25320ff567SPablo Neira Ayuso struct nf_conntrack_expect *exp) 26320ff567SPablo Neira Ayuso { 27320ff567SPablo Neira Ayuso const struct nf_conn *ct = exp->master; 28320ff567SPablo Neira Ayuso 29320ff567SPablo Neira Ayuso exp->saved_proto.udp.port 30320ff567SPablo Neira Ayuso = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port; 31320ff567SPablo Neira Ayuso exp->dir = IP_CT_DIR_REPLY; 32320ff567SPablo Neira Ayuso exp->expectfn = nf_nat_follow_master; 333c00fb0bSxiao ruizhu if (nf_ct_expect_related(exp, 0) != 0) { 34b20ab9ccSPablo Neira Ayuso nf_ct_helper_log(skb, exp->master, "cannot add expectation"); 35320ff567SPablo Neira Ayuso return NF_DROP; 36b20ab9ccSPablo Neira Ayuso } 37320ff567SPablo Neira Ayuso return NF_ACCEPT; 38320ff567SPablo Neira Ayuso } 39320ff567SPablo Neira Ayuso nf_nat_tftp_fini(void)40320ff567SPablo Neira Ayusostatic void __exit nf_nat_tftp_fini(void) 41320ff567SPablo Neira Ayuso { 4253b11308SFlavio Leitner nf_nat_helper_unregister(&nat_helper_tftp); 43320ff567SPablo Neira Ayuso RCU_INIT_POINTER(nf_nat_tftp_hook, NULL); 44320ff567SPablo Neira Ayuso synchronize_rcu(); 45320ff567SPablo Neira Ayuso } 46320ff567SPablo Neira Ayuso nf_nat_tftp_init(void)47320ff567SPablo Neira Ayusostatic int __init nf_nat_tftp_init(void) 48320ff567SPablo Neira Ayuso { 49320ff567SPablo Neira Ayuso BUG_ON(nf_nat_tftp_hook != NULL); 5053b11308SFlavio Leitner nf_nat_helper_register(&nat_helper_tftp); 51320ff567SPablo Neira Ayuso RCU_INIT_POINTER(nf_nat_tftp_hook, help); 52320ff567SPablo Neira Ayuso return 0; 53320ff567SPablo Neira Ayuso } 54320ff567SPablo Neira Ayuso 55320ff567SPablo Neira Ayuso module_init(nf_nat_tftp_init); 56320ff567SPablo Neira Ayuso module_exit(nf_nat_tftp_fini); 57