Merge tag 'perf-tools-fixes-for-v6.4-1-2023-05-20' of git://git.kernel.org/pub/scm...
[linux-block.git] / net / netfilter / nf_nat_tftp.c
CommitLineData
d2912cb1 1// SPDX-License-Identifier: GPL-2.0-only
a536df35 2/* (C) 2001-2002 Magnus Boden <mb@ozaba.mine.nu>
a536df35
PM
3 */
4
5#include <linux/module.h>
a536df35
PM
6#include <linux/udp.h>
7
a536df35
PM
8#include <net/netfilter/nf_conntrack_helper.h>
9#include <net/netfilter/nf_conntrack_expect.h>
1afc5679 10#include <net/netfilter/nf_nat_helper.h>
a536df35
PM
11#include <linux/netfilter/nf_conntrack_tftp.h>
12
53b11308
FL
13#define NAT_HELPER_NAME "tftp"
14
a536df35
PM
15MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>");
16MODULE_DESCRIPTION("TFTP NAT helper");
17MODULE_LICENSE("GPL");
53b11308
FL
18MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
19
20static struct nf_conntrack_nat_helper nat_helper_tftp =
21 NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
a536df35 22
3db05fea 23static unsigned int help(struct sk_buff *skb,
a536df35
PM
24 enum ip_conntrack_info ctinfo,
25 struct nf_conntrack_expect *exp)
26{
de24b4eb 27 const struct nf_conn *ct = exp->master;
a536df35
PM
28
29 exp->saved_proto.udp.port
30 = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.udp.port;
31 exp->dir = IP_CT_DIR_REPLY;
32 exp->expectfn = nf_nat_follow_master;
3c00fb0b 33 if (nf_ct_expect_related(exp, 0) != 0) {
b20ab9cc 34 nf_ct_helper_log(skb, exp->master, "cannot add expectation");
a536df35 35 return NF_DROP;
b20ab9cc 36 }
a536df35
PM
37 return NF_ACCEPT;
38}
39
40static void __exit nf_nat_tftp_fini(void)
41{
53b11308 42 nf_nat_helper_unregister(&nat_helper_tftp);
a9b3cd7f 43 RCU_INIT_POINTER(nf_nat_tftp_hook, NULL);
a536df35
PM
44 synchronize_rcu();
45}
46
47static int __init nf_nat_tftp_init(void)
48{
d1332e0a 49 BUG_ON(nf_nat_tftp_hook != NULL);
53b11308 50 nf_nat_helper_register(&nat_helper_tftp);
a9b3cd7f 51 RCU_INIT_POINTER(nf_nat_tftp_hook, help);
a536df35
PM
52 return 0;
53}
54
55module_init(nf_nat_tftp_init);
56module_exit(nf_nat_tftp_fini);