1320ff567SPablo Neira Ayuso /* (C) 2001-2002 Magnus Boden <mb@ozaba.mine.nu> 2320ff567SPablo Neira Ayuso * 3320ff567SPablo Neira Ayuso * This program is free software; you can redistribute it and/or modify 4320ff567SPablo Neira Ayuso * it under the terms of the GNU General Public License version 2 as 5320ff567SPablo Neira Ayuso * published by the Free Software Foundation. 6320ff567SPablo Neira Ayuso */ 7320ff567SPablo Neira Ayuso 8320ff567SPablo Neira Ayuso #include <linux/module.h> 9320ff567SPablo Neira Ayuso #include <linux/udp.h> 10320ff567SPablo Neira Ayuso 11320ff567SPablo Neira Ayuso #include <net/netfilter/nf_conntrack_helper.h> 12320ff567SPablo Neira Ayuso #include <net/netfilter/nf_conntrack_expect.h> 13320ff567SPablo Neira Ayuso #include <net/netfilter/nf_nat_helper.h> 14320ff567SPablo Neira Ayuso #include <linux/netfilter/nf_conntrack_tftp.h> 15320ff567SPablo Neira Ayuso 16320ff567SPablo Neira Ayuso MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>"); 17320ff567SPablo Neira Ayuso MODULE_DESCRIPTION("TFTP NAT helper"); 18320ff567SPablo Neira Ayuso MODULE_LICENSE("GPL"); 19320ff567SPablo Neira Ayuso MODULE_ALIAS("ip_nat_tftp"); 20320ff567SPablo Neira Ayuso 21320ff567SPablo Neira Ayuso static unsigned int help(struct sk_buff *skb, 22320ff567SPablo Neira Ayuso enum ip_conntrack_info ctinfo, 23320ff567SPablo Neira Ayuso struct nf_conntrack_expect *exp) 24320ff567SPablo Neira Ayuso { 25320ff567SPablo Neira Ayuso const struct nf_conn *ct = exp->master; 26320ff567SPablo Neira Ayuso 27320ff567SPablo Neira Ayuso exp->saved_proto.udp.port 28320ff567SPablo Neira Ayuso = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port; 29320ff567SPablo Neira Ayuso exp->dir = IP_CT_DIR_REPLY; 30320ff567SPablo Neira Ayuso exp->expectfn = nf_nat_follow_master; 31b20ab9ccSPablo Neira Ayuso if (nf_ct_expect_related(exp) != 0) { 32b20ab9ccSPablo Neira Ayuso nf_ct_helper_log(skb, exp->master, "cannot add expectation"); 33320ff567SPablo Neira Ayuso return NF_DROP; 34b20ab9ccSPablo Neira Ayuso } 35320ff567SPablo Neira Ayuso return NF_ACCEPT; 36320ff567SPablo Neira Ayuso } 37320ff567SPablo Neira Ayuso 38320ff567SPablo Neira Ayuso static void __exit nf_nat_tftp_fini(void) 39320ff567SPablo Neira Ayuso { 40320ff567SPablo Neira Ayuso RCU_INIT_POINTER(nf_nat_tftp_hook, NULL); 41320ff567SPablo Neira Ayuso synchronize_rcu(); 42320ff567SPablo Neira Ayuso } 43320ff567SPablo Neira Ayuso 44320ff567SPablo Neira Ayuso static int __init nf_nat_tftp_init(void) 45320ff567SPablo Neira Ayuso { 46320ff567SPablo Neira Ayuso BUG_ON(nf_nat_tftp_hook != NULL); 47320ff567SPablo Neira Ayuso RCU_INIT_POINTER(nf_nat_tftp_hook, help); 48320ff567SPablo Neira Ayuso return 0; 49320ff567SPablo Neira Ayuso } 50320ff567SPablo Neira Ayuso 51320ff567SPablo Neira Ayuso module_init(nf_nat_tftp_init); 52320ff567SPablo Neira Ayuso module_exit(nf_nat_tftp_fini); 53