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