1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* (C) 1999-2001 Paul `Rusty' Russell |
3 | * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org> |
4 | */ |
5 | |
6 | #include <linux/types.h> |
7 | #include <linux/jiffies.h> |
8 | #include <linux/timer.h> |
9 | #include <linux/netfilter.h> |
10 | #include <net/netfilter/nf_conntrack_l4proto.h> |
11 | #include <net/netfilter/nf_conntrack_timeout.h> |
12 | |
13 | static const unsigned int nf_ct_generic_timeout = 600*HZ; |
14 | |
15 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT |
16 | |
17 | #include <linux/netfilter/nfnetlink.h> |
18 | #include <linux/netfilter/nfnetlink_cttimeout.h> |
19 | |
20 | static int generic_timeout_nlattr_to_obj(struct nlattr *tb[], |
21 | struct net *net, void *data) |
22 | { |
23 | struct nf_generic_net *gn = nf_generic_pernet(net); |
24 | unsigned int *timeout = data; |
25 | |
26 | if (!timeout) |
27 | timeout = &gn->timeout; |
28 | |
29 | if (tb[CTA_TIMEOUT_GENERIC_TIMEOUT]) |
30 | *timeout = |
31 | ntohl(nla_get_be32(tb[CTA_TIMEOUT_GENERIC_TIMEOUT])) * HZ; |
32 | else { |
33 | /* Set default generic timeout. */ |
34 | *timeout = gn->timeout; |
35 | } |
36 | |
37 | return 0; |
38 | } |
39 | |
40 | static int |
41 | generic_timeout_obj_to_nlattr(struct sk_buff *skb, const void *data) |
42 | { |
43 | const unsigned int *timeout = data; |
44 | |
45 | if (nla_put_be32(skb, attrtype: CTA_TIMEOUT_GENERIC_TIMEOUT, htonl(*timeout / HZ))) |
46 | goto nla_put_failure; |
47 | |
48 | return 0; |
49 | |
50 | nla_put_failure: |
51 | return -ENOSPC; |
52 | } |
53 | |
54 | static const struct nla_policy |
55 | generic_timeout_nla_policy[CTA_TIMEOUT_GENERIC_MAX+1] = { |
56 | [CTA_TIMEOUT_GENERIC_TIMEOUT] = { .type = NLA_U32 }, |
57 | }; |
58 | #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ |
59 | |
60 | void nf_conntrack_generic_init_net(struct net *net) |
61 | { |
62 | struct nf_generic_net *gn = nf_generic_pernet(net); |
63 | |
64 | gn->timeout = nf_ct_generic_timeout; |
65 | } |
66 | |
67 | const struct nf_conntrack_l4proto nf_conntrack_l4proto_generic = |
68 | { |
69 | .l4proto = 255, |
70 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT |
71 | .ctnl_timeout = { |
72 | .nlattr_to_obj = generic_timeout_nlattr_to_obj, |
73 | .obj_to_nlattr = generic_timeout_obj_to_nlattr, |
74 | .nlattr_max = CTA_TIMEOUT_GENERIC_MAX, |
75 | .obj_size = sizeof(unsigned int), |
76 | .nla_policy = generic_timeout_nla_policy, |
77 | }, |
78 | #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ |
79 | }; |
80 | |