1/* (C) 2001-2002 Magnus Boden <mb@ozaba.mine.nu> 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License version 2 as 5 * published by the Free Software Foundation. 6 */ 7 8#include <linux/module.h> 9#include <linux/udp.h> 10 11#include <net/netfilter/nf_conntrack_helper.h> 12#include <net/netfilter/nf_conntrack_expect.h> 13#include <net/netfilter/nf_nat_helper.h> 14#include <linux/netfilter/nf_conntrack_tftp.h> 15 16MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>"); 17MODULE_DESCRIPTION("TFTP NAT helper"); 18MODULE_LICENSE("GPL"); 19MODULE_ALIAS("ip_nat_tftp"); 20 21static unsigned int help(struct sk_buff *skb, 22 enum ip_conntrack_info ctinfo, 23 struct nf_conntrack_expect *exp) 24{ 25 const struct nf_conn *ct = exp->master; 26 27 exp->saved_proto.udp.port 28 = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port; 29 exp->dir = IP_CT_DIR_REPLY; 30 exp->expectfn = nf_nat_follow_master; 31 if (nf_ct_expect_related(exp) != 0) { 32 nf_ct_helper_log(skb, exp->master, "cannot add expectation"); 33 return NF_DROP; 34 } 35 return NF_ACCEPT; 36} 37 38static void __exit nf_nat_tftp_fini(void) 39{ 40 RCU_INIT_POINTER(nf_nat_tftp_hook, NULL); 41 synchronize_rcu(); 42} 43 44static int __init nf_nat_tftp_init(void) 45{ 46 BUG_ON(nf_nat_tftp_hook != NULL); 47 RCU_INIT_POINTER(nf_nat_tftp_hook, help); 48 return 0; 49} 50 51module_init(nf_nat_tftp_init); 52module_exit(nf_nat_tftp_fini); 53