diff options
Diffstat (limited to 'net/netfilter/nf_conntrack_proto_generic.c')
-rw-r--r-- | net/netfilter/nf_conntrack_proto_generic.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/net/netfilter/nf_conntrack_proto_generic.c b/net/netfilter/nf_conntrack_proto_generic.c index 0e6c5451db8..835e24c58f0 100644 --- a/net/netfilter/nf_conntrack_proto_generic.c +++ b/net/netfilter/nf_conntrack_proto_generic.c | |||
@@ -65,6 +65,45 @@ static bool generic_new(struct nf_conn *ct, const struct sk_buff *skb, | |||
65 | return true; | 65 | return true; |
66 | } | 66 | } |
67 | 67 | ||
68 | #if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT) | ||
69 | |||
70 | #include <linux/netfilter/nfnetlink.h> | ||
71 | #include <linux/netfilter/nfnetlink_cttimeout.h> | ||
72 | |||
73 | static int generic_timeout_nlattr_to_obj(struct nlattr *tb[], void *data) | ||
74 | { | ||
75 | unsigned int *timeout = data; | ||
76 | |||
77 | if (tb[CTA_TIMEOUT_GENERIC_TIMEOUT]) | ||
78 | *timeout = | ||
79 | ntohl(nla_get_be32(tb[CTA_TIMEOUT_GENERIC_TIMEOUT])) * HZ; | ||
80 | else { | ||
81 | /* Set default generic timeout. */ | ||
82 | *timeout = nf_ct_generic_timeout; | ||
83 | } | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | static int | ||
89 | generic_timeout_obj_to_nlattr(struct sk_buff *skb, const void *data) | ||
90 | { | ||
91 | const unsigned int *timeout = data; | ||
92 | |||
93 | NLA_PUT_BE32(skb, CTA_TIMEOUT_GENERIC_TIMEOUT, htonl(*timeout / HZ)); | ||
94 | |||
95 | return 0; | ||
96 | |||
97 | nla_put_failure: | ||
98 | return -ENOSPC; | ||
99 | } | ||
100 | |||
101 | static const struct nla_policy | ||
102 | generic_timeout_nla_policy[CTA_TIMEOUT_GENERIC_MAX+1] = { | ||
103 | [CTA_TIMEOUT_GENERIC_TIMEOUT] = { .type = NLA_U32 }, | ||
104 | }; | ||
105 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | ||
106 | |||
68 | #ifdef CONFIG_SYSCTL | 107 | #ifdef CONFIG_SYSCTL |
69 | static struct ctl_table_header *generic_sysctl_header; | 108 | static struct ctl_table_header *generic_sysctl_header; |
70 | static struct ctl_table generic_sysctl_table[] = { | 109 | static struct ctl_table generic_sysctl_table[] = { |
@@ -102,6 +141,15 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_generic __read_mostly = | |||
102 | .packet = generic_packet, | 141 | .packet = generic_packet, |
103 | .get_timeouts = generic_get_timeouts, | 142 | .get_timeouts = generic_get_timeouts, |
104 | .new = generic_new, | 143 | .new = generic_new, |
144 | #if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT) | ||
145 | .ctnl_timeout = { | ||
146 | .nlattr_to_obj = generic_timeout_nlattr_to_obj, | ||
147 | .obj_to_nlattr = generic_timeout_obj_to_nlattr, | ||
148 | .nlattr_max = CTA_TIMEOUT_GENERIC_MAX, | ||
149 | .obj_size = sizeof(unsigned int), | ||
150 | .nla_policy = generic_timeout_nla_policy, | ||
151 | }, | ||
152 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | ||
105 | #ifdef CONFIG_SYSCTL | 153 | #ifdef CONFIG_SYSCTL |
106 | .ctl_table_header = &generic_sysctl_header, | 154 | .ctl_table_header = &generic_sysctl_header, |
107 | .ctl_table = generic_sysctl_table, | 155 | .ctl_table = generic_sysctl_table, |